AWS利用料金が閾値を超えたらメールで通知するようにTerraformでAWS Budgetsを設定した

AWSのコスト管理を自動化するために、AWS Budgetsを設定しました。主な目的は、予算を超えた場合にアラートを受け取ることで、不要なコストを抑えることです。Terraformを使ってAWS Budgetsを設定したので、行ったことをまとめます。

### 1. 環境の準備

まず最初に、TerraformとAWS CLIがインストールされているかを確認しました。私はAWS SSOを使っているので、以下のコマンドでSSOの設定を行い、AWSにログインしました。

```
aws configure sso
```

このコマンドでAWS SSOにログインし、プロファイルを設定しました。

### 2. Terraformプロジェクトのセットアップ

次に、Terraformのプロジェクトをセットアップしました。以下のようなディレクトリ構成にしました。

```
├── README.md
├── main.tf
├── backend.tf
├── provider.tf
├── terraform.tfvars
└── variables.tf
```

`.gitignore`ファイルも作成し、Terraformの作業に不要なファイルがGitに含まれないように設定しました。


```:.gitignore
# Terraform State files
*.tfstate
*.tfstate.*

# Crash log files
crash.log

# Terraform variable files
*.tfvars
*.tfvars.json

# .terraform directory
.terraform/

# Terraform plan files
*.tfplan
```

### 3. Terraformコードの詳細

次に、AWS Budgetsを設定するためのコードを書きました。内容としては、`main.tf`で月ごとの予算を設定し、コストが閾値を超えた場合にメールで通知が来るようにしています。

```terraform:main.tf
resource "aws_budgets_budget" "monthly_budget" {
  name              = "monthly-cost-budget"
  budget_type       = "COST"
  limit_amount      = "0.01"           # 月の予算をUSDで設定(アラート通知が飛ぶことを確認したいので低く設定)
  limit_unit        = "USD"           # JPYにしたかったがエラーになった
  time_unit         = "MONTHLY"       # 月ごとにコストを追跡

  notification {
    comparison_operator = "GREATER_THAN"
    notification_type   = "ACTUAL"    # 実際のコストに基づいて通知
    threshold           = 80.0        # 80%を超えた場合にアラート
    threshold_type      = "PERCENTAGE"

    subscriber {
      address          = var.alert_email  # 通知を受け取るメールアドレス
      subscription_type = "EMAIL"
    }
  }
}
```

まずはアラートのメールが飛ぶことを確認したいので、0.01USDを閾値に設定しました。通過の単位であるlimit_unitはJPY(日本円)にしたかったのですが、私の設定の方法が間違っているのかUSDしか設定できない仕様なのかわかりませんがエラーになったので、まずはUSDで設定しました。

#### 変数の設定

通知先のメールアドレスは、`variables.tf`に定義しました。

```terraform:variables.tf
variable "alert_email" {
  description = "通知を受け取る自分のメールアドレス"
  type        = string
}
```

メールアドレスの実際の値は`terraform.tfvars`に記入しています。

```terraform:terraform.tfvars
alert_email = "email@email.com"  # 通知を受け取るメールアドレス
```

### 4. Terraformコマンドの実行

これらのファイルを設定した後、Terraformコマンドを実行しました。以下のコマンドをプロジェクトのルートディレクトリで実行しました。

```
terraform init
terraform plan
terraform apply
```

無事にTerraformコマンドが成功し、AWS Budgetsが正常に設定されました。

### 5. 設定の確認

次に、AWS Management ConsoleでAWS Budgetsの設定が正しく反映されているかマネジメントコンソールからも確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331225/90d225fe-4c75-52b2-ffeb-f681fcc15fe7.png)


また、設定した予算の閾値を超えた場合、指定したメールアドレスに通知が届くことも確認できました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331225/b3d86ac6-383e-38a0-fe5e-b2668be7f015.png)


6. 設定の変更

次に、予算の閾値を$3に変更してみます。

```terraform:main.tf
resource "aws_budgets_budget" "monthly_budget" {
  name              = "monthly-cost-budget"
  budget_type       = "COST"
  limit_amount      = "3"           # 月の予算をUSDで設定
  limit_unit        = "USD"           # JPYにしたかったがエラーになった
  time_unit         = "MONTHLY"       # 月ごとにコストを追跡

  notification {
    comparison_operator = "GREATER_THAN"
    notification_type   = "ACTUAL"    # 実際のコストに基づいて通知
    threshold           = 80.0        # 80%を超えた場合にアラート
    threshold_type      = "PERCENTAGE"

    subscriber {
      address          = var.alert_email  # 通知を受け取るメールアドレス
      subscription_type = "EMAIL"
    }
  }
}
```

再度planコマンドで変更内容に問題ないか確認した後にapplyコマンドを実行しました。

```
terraform plan
terraform apply
```

コマンドが成功した後にマネジメントコンソールから確認すると閾値が$3に上がったことで画面の表示も変わっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331225/a24f035f-4ac3-a2f5-2688-5438cba646c7.png)


### まとめ

Terraformを使ってAWS Budgetsを設定することで、コストの管理を自動化しました。これで予算を超えた場合にすぐに気づくことができるようになりました。
今後は、さらに細かなコスト分析や他のAWSサービスとの連携も試していきたいと思います。