クラウドサービスの代表格であるAWSは、個人開発者やスタートアップにとって強力な環境を提供してくれますが、その一方で「予期せぬ高額請求」という悪夢に悩まされる人も少なくありません。この記事では、AWSアカウントを作成した後、すぐに行うべき請求対策の具体的な手順を詳細に解説します。
初めに:AWSの課金の仕組みを理解する
AWSの基本的な課金原則を理解することが重要です:
- 従量課金制:使った分だけ支払う
- 時間単位/秒単位の請求:多くのサービスは秒単位で課金される
- リージョンごとに異なる料金:東京リージョンと米国リージョンでは価格が異なる
- データ転送料金:AWSからインターネットへのデータ転送には料金が発生する
- 無料利用枠があっても監視は必須:上限を超えると自動的に課金される
無料利用枠の正確な把握
AWSの無料利用枠は3つのカテゴリに分かれています:
1. 12ヶ月間無料
- EC2: t2.micro または t3.micro インスタンス(リージョンによる)を月に750時間まで
- S3: 5GBのスタンダードストレージ + 20,000件のGet リクエスト + 2,000件のPut リクエスト
- RDS: 750時間の db.t2.micro データベース使用 + 20GBのストレージ
- CloudFront: 毎月50GBのデータ転送
2. 常に無料
- Lambda: 毎月100万回の関数リクエスト + 400,000 GB秒のコンピューティング時間
- DynamoDB: 25GBのストレージ
- SNS: 1,000件の発行、100万件のモバイルプッシュ通知
- CloudWatch: 10個のカスタムメトリクス + 10個のアラーム
3. 短期無料トライアル
- 各サービスによって異なるため、使用前に必ず確認
無料利用枠の詳細と最新情報はAWS公式サイトで確認できます。
AWS請求アラートの設定(詳細手順)
請求額が一定のしきい値を超えたときに通知を受け取るための設定です。
事前準備:請求アラート受信を有効化
- AWSマネジメントコンソールにログイン
- 右上のアカウント名をクリック → 「アカウント」を選択
- 「請求設定を編集」セクションを探す
- 「無料利用枠使用アラート」と「請求アラートを受信する」の両方にチェックを入れる
- 通知を受け取るメールアドレスを確認・更新
- 「設定の保存」をクリック
CloudWatchによる請求アラームの作成
- 請求情報は米国東部(バージニア北部)リージョンでのみ利用可能なため、コンソールのリージョンを「US East (N. Virginia)」に変更
- 「CloudWatch」サービスを選択
- 左側のメニューから「アラーム」→「すべてのアラーム」→「アラームの作成」をクリック
- 「メトリクスの選択」をクリック
- 「請求」→「通貨別の予想請求額」を選択
- 「EstimatedCharges」メトリクスの横にあるチェックボックスを選択し、「メトリクスの選択」をクリック
- アラームのしきい値を設定:
- 統計:最大
- 期間:6時間
- しきい値タイプ:静的
- アラーム条件:次の時… より大きい
- しきい値:5(最初は低めに設定し、必要に応じて調整)
- 「次へ」をクリック
- 「アクションの設定」画面で「アラーム状態のトリガー時」を選択
- 「SNSトピックの作成」を選択し、トピック名を入力(例:「BillingAlert」)
- 通知を受け取るメールアドレスを入力し、「トピックの作成」をクリック
- メールの確認(SNSトピックのサブスクリプション確認メールが届くので、リンクをクリックして確認)
- 「次へ」をクリック
- アラーム名と説明を入力:
- 名前:例「5ドル超過警告」
- 説明:「予想請求額が5ドルを超えた場合に通知する」
- 「次へ」→「アラームの作成」をクリック
AWS Budgetsによる予算管理(詳細手順)
予算を設定し、使用状況を計画的に管理するためのツールです。
AWS Budgetsの設定手順
- AWSマネジメントコンソールから「Billing and Cost Management」を選択
- 左側のメニューから「Budgets」を選択
- 「予算の作成」をクリック
- 「予算タイプを選択」で「コスト予算」を選択し、「次へ」をクリック
- 予算の詳細を設定:
- 名前:「月次予算」など
- 期間:「定期」を選択し、「月次」を選択
- 更新日:毎月の最初の日
- 予算の開始時期:現在の月
- フィルタリング(オプション):
- 特定のサービスや地域に限定した予算を設定したい場合は、適切なフィルターを追加
- 予算金額を設定:
- 「予算金額を設定」で「固定」を選択
- 金額:20(ドル)など、適切な予算額を設定
- 「次へ」をクリック
- アラートしきい値の設定:
- 「アラートしきい値を追加」をクリック
- しきい値:80(パーセント)
- トリガー:「実際」(実際のコストが予算の80%に達したとき)
- メールによる通知:自分のメールアドレスを入力
- さらにしきい値を追加(オプション):
- 100%のしきい値も追加しておくと良い
- 「次へ」→「予算の作成」をクリック
高度な予算機能(オプション)
- 使用量予算:EC2インスタンス時間やS3ストレージなど特定のリソースの使用量を監視
- 予約予算:予約インスタンスの使用状況を追跡
- 節約プラン予算:節約プランの使用率と適用範囲を監視
IAM設定による安全なアカウント管理
ルートアカウントの保護
- 強力なパスワードの設定:
- AWSマネジメントコンソールにログイン
- 右上のアカウント名 → 「セキュリティ認証情報」→ 「パスワードを変更」
- 長く複雑なパスワードを設定(最低16文字以上推奨)
- MFA(多要素認証)の有効化:
- 「セキュリティ認証情報」ページ
- 「Multi-Factor Authentication (MFA)」セクション → 「MFAを有効化」
- デバイスタイプを選択(仮想MFAアプリケーション推奨)
- 指示に従ってQRコードをスキャンし、連続する2つの認証コードを入力
IAM管理者ユーザーの作成
- AWSマネジメントコンソールで「IAM」サービスを選択
- 「ユーザー」→「ユーザーを追加」をクリック
- ユーザー名を入力(例:「Admin」)
- 「AWS Management Console へのアクセス」にチェック
- パスワードオプションを選択し、「次へ」
- 「既存のポリシーを直接アタッチ」を選択
- 「AdministratorAccess」にチェック(注意:本番環境では最小限の権限を付与)
- 「次へ」→「ユーザーの作成」
IAMユーザーのMFA設定
- 作成したIAMユーザーでログイン
- 「IAM」→「ユーザー」→ ユーザー名をクリック
- 「セキュリティ認証情報」タブ
- 「割り当て済みのMFAデバイス」セクションで「管理」
- 「仮想MFAデバイス」を選択し、手順に従って設定
IAMアクセスアナライザーの設定
- IAMコンソールから「アクセスアナライザー」を選択
- 「アナライザーを作成」をクリック
- 分析タイプとして「外部アクセス」を選択
- アナライザー名を入力し、「アナライザーを作成」をクリック
AWS Cost Explorerによるコスト分析
Cost Explorerの有効化
- AWSマネジメントコンソールから「Billing and Cost Management」を選択
- 左側のメニューから「Cost Explorer」をクリック
- 「Cost Explorerを有効化」をクリック(有効化には最大24時間かかる場合がある)
効果的な使用方法
- 日別・月別のコスト分析:
- グラフ表示で「日別」または「月別」を選択
- 特定期間を指定して傾向を確認
- サービス別のコスト分析:
- 「グループ化」を「サービス」に設定
- どのサービスが最もコストを消費しているか把握
- リージョン別の分析:
- 「グループ化」を「リージョン」に設定
- 使用していないはずのリージョンで料金が発生していないか確認
- タグによるコスト分析:
- リソースにタグを付け、プロジェクト別にコストを把握
- 「グループ化」を「タグ」に設定
- 予測機能の活用:
- 「予測」を有効にして将来のコスト予測を確認
- 予算計画に役立てる
リソース管理のベストプラクティス
EC2インスタンス管理
- 未使用インスタンスの特定:
- EC2ダッシュボードでインスタンスの状態を確認
- CloudWatchメトリクスでCPU使用率が低いインスタンスを特定
- スケジューリングによる自動停止/起動:
- 開発環境の夜間・週末自動停止の設定
- AWS Lambda + CloudWatch Eventsで自動化
- 適切なインスタンスサイジング:
- AWS Compute Optimizerを活用して適切なインスタンスタイプを選択
- 低使用率のインスタンスはダウンサイジング
ストレージコスト管理
- EBSボリューム:
- 未使用のEBSボリュームを定期的に確認・削除
- 手順:EC2ダッシュボード → ボリューム → フィルターで「利用可能」状態のものを検索
- S3バケット:
- ライフサイクルルールの設定:
- S3コンソールでバケットを選択
- 「管理」タブ → 「ライフサイクルルール」→ 「ルールを作成」
- 古いバージョンやログファイルを自動的に低コストストレージクラスに移行またはデータを削除
- ライフサイクルルールの設定:
- スナップショット:
- 古いEBSスナップショットを定期的に削除
- 手順:EC2ダッシュボード → スナップショット → 日付でソートし古いものを選択 → 削除
ネットワークコスト削減
- データ転送の最適化:
- 同じリージョン内でのリソース配置(リージョン間データ転送には料金発生)
- CloudFrontの活用(大量のデータ配信の場合)
- Elastic IP管理:
- 未使用のElastic IPを削除(アタッチされていないIPには料金発生)
- 手順:EC2ダッシュボード → Elastic IP → 状態が「関連付けられていない」のものを確認・解放
自動シャットダウンスクリプトの実装
開発環境などで使用する一時的なリソースを自動的にシャットダウンする仕組みを実装しましょう。
EC2インスタンス自動停止Lambda関数の作成
- AWSマネジメントコンソールで「Lambda」サービスを選択
- 「関数の作成」をクリック
- 「一から作成」を選択
- 関数名を入力(例:「AutoStopEC2Instances」)
- ランタイムとして「Python 3.9」を選択
- 「関数の作成」をクリック
- 以下のコードを入力:
import boto3
def lambda_handler(event, context):
# 対象のリージョンを指定
ec2 = boto3.client('ec2', region_name='ap-northeast-1')
# 開発環境のタグが付いたインスタンスを検索
filters = [
{
'Name': 'tag:Environment',
'Values': ['Development']
},
{
'Name': 'instance-state-name',
'Values': ['running']
}
]
# インスタンスの取得
instances = ec2.describe_instances(Filters=filters)
instance_ids = []
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_ids.append(instance['InstanceId'])
if instance_ids:
# インスタンスを停止
ec2.stop_instances(InstanceIds=instance_ids)
print(f"停止したインスタンス: {instance_ids}")
else:
print("停止対象のインスタンスはありません")
return {
'statusCode': 200,
'body': f"処理完了: {len(instance_ids)} 個のインスタンスを停止しました"
}
- IAM実行ロールにEC2停止権限を追加:
- 「設定」タブ → 「アクセス権限」セクション → ロール名をクリック
- 「アクセス許可の追加」→ 「インラインポリシーの作成」
- JSONエディタに以下を貼り付け:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:StopInstances"
],
"Resource": "*"
}
]
}
- ポリシー名を入力し、「ポリシーの作成」をクリック
CloudWatchイベントの設定(Lambda関数の定期実行)
- CloudWatchコンソールから「イベント」→「ルール」を選択
- 「ルールの作成」をクリック
- 「スケジュール」を選択
- 「固定レート」を選択し、「1日」を指定
- 「時刻」を指定(例:20:00 UTC = 日本時間5:00)
- 「ターゲットを追加」をクリック
- 「Lambda関数」を選択し、作成した関数を指定
- 「設定の詳細」をクリック
- 名前と説明を入力し、「ルールの作成」をクリック
サービス別の注意点
EC2関連
- 初期設定では「停止」してもEBSボリュームは削除されない
- 料金発生を避けるには「終了保護」を無効化した上で「終了」を選択
- EIP(Elastic IP)は使用していなくても料金発生
- EC2インスタンスに関連付けていないEIPには料金が発生するため不要な場合は解放
- AMI(Amazon Machine Image)の保存
- 作成したAMIにはEBSスナップショットが関連付けられ、料金が発生
データベース関連
- RDSインスタンス
- 停止しても7日後に自動的に起動する仕様がある
- 長期間使用しない場合はスナップショットを取って削除を検討
- Aurora Serverless
- 使用していない時間でもクラスターが存在する限り最小料金が発生
ストレージ関連
- S3バケットのバージョニング
- 有効にすると古いバージョンも保存され、ストレージコストが増加
- 必要に応じてライフサイクルルールでの管理を検討
- S3リクエスト回数
- GETリクエストなど回数に応じて料金が発生
- 高頻度アクセスの場合はCloudFrontの利用を検討
ネットワーク関連
- データ転送料金
- AWSからインターネットへのデータ転送には料金が発生
- リージョン間のデータ転送も料金対象
- VPCエンドポイント
- 使用量に応じた時間料金が発生
まとめ:定期的なメンテナンスルーティン
予期せぬ課金を防ぐためには、以下の定期的なチェックルーティンを確立しましょう:
週次チェック
- EC2インスタンスの確認
- 未使用のインスタンスがないか
- 適切なサイズか
- ストレージの確認
- 未使用のEBSボリューム
- 古いスナップショット
- ネットワークリソースの確認
- 未使用のElastic IP
- ロードバランサー
月次チェック
- AWS Cost Explorer分析
- 前月比での増減
- 予想外の料金発生がないか
- 無料利用枠の使用状況確認
- 無料利用枠ダッシュボードで使用率をチェック
- 予算とアラートの見直し
- 予算の調整
- アラート設定の確認
- リソースのタグ付けレビュー
- 新規リソースに適切なタグが付いているか
四半期チェック
- IAMユーザーとアクセス権の見直し
- 不要になったユーザーの削除
- アクセス権限の最適化
- 長期的なコスト傾向分析
- Cost Explorerで3ヶ月〜1年の傾向を分析
- コスト最適化の機会検討
- Reserved Instanceの検討
- Savings Planの検討
AWS個人プロジェクトを始める際は、これらの対策を最初に設定することで、「気づいたら高額請求が来ていた」という事態を避けることができます。定期的なモニタリングと共に、AWSの無料利用枠を最大限に活用し、安全にクラウド環境で開発を進めましょう。
AWS環境を適切に管理すれば、予想外の課金を避けながら、クラウドの強力な機能を活用した開発が可能になります。
コメント