🦉

AWS Budgetsを使ってAWSサービスの予算超過を検出・制御する

2024/09/28に公開

以前作成した家計簿アプリに予算超過時の処理を設定していく。AWS無料利用枠の期間は終わっている自分にとってはAWSの利用が増えると、意図せず予算を超過してしまうことが心配です。そんなときに便利なのがAWS BudgetsLambdaを連携させる方法です。今回は、この仕組みを活用してAWSサービスの使用量を制御する設定を書いていきます。

設定手順

以下の手順で設定していく。

Lambda関数で処理を実装

Lambda関数では、特定のLambda関数を停止したりアラートを出す処理を実装する。例えば、予算超過時にLambda関数の同時実行数を0にすることで自動的に実行を停止することが可能です。

SNSを使って通知

しきい値を超えた時点でAmazon SNSを使用して通知を行います。このSNSトピックにLambdaをサブスクライブさせ、予算超過時に自動的にLambda関数を実行するようにします。

AWS Budgetsで予算設定

AWS Budgetsを利用して月ごとの予算を設定します。ここで、特定のサービスや全体のコストに対する予算を決め、予算超過のしきい値(例:80%、100%)を設定します。

Lambda

関数名を適当に設定し、ランタイムはPythonを選択。

import boto3

def disable_lambda_function(function_name):
    client = boto3.client('lambda')

    try:
        response = client.put_function_concurrency(
            FunctionName=function_name,
            ReservedConcurrentExecutions=0
        )
        print(f"Lambda関数 {function_name} を無効化しました。")
        return response
    except Exception as e:
        print(f"エラー: {e}")
        raise

def lambda_handler(event, context):
    function_name = "<Function-Name>" #停止するLambda関数を指定する
    disable_lambda_function(function_name)
    return {
        'statusCode': 200,
        'body': f"{function_name} の実行を停止しました。"
    }

作成したLambda関数に上記コードを貼り付ける。

権限を付与する。設定を選択し、ロールをクリック。

ポリシー名をクリックしてJSONを編集する。

{
    "Effect": "Allow",
    "Action": "lambda:PutFunctionConcurrency",
    "Resource": "arn:aws:lambda:ap-northeast-1:<停止するLambda関数のARNを指定>"
}

上記コードをステートメントに追加して保存する。

Amazon SNS

SNSのトピックを作成する。タイプはスタンダードを選択し、トピックの名前と表示名をつけ、あとはデフォルトで画面下部のトピックの作成をクリック。

トピックが作成できたら次にサブスクリプションの作成をクリックする。

[プロトコル:Lambda]、[エンドポイント:先程作成したLambda関数]を選択し、サブスクリプションを作成する。

作成できたらアクセスポリシー設定の編集する。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "arn:aws:sns:ap-northeast-1:<ID>:LINE-App-Alert",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "<ID>"
        }
      }
    }
  ]
}

↓↓↓↓変更↓↓↓↓

{
    "Version": "2008-10-17",
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "AWSBudgets-notification-1",
            "Effect": "Allow",
            "Principal": {
                "Service": "budgets.amazonaws.com"
            },
            "Action": "SNS:Publish",
            "Resource": "<insert-ARN-here>"
        }
    ]
}

上記のステートメントにSNSのARNを書き換えて保存する。

AWS Budgets

AWS Budgets検索、またはBilling and Cost Managementの左ペーンの予算をクリック。

開いたら予算を作成をクリックして予算設定をしていきます。

予算タイプを選択では[カスタマイズ (アドバンスト)] -> [コスト予算 – 推奨]を選択して次へ。

予算名予算額は適当につけて後は画像の通り選択。

すべてのAWSサービスに対して予算を設定する。画像の通りデフォルトで次へ。

アラートを設定する。

今回は、EメールとAmazon SNSへ通知先として設定する。
通知先がEメール設定ではしきい値を絶対値にし、金額を指定する。

通知先がAmazon SNS設定ではしきい値を予算額の% にし、数値を指定する。先程設定したSNSトピックのARNを指定する。

デフォルトのままで次へをクリックして次の画面もそのままで保存する。

テストする

設定が完了したら、テストのために予算を意図的に超えるような値を設定し、Lambda関数が正しく停止することを確認します。停止したLambda関数の同時実行設定で、予約された同時実行数が0になっているか確認できます。

停止するLambda関数の[設定]->[同時実行と再起の検出]を選択。

最後に

この仕組みを使えば、予算超過を検出し、AWSサービスのコストを自動的に制御できます。AWS BudgetsとSNS、Lambdaを組み合わせることでコスト管理を効率化し無駄な出費を防ぐことが可能です。ぜひ活用してみてください。

Discussion