経緯
以前、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インスタンスが開始されたことを確認します。