AWS CLI を利用し AWS Budgets を新規作成&修正する

記事タイトルとURLをコピーする

マネージドサービス部 佐竹です。
今回のブログでは、AWS CLI を利用して AWS Budgets を設定する方法を紹介します。

AWS Budgets の CLI ではその引数として json ファイルを渡すのが基本的な使い方になりますが、そのフォーマットが少々分かり難いためその点の補足が主題です。

はじめに

AWS Budgets はその名の通り予算を管理するサービスであり、利用料に応じてアラートを通知することができるコスト管理の機能です。

近い監視系サービスとして、AWS Cost Explorer の一部の機能として存在する「AWS Cost Anomaly Detection」もありますが、利用用途は異なります。詳しくは以下のブログも合わせてご覧ください。

blog.serverworks.co.jp

create-budget で新規に予算を作成する

AWS CLI の create-budget を利用して新規で予算を作成する方法は以下の通りです。

docs.aws.amazon.com

create-budget--account-id とその他に --budget を必須の引数として実行するコマンドで、この時に json ファイルを渡して実行することが可能です。

以下を「create.json」というファイル名で保存し CloudShell で実行するためにマネジメントコンソールからファイルをアップロードします。必要に応じて値は修正ください。また、BudgetName が一意になる点に注意してください。

{
    "BudgetName": "Annual Budget",
    "BudgetLimit": {
        "Amount": "1200.0",
        "Unit": "USD"
    },
    "CostFilters": {},
    "CostTypes": {
        "IncludeTax": true,
        "IncludeSubscription": true,
        "UseBlended": false,
        "IncludeRefund": false,
        "IncludeCredit": false,
        "IncludeUpfront": true,
        "IncludeRecurring": true,
        "IncludeOtherSubscription": true,
        "IncludeSupport": true,
        "IncludeDiscount": true,
        "UseAmortized": false
    },
    "TimeUnit": "ANNUALLY",
    "TimePeriod": {
        "Start": "2023-01-01T00:00:00+00:00",
        "End": "2087-06-15T00:00:00+00:00"
    },
    "BudgetType": "COST"
}

AWS CLI のコマンドは以下の通りです。

aws budgets create-budget --account-id 123456789012 --budget file://create.json

補足:予算の期間について

前提として、AWS Budgets で設定が可能な期間範囲は以下の4つです。

  1. Daily (日別)
  2. Monthly (月別)
  3. Quarterly (四半期単位)
  4. Annually (年単位)

今回は先の json の通り「"TimeUnit": "ANNUALLY"」としていますが、ここを修正することで期間を任意に変更が可能です。

AWS CLI で予算アラートを同時に作成する

create-budget には --notifications-with-subscribers を指定することで、同時に通知設定を行うことが可能です。

本引数は必須にはなっていませんため、先に予算を作成した後にマネジメントコンソールからアラートを追加設定されても良いかと存じます。

参考までに、予算アラートも同時に作成する場合の例を記載します。

今回は「alert.json」というファイル名で保存して CloudShell で実行するために、先ほどと同様マネジメントコンソールからファイルをアップロードします。必要に応じて値を修正ください。

便利なことに、予算アラートは同時に複数設定することが可能です。今回はアラートの閾値として 90% と 100% とを、同時に設定するように json を記載しました。本 json において通知先は SNS となっていますが、これは AWS Chatbot をキックするための Topic を指定しています。

[
    {
        "Notification": {
            "ComparisonOperator": "GREATER_THAN",
            "NotificationType": "ACTUAL",
            "Threshold": 90,
            "ThresholdType": "PERCENTAGE"
        },
        "Subscribers": [
            {
                "SubscriptionType": "SNS",
                "Address": "arn:aws:sns:us-east-1:123456789012:chatbot-times-satake"
            }
        ]
    },
    {
        "Notification": {
            "ComparisonOperator": "GREATER_THAN",
            "NotificationType": "ACTUAL",
            "Threshold": 100,
            "ThresholdType": "PERCENTAGE"
        },
        "Subscribers": [
            {
                "SubscriptionType": "SNS",
                "Address": "arn:aws:sns:us-east-1:123456789012:chatbot-times-satake"
            }
        ]
    }
]

AWS CLI のコマンドは以下の通りです。この場合は、json ファイルを2つ同時に渡すことになります。

aws budgets create-budget --account-id 123456789012 --budget file://create.json --notifications-with-subscribers file://alert.json

実行結果の確認

Alerts (2)

alert.json に記載した2つのアラートがそれぞれ設定されていることがマネジメントコンソールからも確認ができました。

大量にアラートの閾値を用いるような場合は、AWS CLI で同時にアラートを作成する方がより楽そうです。

AWS CLI で既存の予算を修正する

次に、既存の予算を AWS CLI で修正する方法を記載します。

describe-budget / describe-budgets

まずは describe コマンドで、既存の更新先とする予算設定を確認しておきましょう。

AWS Budgets には個別の予算 json が確認できる describe-budget と、まとめて取得が可能な describe-budgets が用意されております。前者は引数として --budget-name が必須となっていますが、後者では指定できません。

aws budgets describe-budget --account-id 123456789012 --budget-name "Annual Budget"
aws budgets describe-budgets --account-id 123456789012

上記どちらを利用して頂いても一覧は取得できますが、今回は前者を利用して結果 json を取得しました。以下が返り値です。

{
    "Budget": {
        "BudgetName": "Annual Budget",
        "BudgetLimit": {
            "Amount": "1200.0",
            "Unit": "USD"
        },
        "CostFilters": {},
        "CostTypes": {
            "IncludeTax": true,
            "IncludeSubscription": true,
            "UseBlended": false,
            "IncludeRefund": false,
            "IncludeCredit": false,
            "IncludeUpfront": true,
            "IncludeRecurring": true,
            "IncludeOtherSubscription": true,
            "IncludeSupport": true,
            "IncludeDiscount": true,
            "UseAmortized": false
        },
        "TimeUnit": "ANNUALLY",
        "TimePeriod": {
            "Start": "2023-01-01T00:00:00+00:00",
            "End": "2087-06-15T00:00:00+00:00"
        },
        "CalculatedSpend": {
            "ActualSpend": {
                "Amount": "203.499",
                "Unit": "USD"
            },
            "ForecastedSpend": {
                "Amount": "528.457",
                "Unit": "USD"
            }
        },
        "BudgetType": "COST",
        "LastUpdatedTime": "2023-04-17T08:10:03.181000+00:00"
    }
}

今回、マネジメントコンソールから修正が不可能な「Start」を修正してみます。この点を抜き出すと、json では以下の値になっています。

       "TimePeriod": {
           "Start": "2023-01-01T00:00:00+00:00",
           "End": "2087-06-15T00:00:00+00:00"
        },

Start は期間の開始日です。ここを 2023-04-01T00:00:00+00:00 へとアップデートしてみます。

update-budget で既存の予算を修正する

update-budget は --account-id の他に --new-budget を必須の引数として実行するコマンドで、先ほどと同様に json ファイルを渡して実行することが可能です。

docs.aws.amazon.com

以下を「update.json」というファイル名で(ファイル名は任意です)保存して CloudShell で実行するためにマネジメントコンソールからファイルをアップロードします。必要に応じて値を修正ください。

補足ですが、新規作成の json よりも引数は少なくて良いため、json も短くなっています。

Update を行う場合には "BudgetName" は既存の予算名(一意の値)を指定する必要があります。

{
    "BudgetName": "Annual Budget",
    "BudgetLimit": {
        "Amount": "1200.0",
        "Unit": "USD"
    },
    "TimeUnit": "ANNUALLY",
    "TimePeriod": {
        "Start": "2023-04-01T00:00:00+00:00",
        "End": "2087-06-15T00:00:00+00:00"
    },
    "BudgetType": "COST"
}

AWS CLI のコマンドは以下の通りです。

aws budgets update-budget --account-id 123456789012 --new-budget file://update.json

成功すると返り値は空が返ってきます。

参考情報ですが、json に正しく情報が入っていない場合以下のようなエラーが発生します。

Parameter validation failed:
Missing required parameter in NewBudget: "TimeUnit"
Missing required parameter in NewBudget: "BudgetType"


An error occurred (InvalidParameterException) when calling the UpdateBudget operation: Unable to create/update budget - please provide one of the followings: Budget Limit/ Planned Budget Limit/ Auto Adjust Data

実行結果の確認

Start date

正しくコマンドが実行されていると、Start date が上画像の通りアップデートされます。

これで4月1日からの年間予算が作成できました。

残念な仕様について

設定してから AWS サポートに確認して判明したことなのですが、予算期間を Annually (年単位) で4月1日からの年間予算として設定したとしても、AWS Budgets は仕様として年間予算をその年の「1月1日から12月31日」でしか計画できないことがわかりました。

つまり、Annually (年単位) で開始日の「月と日」を修正する意味は現状ありません。できれば会計期間に合わせて4月1日からの1年間を予算期間としたかったのですが、残念です。

まとめ

AWS Budgets は予算管理に良いサービスです。AWS CLI を利用することで新規の予算作成が通知含めて簡単に作成ができることを json フォーマット含めてご紹介しました。

また、マネジメントコンソールからでは AWS Budgets の修正が不可能な個所もあります。そのような場合には AWS CLI を利用することで修正(Update)が可能であることを合わせて紹介しました。

これらが皆様のコストマネジメントに少しでも役に立てば幸いです。

では、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。