概要
クラスメソッドさんの記事の通りです。
RDSの設定方法がなかったので、主にRDSの検証内容について記載します。
https://dev.classmethod.jp/articles/tsnote-ec2-ssm-automation/
作業手順
IAMロールの作成
ロール名: event-ssm-automation-role
ポリシーをアタッチ: AmazonSSMAutomationRole
Cloudwatch Eventsにロールを付与するので、信頼関係の編集を実施します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
■RDS用のポリシー作成
必要な権限は以下の通りです。
※DescribeDBInstances がないとSSMオートメーションの実行前と実行後のステータスチェックができなくなります。ステータスチェックが失敗しても動作はしましたが全体のステータスも失敗になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"rds:DescribeDBInstances",
"rds:StopDBInstance",
"rds:StartDBInstance"
],
"Resource": "arn:aws:rds:ap-northeast-1:<AWSアカウントID:db:<DBインスタンス名>"
}
]
}
エラーが出ている場合はSSM→StepIDからエラー詳細を確認できます。
An error occurred (AccessDenied) when calling the DescribeDBInstances operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/event-ssm-automation-role/ba0cd0d13d1b38bbae3b4b2f8bb71482 is not authorized to perform: rds:DescribeDBInstances on resource: arn:aws:rds:ap-northeast-1:xxxxxxxxxxxx:db:kaba-test-auto-start-stop-20210706
CloudwatchEventsの設定
CloudwatchEventsの設定方法についてはクラスメソッドさんの記事にある通りなので割愛いたします。
インスタンスIDの部分はRDSのインスタンス識別子でOK
cron方式の場合は、UTCなので注意が必要です。
SSM ドキュメント
- 停止の場合: AWS-StopRdsInstance
- 起動の場合: AWS-StartRdsInstance
あれ?っとなったところ
全体的なステータス が成功してもステップ1が失敗になるのが気になって調べてみました。
SSMドキュメントのAWS-StopRdsInstanceを確認すると DesiredValues: ["stopped", "stopping"]
で RDSのステータスがstoppedかstoppingになっていれば、ステータスが成功になるので起動中のRDSに対しては「失敗」になっていることが正常でした。
試しに停止中のRDSへ実行してみると「AssertNotStopped」は成功になりました。
なんか気持ちわるいですね(^^;
ステップ名: AssertNotStopped
アクション: aws:assertAwsResourceProperty
ステータス: 失敗
SSMドキュメントのAWS-StopRdsInstance
##一部抜粋
-
name: AssertNotStopped
action: aws:assertAwsResourceProperty
isCritical: false
onFailure: step:StopInstance
nextStep: CheckStop
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: "{{InstanceId}}"
PropertySelector: "$.DBInstances[0].DBInstanceStatus"
DesiredValues: ["stopped", "stopping"]
最終的な実行結果
まとめ
RDSも簡単にcron形式でstop/startが自動化できました!
SNSでSSMオートメーションが失敗した時に通知を送ることもできるようなので次回検証してみたいと思います。