[AWS] CloudWatchでEC2の自動起動・停止をスケジュールする
CloudWatch Events の設定だけで、スケジュールされた日時に EC2 インスタンスを自動で起動・停止する方法。
テストで使っている EC2 インスタンスを終業時に自動で停止させたかった。ググると Lambda を使った方法が出てくるけど、 CloudWatch Events でルールを設定するだけでできた。
自動停止の設定方法
- CloudWatch コンソール画面から「ルール」をクリック
- ルール画面から「ルール作成」ボタンをクリック
- [イベントソース]のとこで、「スケジュール」を選択
- 「 Cron 式」を選択し、停止スケジュールを記入
* スケジュールは UTC タイムゾーンで記入する
* Cron 式の書き方は「 Cron 式の構文」の項を参照 - [ターゲット]のとこで、「ターゲットの追加」ボタンをクリック
- 「 EC2 StopInstances API 呼び出し」を選択
- 「インスタンス ID* 」を入力
- (ロールがなければ)「この特定のリソースに対して新しいロールを作成する」を選択
* 新しくロールが作成される - 「設定の詳細」ボタンをクリック
- 「名前」、「説明」を入力し、「ルールの作成」ボタンをクリック
自動起動の設定方法
「ターゲットの追加」の際、[この特定のリソースに対して新しいロールを作成する]を選択してロールを新規作成すると、下記のエラーが出るので IAM ロールを自分で作る。
The Automation definition used by an SSM Automation target must contain an AssumeRole which evaluates to an IAM arn.
IAM ロール作成
AWS 管理ポリシーを使った簡単版と、カスタムポリシーを作るカスタム版を試した。
簡単編
デフォルトで用意されている AWS 管理ポリシー [ AmazonSSMAutomationRole ] を使う方法。
- IAM コンソール画面から「ロール」→「ロールの作成」をクリック
- [このロールを使用するサービスを選択] から「 EC2 」を選択し、「次のステップ:…」をクリック
- 「AmazonSSMAutomationRole」を選択し、「次のステップ:…」をクリック
- タグ、ロール名、ロールの説明を入力し、ロールを作成する
- ロール一覧から、作成したロールを選択し、[信頼関係]タブ → 「信頼関係の編集」
- ポリシードキュメントに “events.amazonaws.com" を追加し、「信頼ポリシーの更新」をクリック
<ポリシードキュメント>
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com",
"ec2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
カスタム編
[ AmazonSSMAutomationRole ]ポリシーには EC2 自動起動に必要のない権限も含まれているため、必要な権限だけを付与するカスタムポリシーを作成し、使う方法。
① カスタムポリシーを作成する。
IAM コンソール画面 → ポリシー画面から [ AmazonSSMAutomationRole ] ポリシーを確認する。
このポリシーを雛形に。いらない部分を削除してカスタムポリシーに使う。
EC2 自動起動だけなら、 Action
に "ec2:StartInstances"
があれば動く。
通知が不要なら "sns:Publish"
もいらない。
< AmazonSSMAutomationRole ポリシー>
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:*:*:function:Automation*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:CreateImage",
"ec2:CopyImage",
"ec2:DeregisterImage",
"ec2:DescribeImages",
"ec2:DeleteSnapshot",
"ec2:StartInstances",
"ec2:RunInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:DescribeInstanceStatus",
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:DescribeTags",
"cloudformation:CreateStack",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:DeleteStack"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:*"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": [
"arn:aws:sns:*:*:Automation*"
]
}
]
}
- ポリシー画面から、「ポリシーの作成」をクリック
- ポリシーを作成
ビジュアルエディタで必要なサービスを選択していってもいいし、[ AmazonSSMAutomationRole ]ポリシーから不要なものを削除した JSON を入力でもいい。 - 「ポリシーの確認」 → 名前・説明を入力しポシリーを作成する
< EC2 自動起動用カスタムポリシー>
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:*:*:function:Automation*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:*"
],
"Resource": [
"*"
]
}
]
}
② IAM ロールを作成する。
- IAM コンソール画面から「ロール」→「ロールの作成」をクリック
- [このロールを使用するサービスを選択] から「 EC2 」を選択し、「次のステップ:…」をクリック
- [ポリシーのフィルタ]から「ユーザーによる管理」を選択し、今作ったカスタムポリシーを選択し、「次のステップ:…」をクリック
- タグ、ロール名、ロールの説明を入力し、ロールを作成する
- 作成したロールをクリック → [信頼関係]タブ → 「信頼関係の編集」で “events.amazonaws.com" を追加
CloudWatch Events の設定
CloudWatch Events の設定は、自動停止の[ステップ 1: ルールを作成する]画面の[ターゲット]のとこの設定が変わるだけなので、その他は自動停止と同じ手順。
- [ターゲット]のとこで、「ターゲットの追加」ボタンをクリック
- 「 SSM Automation 」を選択
- 「ドキュメント* 」で 「 AWS-StartEC2Instance 」を選択
- 「定数」を選択し、「 InstanceId* 」を入力
- [既存のロールを使用]を選択し、作成したロールを選択
- 「設定の詳細」ボタンをクリック
Cron 式の構文
分 時 日 月 曜日 年
* 月
に指定できる値 : 1-12
or JAN-DEC
* 曜日
に指定できる値 : 1-7
or SUN-SAT
* 日
と 曜日
の両方に値 ( *
含む) を指定することはできない。どちらかに値を指定したら、もう片方には ?
を記述する。
例)
・月曜から金曜の 6:00 pm UTC に実行0 18 ? * MON-FRI *
・毎日 9:00 am UTC に実行0 9 * * ? *
Schedule Expressions for Rules