AWS EventBridgeでSSM Automationを使用して特定タグのEC2の開始と停止をスケジューリングする


経緯

以前、EC2インスタンスIDを指定してEventBridgeからEC2の開始と停止を行ったのですが、

この方法だとAMIからインスタンスを起動した時など、インスタンスIDが変わる度に設定を変更しなければなりません。

そこで今回は特定のタグをもつEC2インスタンスに対してEventBridgeよりEC2の開始と停止がスケジューリングできるようにします。

EC2インスタンスにEC2AutoStart:true,EC2AutoStop:trueのタグが付いているインスタンスを対象とします。

EC2インスタンス停止の設定

SSM Automationの作成

SystemManagerサービス-[共有リソース]-[ドキュメント]で「Create Document」ボタンを押して、Automationを選択します。

[名前]:StopEC2_ByTagName(任意)

[エディタ]タブを選択して、「編集」ボタンを押して下記の内容で更新します。

description: Stop EC2 instances by tagname
schemaVersion: '0.3'
parameters:
  TagName:
    type: String
    description: ''
    default: EC2AutoStop
mainSteps:
  - name: StopEC2Instances
    action: 'aws:executeAwsApi'
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: 'tag:{{ TagName }}'
          Values:
            - 'true'

Automationの動作確認

作成されたAutomationの動作を確認します。

該当のEC2インスタンスにEC2AutoStop:trueのタグを追加します。

[自己所有]タブを選択して、先ほど作成されたAutomationを選択します。

「オートメーションを実行する」ボタンをクリックします。

[シンプルな実行]で実行します。

しばらくすると、実行ステータスが”成功”となります。

該当のEC2インスタンスが”停止済み”になったことが確認できました。

IAMポリシーの作成

EventBridgeでのルール作成時に、”この特定のリソースに対して新しいロールを作成する”にチェックを付けると、

“SSM Automation ターゲットの Automation 定義には、評価結果として IAM ロール ARN を返す AssumeRole が含まれている必要があります。”

とエラーとなりすので(2021/09現在)、今回は前もってロールを作成しておくことにします。

まず、EC2をストップするポリシーを作成します。

下記のポリシー(AllowEC2Stop)を作成しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:StopInstances",
            "Resource": "arn:aws:ec2:*:(your account):instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "tag:GetResources",
            "Resource": "*"
        }
    ]
}

IAMロールの作成

SystemManagerのAutomationから実行されますので、そのためのIAMロールを作成します。

IAMサービスのロールのロールの作成で、[EC2]を選択します。

AmazonSSMAutomationRoleと、先ほど作成したAllowEC2Stopのポリシーをアタッチします。

[ロール名]:SSMAutomationRoleEventBridge(任意)

作成されたロールを選択して、「信頼関係の編集」をクリックします。

Principalに”events.amazonaws.com”と”ssm.amazonaws.com”を追加して下記のようにします。
Service部は配列になるので、[]で囲みます。

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

EventBridgeによるスケジュール設定

先ほど作成したAutomationをEventBridgeから特定時間に呼び出すように設定していきます。

[EventBridge]サービスの「ルールを作成」ボタンをクリックします。

【名前と説明】
[名前]:stop-ec2-by-tagname

【パターンを定義】
スケジュール、Cron式を選択
[Cron式]:0 * * * ? *  
 今回はテストの為毎時0分にイベントが発生するように設定しました。

【ターゲットを選択】
[ターゲット]:SSM Automationを選択して、作成したドキュメント(StopEC2_ByTagName)を選択
既存のロールを選択して、作成したロール(SSMAutomationRoleEventBridge)を選択します。

動作確認

指定した時間になると、EC2インスタンスが停止されたことを確認します。

EC2インスタンス開始の設定

SSM Automationの作成

EC2インスタンス終了の時と同様に下記のAutomationを作成します。
作成手順の詳細は同様ですので省略します。

[名前]:StartEC2_ByTagName(任意)

description: Start EC2 instances by tagname
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
  TagName:
    type: String
    description: ''
    default: EC2AutoStart
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ""
mainSteps:
  - name: StartEC2Instances
    action: 'aws:executeAwsApi'
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StartEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: 'tag:{{ TagName }}'
          Values:
            - 'true'

Automationの動作確認

EC2停止時と同様に、作成されたAutomationの動作を確認します。

該当のEC2インスタンスにEC2AutoStart:trueのタグを追加します。

EC2停止時と違い、適切なポリシーがないと実行できませんので、下記のロールをアタッチして実行します。

[AutomationAssumeRole]:SSMAutomationRoleEventBridge

該当のEC2インスタンスが”実行中”になったことが確認できました。

IAMポリシーの作成

下記のポリシー(AllowEC2Start)を作成しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:*:automation-definition/AWS-StartEC2Instance:$DEFAULT"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::(your account):role/SSMAutomationRole",
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "ssm.amazonaws.com"
                }
            }
        }
    ]
}

IAMロールにポリシーをアタッチ

EC2インスタンス停止の設定の時に作成したロール(SSMAutomationRoleEventBridge)にポリシー(AllowEC2Start)をアタッチします。

EventBridgeによるスケジュール設定

【名前と説明】
[名前]:start-ec2-by-tagname

【パターンを定義】
スケジュール、Cron式を選択
[Cron式]:0 * * * ? *  
 今回はテストの為毎時0分にイベントが発生するように設定しました。

【ターゲットを選択】
[ターゲット]:SSM Automationを選択して、作成したドキュメント(StartEC2_ByTagName)を選択
既存のロールを選択して、作成したロール(SSMAutomationRoleEventBridge)を選択します。

動作確認

指定した時間になると、EC2インスタンスが開始されたことを確認します。


コメントを残す

メールアドレスが公開されることはありません。