はじめに
今回は AWS Budgets のアラート機能を試します。
[Lambda関数・SAMテンプレート]
(https://github.com/tanaka-takurou/serverless-budgets-page-go)
準備
[AWS Budgetsの資料]
AWS Budgets
AWS SAM テンプレート作成
AWS SAM テンプレートで API-Gateway , Lambda, AWS Budgets の設定をします。
[参考資料]
AWS SAM テンプレートを作成する
AWS Budgetsの設定は以下の部分
Budget:
Type: "AWS::Budgets::Budget"
Properties:
Budget:
BudgetLimit:
Amount: 100
Unit: USD
TimeUnit: MONTHLY
BudgetType: COST
CostFilters:
AZ:
- !Ref 'AWS::Region'
NotificationsWithSubscribers:
- Notification:
NotificationType: ACTUAL
ComparisonOperator: GREATER_THAN
Threshold: 99
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref Address
- Notification:
NotificationType: ACTUAL
ComparisonOperator: GREATER_THAN
Threshold: 50
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref Address
Lambda関数作成
※ Lambda関数は aws-lambda-go を利用しました。
AWS Budgets の操作は aws-sdk-go-v2/service/budgets を利用しました。
Budgets の一覧を取得するには DescribeBudgets を使う
func describeBudgets(ctx context.Context)(string, error) {
if budgetsClient == nil {
budgetsClient = budgets.NewFromConfig(getConfig(ctx))
}
input := &budgets.DescribeBudgetsInput{
AccountId: aws.String(os.Getenv("ACCOUNT_ID")),
}
result, err := budgetsClient.DescribeBudgets(ctx, input)
if err != nil {
log.Print(err)
return "", err
}
budgetNameList := []string{}
for _, v := range result.Budgets {
budgetNameList = append(budgetNameList, aws.ToString(v.BudgetName))
}
resultJson, err := json.Marshal(budgetNameList)
if err != nil {
log.Print(err)
return "", err
}
return string(resultJson), nil
}
Budget の内容を取得するには DescribeBudget を使う
func describeBudget(ctx context.Context, budgetName string)(string, error) {
if budgetsClient == nil {
budgetsClient = budgets.NewFromConfig(getConfig(ctx))
}
input := &budgets.DescribeBudgetInput{
AccountId: aws.String(os.Getenv("ACCOUNT_ID")),
BudgetName: aws.String(budgetName),
}
result, err := budgetsClient.DescribeBudget(ctx, input)
if err != nil {
log.Print(err)
return "", err
}
resultJson, err := json.Marshal(BudgetData{
BudgetName: aws.ToString(result.Budget.BudgetName),
LimitAmount: aws.ToString(result.Budget.BudgetLimit.Amount),
LimitUnit: aws.ToString(result.Budget.BudgetLimit.Unit),
SpendAmount: aws.ToString(result.Budget.CalculatedSpend.ActualSpend.Amount),
SpendUnit: aws.ToString(result.Budget.CalculatedSpend.ActualSpend.Unit),
})
if err != nil {
log.Print(err)
return "", err
}
return string(resultJson), nil
}
終わりに
AWS Budgets のアラート機能を設定し、Webページ上から状況を確認出来るようにしました。
AWS Budgets ダッシュボードより、分散分析や予算基準サマリーも見ることができるため、今後試していこうと思います。
参考資料
[CloudFormation一撃で予算アラート(Budgets)を作成してみた](https://dev.classmethod.jp/articles/cloudformation-budgets-alart/)