Webエンジニアのメモ帳

技術的な話を中心に書いています。

【AWS】予算を設定し、超えた場合にEC2インスタンスを停止させる方法

AWSで予算を設定し、超えた場合にEC2インスタンスを停止させる方法を説明します。

概要

AWSでは予算を設定し、それを超えた場合にメールで通知することができます。

これに加え、2020年のアップデートから、EC2インスタンスを停止させることができるようになりました。

ネットを見ると「インスタンスの停止はできない」という情報も出てきますが、これは古い情報です。

予算の設定の際に「予算アクション」を設定することでこれを実現できますが、その方法は少し複雑なので、その方法について説明します。

ざっくり説明すると、以下のような手順になります。

  1. IAMポリシーの作成
  2. IAMロールの作成
  3. 予算の設定

手順1. IAMポリシーの作成

まずは、IAMポリシーを作成します。

IAMポリシーというのは、ざっくり言えば「何に対して何ができる」という内容を定義したものです。下に載せているJSONを見ると、何となく分かると思います。

IAMポリシーの画面は、「IAM」で検索し、出てきた「ポリシー」をクリックすれば表示されます。

f:id:iberia9lavapies:20210329224552p:plain

デフォルトのポリシーが大量に表示されています。

f:id:iberia9lavapies:20210329224957p:plain

この画面で、「ポリシーの作成」ボタンを押しポリシーを作成します。

次の画面で、「JSON」タブを押します。

f:id:iberia9lavapies:20210401184202p:plain

デフォルトで入力されているJSONを消し、以下のJSONを貼り付けます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstanceStatus",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "iam:AttachGroupPolicy",
        "iam:AttachRolePolicy",
        "iam:AttachUserPolicy",
        "iam:DetachGroupPolicy",
        "iam:DetachRolePolicy",
        "iam:DetachUserPolicy",
        "organizations:AttachPolicy",
        "organizations:DetachPolicy",
        "rds:DescribeDBInstances",
        "rds:StartDBInstance",
        "rds:StopDBInstance",
        "ssm:StartAutomationExecution"
      ],
      "Resource": "*"
    }
  ]
}

貼り付けたら、「次のステップ: タグ」を押して次の画面に進みます。

f:id:iberia9lavapies:20210401184337p:plain

この画面では何もせず、「次のステップ: 確認」を押して次の画面に進みます。

f:id:iberia9lavapies:20210401184446p:plain

あとは名前をつけてポリシーを保存します。今回は「BudgetActionPolicy」という名前にします。

手順2. IAMロールの作成

つぎに、作成したポリシーを持つIAMロールを作成します。

IAMロールというのは、上記のポリシーで定義した作業を行う実体になります。

IAMロールを作成しただけでは何もできませんが、このロールに先ほど作成したポリシーを紐づけることで、例えばEC2インスタンスの停止などが行えるようになるわけです。

IAMポリシーと同様、「IAM」で検索をかけるとIAMロールの画面が表示できます。

f:id:iberia9lavapies:20210401184825p:plain

「ロールの作成」ボタンを押します。

f:id:iberia9lavapies:20210329225704p:plain

「EC2」を選択して次に進みます。

f:id:iberia9lavapies:20210401185043p:plain

この画面で、先ほど作成した「BudgetActionPolicy」を選択し、「次のステップ: タグ」ボタンを押します。

f:id:iberia9lavapies:20210401185100p:plain

この画面では何もせず、「次のステップ: 確認」を押して次の画面に進みます。

f:id:iberia9lavapies:20210401185215p:plain

あとは名前をつけて「ロールの作成」ボタンを押せば、ロールが作成されます。今回は「BudgetActionRole」という名前で作成します。

このロールを使えるようにするには、信頼関係の編集が必要です。

ロール一覧画面から作成したロールをクリックして「信頼関係」タブをクリックします。

f:id:iberia9lavapies:20210401185439p:plain

「信頼関係の編集」ボタンを押し、以下のJSONを貼り付けて「信頼ポリシーの更新」ボタンを押します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

手順3. 予算の設定

最後に、予算の設定を行います。

予算は「AWS Budgets」から設定を行います。

f:id:iberia9lavapies:20210329230243p:plain

「予算の作成」ボタンをクリックし、予算の作成を開始します。

まず、予算タイプを選択します。デフォルトで選択されている「コスト予算」のままで良いです。「予算を設定」ボタンを押して次の画面に進みます。

f:id:iberia9lavapies:20210331230549p:plain

次の画面で、予算に名前をつけ、金額を設定します。「しきい値を設定する」ボタンを押して次の画面に進みます。

f:id:iberia9lavapies:20210331230744p:plain

この画面で、設定した金額を上回ったときの動作を設定します。

f:id:iberia9lavapies:20210401190210p:plain

まずは、予算の何%に達した時にアクションを実行するかと、実際のコストか予測コストか、どちらに基づいてアクションを実行するかを決めます。

つぎに、メールでの通知先を設定します。

f:id:iberia9lavapies:20210331231927p:plain

つぎに、フォームの下に表示されている「予算アクションを追加」ボタンを押すと、以下のフォームが開きます。

f:id:iberia9lavapies:20210331232047p:plain

この部分で、インスタンスを落とすなどのアクションを定義します。

まずはIAMロールを選択する必要があるので、先ほど作成したロールを選択します。

つぎに、アクションタイプを選択します。「Automate instances to stop for EC2 or RD2」を選びます。

すると、さらにフォームが開くので、対象のEC2インスタンスが存在するリージョンを選択し、インスタンスのIDを全て選択します。

f:id:iberia9lavapies:20210331232335p:plain

最後に「予算の確認」ボタンを押して確認画面に進み、問題なければ予算を作成します。

これで、予算をオーバーした場合は自動でEC2インスタンスが停止されます。