AWS費用を30%削減する実践的な5つの施策

AWSの料金が予想以上に高くなる主な原因は、未使用リソースの放置、不適切なインスタンスサイズ、データ転送料金の見落としです。本記事では、実際のプロジェクトで即座に導入できる5つの具体的な削減方法を紹介します。

AWS料金が高くなる3つの隠れた原因

AWSのコスト増加は、単なる使用量の増加だけが理由ではありません。多くの企業が見落としている要因があります。

1. 停止していないEC2インスタンスの蓄積

開発環境や検証用のEC2インスタンスが、使用終了後も起動したままになっているケースが頻繁に発生します。月額数千円~数万円の無駄が積み重なります。

2. 過剰にプロビジョニングされたRDSインスタンス

ピーク時に対応するため、必要以上に大きなインスタンスタイプを選択していることが多いです。実際の平均負荷は5割以下という事例も珍しくありません。

3. 不正確なデータ転送料金の計算

AWSのデータ転送(特にリージョン間やインターネット向けの転送)は、想定より高額になります。設計段階で見落とされやすいコスト要因です。

今すぐ実装できる5つの削減施策

施策1: AWS Cost Explorerで「見える化」する

削減の第一歩は、現状の把握です。AWS Cost Explorerを使用して、どのサービスにいくら使われているか、日次の推移を確認してください。

実装手順:

  1. AWSマネジメントコンソールにログイン
  2. 「Cost Management」→「Cost Explorer」を選択
  3. 「Dimension」から「Service」を選択し、サービス別コスト分析
  4. 「Granularity」を「Daily」に設定して日別推移を確認

この作業により、コスト全体の70~80%を占める上位3~5のサービスが特定できます。その後、それらのサービスに焦点を当てた削減策を立案します。

施策2: 未使用EC2インスタンスをスケジュール管理で自動停止

開発環境や検証環境は、営業時間外・休日は不要です。AWS Systems ManagerとEventBridgeを組み合わせて、自動的に停止・起動するスケジュールを設定します。

実装例(EventBridge + Lambda):

// Lambda関数:EC2インスタンスを停止するコード
import boto3
from datetime import datetime

ec2_client = boto3.client('ec2', region_name='ap-northeast-1')

def lambda_handler(event, context):
    # 特定のタグを持つインスタンスを停止
    instances = ec2_client.describe_instances(
        Filters=[
            {'Name': 'tag:Environment', 'Values': ['development']},
            {'Name': 'instance-state-name', 'Values': ['running']}
        ]
    )
    
    instance_ids = []
    for reservation in instances['Reservations']:
        for instance in reservation['Instances']:
            instance_ids.append(instance['InstanceId'])
    
    if instance_ids:
        ec2_client.stop_instances(InstanceIds=instance_ids)
        print(f"Stopped instances: {instance_ids}")
    
    return {
        'statusCode': 200,
        'body': f'Stopped {len(instance_ids)} instances'
    }

EventBridgeでスケジュール設定:

  • 平日の営業終了時(18:00)に停止: cron(0 18 ? * MON-FRI *)
  • 平日の営業開始時(09:00)に起動: cron(0 9 ? * MON-FRI *)
  • 土日祝日は終日停止

効果:開発環境インスタンスで月額5,000~30,000円の削減が期待できます。

施策3: RDSに予約インスタンス(Reserved Instance)を適用

1年以上継続稼働するRDSインスタンスに対して、予約インスタンスを購入することで、オンデマンド料金比で30~70%の削減が可能です。

判定方法:

  • RIを購入すべき:本番環境のデータベース(24/7稼働)
  • RIを購入すべきでない:ステージング環境、テスト環境、試験的なワークロード

実装例(AWS CLI):

// RDSの予約インスタンスを1年間購入(db.t3.small)
aws rds purchase-reserved-db-instances-offering \
  --reserved-db-instances-offering-id 438012d3-4765-4i9f-ab9b-a1d330example \
  --reserved-db-instance-id my-reserved-mysql-db \
  --region ap-northeast-1

// 利用可能なオファリングを確認
aws rds describe-reserved-db-instances-offerings \
  --db-instance-class db.t3.small \
  --engine mysql \
  --duration 31536000 \
  --region ap-northeast-1

効果:db.t3.smallのMySQLインスタンスの場合、月額3,000円程度の削減。

施策4: NAT Gatewayの使用回避とVPC Endpointの活用

NAT Gatewayは、処理時間とデータ転送量に対して別途料金が発生します。月額3,000~10,000円程度のコストになることもあります。

削減策:

  • S3へのアクセス:Gateway VPC Endpointを使用(無料)
  • DynamoDB、SQS、SNSへのアクセス:Interface VPC Endpointを検討
  • その他のAWSサービス:同一VPC内での通信に設計変更

実装例(Gateway VPC Endpoint for S3):

// CloudFormationでGateway VPC Endpointを作成
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  S3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: vpc-12345678
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
      RouteTableIds:
        - rtb-12345678
      PolicyText:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal: '*'
            Action: 's3:*'
            Resource: '*'

効果:月額3,000~8,000円のNAT Gateway料金削減。

施策5: CloudFrontでオリジンへのデータ転送を削減

CloudFrontを導入すると、静的コンテンツはエッジロケーションから配信されるため、オリジン(EC2やS3)への負荷が減少し、データ転送料金が低下します。

料金比較(1GB当たり):

  • CloudFront out: $0.085/GB
  • EC2→Internet out: $0.14/GB
  • 削減効果: 約40%

実装例(CloudFront Distribution):

// AWS CLIでCloudFront Distributionを作成
aws cloudfront create-distribution \
  --distribution-config '{
    "CallerReference": "my-app-2024-01",
    "DefaultRootObject": "index.html",
    "Origins": {
      "Quantity": 1,
      "Items": [
        {
          "Id": "my-s3-origin",
          "DomainName": "my-bucket.s3.ap-northeast-1.amazonaws.com",
          "S3OriginConfig": {
            "OriginAccessIdentity": ""
          }
        }
      ]
    },
    "DefaultCacheBehavior": {
      "TargetOriginId": "my-s3-origin",
      "ViewerProtocolPolicy": "redirect-to-https",
      "TrustedSigners": {
        "Enabled": false,
        "Quantity": 0
      },
      "MinTTL": 0,
      "ForwardedValues": {
        "QueryString": false,
        "Cookies": {"Forward": "none"}
      }
    },
    "Enabled": true
  }' \
  --region us-east-1

効果:データ転送料金が月額10,000~50,000円削減される案件も多いです。

ハマりやすいポイントと解決策

予約インスタンス購入前に必ずコミットメントを確認

RIやSavings Plansは購入後の変更・払い戻しが限定的です。AWS Cost Anomaly Detectionで3~6ヶ月の使用パターンを確認してから購入してください。

CloudWatchでアラートを設定

施策を導入した後も、予期しない料金上昇を早期に検知する必要があります。

// CloudWatchで月額予算超過時にアラーム
aws cloudwatch put-metric-alarm \
  --alarm-name aws-monthly-bill-alert \
  --alarm-description "Alert when AWS bill exceeds $1000" \
  --metric-name EstimatedCharges \
  --namespace AWS/Billing \
  --statistic Maximum \
  --period 86400 \
  --threshold 1000 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:billing-alerts

オートスケーリングの過度な設定に注意

Auto Scaling Groupの最大キャパシティを高く設定すると、スケールアウト時に予期しない料金増加が発生します。アプリケーションテストで負荷試験を実施し、適切なMax/Min値を決定してください。

複数環境での一括管理:AWS Organizations

複数のAWSアカウントを運用している場合、AWS Organizationsの統合請求を活用することで、全アカウント間のリザーブドインスタンスやSavings Plansを相互利用でき、追加の削減効果が期待できます。

設定手順:

  1. Organizations > Billing > Consolidation → Consolidate billing account有効化
  2. 各メンバーアカウントからの招待を承認
  3. Cost Explorerでアカウント別コスト分析を開始

よくある質問

A: Cost Explorerは日次で更新されるため、施策導入から翌営業日には効果を確認できます。ただし、RIやSavings Plansは購入月から適用されるため、購入タイミングで効果の出始める日が決まります。最初の月は日割り計算となるケースが多いです。

A: AWSマネジメントコンソール > Billing Dashboard > Free Tier から、各サービスの無料枠利用状況が確認できます。また、AWS Cost AnomalyDetectionで「無料枠超過予測」をオンにすると、超過前にメール通知されます。

A: AWS Reserved Instance Marketplaceで売却するか、購入から30日以内であれば払い戻しが可能です(ただし払い戻し手数料が発生する場合があります)。購入前にこの制度を理解し、必ず試験運用期間を設けてください。

まとめ

  • Cost Explorerで現状把握:削減の第一歩は、どこにコストが集中しているかの可視化です。サービス別、日別の推移を必ず確認してください。
  • 自動停止スケジュール設定:開発環境・検
K
AWS・Python・生成AIを専門とするソフトウェアエンジニア。AI・クラウド・開発ワークフローの実践ガイドを執筆しています。詳しく見る →