AWS Organizations の管理アカウントでメンバーアカウントの予算管理のため AWS Budgets の設定を AWS CLI からやってみた

2022.05.06

AWS Budgets で AWS Organizations 管理下のメンバーアカウントの予算管理をしたいです。具体的にはメンバーアカウント個別に予算設定をし、予算に対する一定の割合を超過すると管理者へメール通知する設定を機会がありました。今回は AWS CLI から設定を行った場合の検証をしたかったので、その設定方法を紹介します。

設定イメージ

月の予算を設定し、フィルターしてメンバーアカウント個別を対象にする。

メール通知は予算に対する一定の割合を超過したタイミングに設定する。

AWS CLI での設定方法

予算額と、メール通知の設定内容はやや記述量が多かったため2つの設定ファイルへ切り出しました。

  • メンバーアカウント毎の予算設定ファイル(member-account.json
  • メール通知の設定ファイル(notification.json)

2つの設定ファイルを引数に指定して予算を設定を管理アカウントへ設定する方針としました。

  • --account-id 111222333444111222333444管理アカウントの AWS アカウント ID を指定
aws budgets create-budget \
    --account-id 111222333444 \
    --budget file://member-account.json \
    --notifications-with-subscribers file://notification.json

予算設定ファイル

毎月の予算をアカウント個別に設定することを想定しています。そのため、1つの設定ファイルで完結はできませんのでアカウント毎に設定ファイルを作成することになります。

  • BudgetNameは個別アカウント毎にわかりやすい名前を付けます
  • LinkedAccountは予算管理したいメンバーアカウントの AWS アカウント ID を指定
    • 123456789012の箇所です
  • Amountは予算上限額を指定
    • 10の箇所です
    • 予算の n% 超過で通知する設定はもう一方の設定ファイルで設定します

member-account.json

{
	"BudgetName": "Example budget for member account",
	"BudgetType": "COST",
	"CostFilters": {
		"LinkedAccount": [
			"123456789012"
		]
	},
	"BudgetLimit": {
		"Amount": "10",
		"Unit": "USD"
	},
	"CostTypes": {
		"IncludeTax": true,
		"IncludeSubscription": true,
		"UseBlended": false,
		"IncludeRefund": false,
		"IncludeCredit": false,
		"IncludeUpfront": true,
		"IncludeRecurring": true,
		"IncludeOtherSubscription": true,
		"IncludeSupport": true,
		"IncludeDiscount": true,
		"UseAmortized": false
	},
	"CalculatedSpend": {
		"ActualSpend": {
			"Amount": "0.0",
			"Unit": "USD"
		}
	},
	"TimeUnit": "MONTHLY"
}

通知設定ファイル

予算に対して実際にかかったコストが 50%, 80%, 100% を超過したタイミングでメール通知する設定例です。メンバーアカウント毎に一律同じ通知設定の場合は通知用の設定ファイルは1個だけで済みます。

  • example@example.comは通知先のメールアドレスに置き換えてください
  • Thresholdの数値指定で予算に対する割合の閾値を指定します
  • 閾値設定は最大5個までです

notification.json

[
	{
		"Notification": {
			"ComparisonOperator": "GREATER_THAN",
			"NotificationType": "ACTUAL",
			"Threshold": 50,
			"ThresholdType": "PERCENTAGE"
		},
		"Subscribers": [
			{
				"Address": "example@example.com",
				"SubscriptionType": "EMAIL"
			}
		]
	},
	{
		"Notification": {
			"ComparisonOperator": "GREATER_THAN",
			"NotificationType": "ACTUAL",
			"Threshold": 80,
			"ThresholdType": "PERCENTAGE"
		},
		"Subscribers": [
			{
				"Address": "example@example.com",
				"SubscriptionType": "EMAIL"
			}
		]
	},
	{
		"Notification": {
			"ComparisonOperator": "GREATER_THAN",
			"NotificationType": "ACTUAL",
			"Threshold": 100,
			"ThresholdType": "PERCENTAGE"
		},
		"Subscribers": [
			{
				"Address": "example@example.com",
				"SubscriptionType": "EMAIL"
			}
		]
	}
]

予算設定を AWS CLI から作成

メンバーアカウント個別の設定ファイル(member-account-1-3.json)を準備しました。通知先・閾値の設定は一律同じ設定にするため1つのファイル(notification.json)のみです。

$ tree .
.
├── member-account-1.json
├── member-account-2.json
├── member-account-3.json
└── notification.json

--budgetの指定を入れ替えて順次設定作成コマンドを実行します。

$ aws budgets create-budget \
          --account-id 111222333444\
          --budget file://member-account-1.json \
          --notifications-with-subscribers file://notification.json
$ aws budgets create-budget \
          --account-id 111222333444\
          --budget file://member-account-2.json \
          --notifications-with-subscribers file://notification.json
$ aws budgets create-budget \
          --account-id 111222333444\
          --budget file://member-account-3.json \
          --notifications-with-subscribers file://notification.json

ジャイアンのアカウントを例に確認します。予算$10に対して実際にかかったコストは$3です。なので、まだ閾値超過していません。予測は予算を大きく上回っていますね。

予算は$10で閾値は50%にしたため、$5を超えるとメール通知されます。

閾値超過を検知するタイミング

リアルタイム検知ではない点はご留意ください。

AWS Budgets の更新頻度について理解する
AWSBudgets でリソースのモニタリングに使用される 請求データは、1 日 1 回以上更新されます。予算情報と関連アラートは、このデータ更新間隔に従って、更新、送信される点に注意してください。

AWS Budgets のベストプラクティス - AWS コスト管理

すぐに検知させてメール通知テストしたいとき

予算設定を作成した時点で閾値を超過していれば検知できます。予算$10で閾値を10%にし$1を超えると検知する予算設定を、すでに$1使っているアカウントに対して設定しました。

閾値超過メールの内容

設定した閾値値を超過すると以下のメールが届きます。予算名を日本語にするとどうなるのか興味本位で試していたのですが文字化けせずメールが届きました。場合によっては確認しやすいかもしれませんが、英語で予算名設定した方が無難な感じはします。

おわりに

AWS Organizations での管理下でユーザー個別に検証用アカウントを払い出し、各アカウントのコスト管理をしたいときの良い運用方法を考えていました。ユーザーの異動や、退職に伴い検証用アカウントの削除も発生する場合は AWS CLIで設定、マネジメントコンソールから設定の削除も手軽な運用方法としてよいかなと試してみました。IaC に慣れている、管理したいということでもなければシンプルに設定できるのでよいかなという感触です。設定削除はマネジメントコンソールから2クリックくらいでできて IaC で管理よりはここだけは非常にお手軽です。

CloudFormation で設定したいときは以下のリンクをご確認ください。