これまでEC2インスタンスの自動起動停止は、EC2を一台起動し、AWS CLIにより実現していました。
しかし、この方法はcronとシェルと駆使するのでとても管理が煩雑でした。
IAMユーザーの追加も必要だったので、セキュリティ的にも今ひとつ。
シェルでインスタンスIDを一台一台定義する必要もあったので、台数が増えれば増えるほどコーディングも複雑になり大変でした。
一番いいのは、せっかくインスタンスにもタグを付ける機能があるので、タグでまとめて停止したり起動したりできるようになることです。
たまたまインターネットを見てみたらこちらの記事を発見!
これは行けるかも?と思ってチャレンジしてみましたが、うまく動作させることができませんでした(T_T)
AWS Systems Manager ドキュメントの作成
サービスを「systems」で検索します。
下に「Systems Manager」が表示されるのでクリックします。
左のサイドバーを下にスクロールすると、一番下にドキュメントが表示されるのでクリックします。
「AWS-ASGEnterStandby」をクリックした後に、画面右上の「Create automation」をクリックします。
名前を入力します。
コンテンツをクリックします。
Editをクリックします。
---
description: Exec AWS-StopEC2Instances
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
AutoStopTime:
type: String
default: PM06
description: (Required) PM06 or PM11
allowedValues:
- PM06
- PM11
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ""
mainSteps:
- name: StopEC2Instances
action: aws:executeAwsApi
inputs:
Service: ssm
Api: StartAutomationExecution
DocumentName: AWS-StopEC2Instance
TargetParameterName: "InstanceId"
Targets:
-
Key: tag:AutoStopTime
Values:
- "{{ AutoStopTime }}"
こちらの内容を貼り付けます。
「Create automation」をクリックします。
「自己所有」をクリックして、先程作成したドキュメントが作成されていることを確認します。
テストします
停止させるEC2インスタンスに、キーがAutoStopTimeで、値がPM06というタグを追加します。
先程作成したドキュメントを開き、「オートメーションを実行する」をクリックします。
「PM06」を選択します。
「実行」をクリックします。
ドキュメントの実行が成功しました。
実際にEC2インスタンスが停止していることを確認します。
CloudWatch Eventで自動実行設定
午後6時にPM06タグが付与されているEC2インスンタンスを停止するようにCloudWatch Eventsに設定します。
IAM ロールの作成
EC2の起動停止はSSM Automationの機能を利用します。
CloudWatch EventsがSSMを呼び出すためのIAMロールを作成。
IAMにアクセスします。
ロールをクリックします。
ロールの作成をクリックします。
EC2をクリックします。
「次のステップ:アクセス権限」をクリックします。
「AmazonSSMAutomationRole」をチェックします。
「次のステップ:タグ」をクリックします。
「次のステップ:確認」をクリックします。
ポリシーに「AmazonSSMAutomationRole」が選択されていることを確認し、「ロールの作成」をクリックします。
信頼関係を編集します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
信頼されたエンティティが「IDプロバイダー events.amazonaws.com」なっていることを確認します。
CloudWatch Eventsの作成
土日は動作させないので、停止は月曜日〜金曜日となります。
ルール名は、「EC2AutoStopPM06」としました。
失敗しました
StopEC2InstancesUsingTagsのオートメーション実行は成功する
自分で作成したStopEC2InstncesUsingTagsを「オートメーションを実行する」で実行すると成功します。
AWS-StopEC2Instanceを直接指定なら成功する
CloudWatchイベントで、自分で作成したドキュメントStopEC2InstancesUsingTagsは失敗しますが、Amazonが所有しているAWS-StopEC2Instanceの実行は成功します。
エラー内容
やはり権限か何かが足らないのか?
さいごに
タグを指定してのEC2インスタンスの停止は失敗しました。
とりあえず、EC2インスタンスを直接指定しての停止は成功しているので、このままで運用します。
失敗例も記事にしておくことで、上手くいくようになったときにはすぐに変更するようにします。