本記事を閲覧いただき、ありがとうございます。
駆け出しクラウドエンジニアの青木です。
Resource Schedulerとは
AWS Systems Manager内Quick Setupの機能の中の一つで、特定のタグが付いたEC2インスタンスの起動/停止時間を、任意の時間に・一括で 設定できるサービスです。
裏ではCloud Formation StackSetが動いて設定をデプロイしているそうです。
詳しくは公式ドキュメントを参照:
・https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/quick-setup-scheduler.html
・https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/quick-setup-getting-started.html
今回やりたいこと
作業中のアカウントから、別の複数のアカウントに向けて一括でResource Schedulerを展開したい。
今回はOUを指定する方法ではなく、任意の複数アカウントに対し設定を行います!
例)
対象アカウント内の「キー: stop-start」「バリュー: on」タグがついたすべてのEC2インスタンスに対し、起動時間を9:00~、停止時間を17:00~に設定する
サポートに聞いてみた結果、Cloud Formation StackSetでResource Schedulerを明記・実行する形になるようです。
やってみた
以下、AWSサポートにてご教授いただき、試してみてうまくいった方法です。(サポートの方本当にありがとうございます!!)
1. Quick Setup のデプロイの操作を行うアカウントにAWSCloudFormationStackSetAdministrationRole を作成する
こちら をダウンロードし、必要に応じてロールを変更
2. 同様に Quick Setup のデプロイターゲットのアカウントでも AWSCloudFormationStackSetAdministrationRole を作成する
こちら をダウンロードし、必要に応じてロールを変更
参考ドキュメント:同上
3. AWSCloudFormationStackSetExecutionRole.yml をダウンロードし、以下のように変更
こちら をダウンロードし、以下のように変更
参考ドキュメント:同上
【 変更前 】
Principal:
AWS:
- !Ref AdministratorAccountId
【 変更後 】
Principal:
AWS:
- !Ref AdministratorAccountId
- !Ref AWS::AccountId
4. 3.で作成(変更)したテンプレートを用いてQuick Setup のデプロイターゲットのアカウントにAWSCloudFormationStackSetExecutionRoleを作成
5. Quick Setup のデプロイの操作を行うアカウントで CloudFormation StackSets をデプロイする
設定項目には以下を設定します。
-
アクセス許可モデル: セルフサービスのアクセス許可
-
IAM 管理ロール ARN: AWSCloudFormationStackSetAdministrationRole
-
IAM 実行ロール名: AWSCloudFormationStackSetExecutionRole
StackSetsテンプレートの例を以下に示します。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
SSMQuickSetupTestConfigurationManager:
Type: "AWS::SSMQuickSetup::ConfigurationManager"
Properties:
Name: "custom-cfn-stacksets"
Description: "custom-cfn-stacksets"
ConfigurationDefinitions:
- Type: "AWSQuickSetupType-Scheduler"
Parameters:
TargetTagKey: "test"
TargetTagValue: "hoge"
ICalendarString: "BEGIN:VCALENDAR\nX-CALENDAR-TYPE:DEFAULT_CLOSED\r\nVERSION:2.0\r\nPRODID:-//AWS//Change Calendar 1.0//EN\r\nBEGIN:VEVENT\r\nUID:ce44a521-4297-4df7-aacf-c8f3708dd4a6\r\nSEQUENCE:0\r\nDTSTAMP:20241209T061807Z\r\nDTSTART;TZID=Asia/Tokyo:20241209T090000\r\nDTEND;TZID=Asia/Tokyo:20241209T170000\r\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR\r\nSUMMARY:Custom start-stop schedules\r\nEND:VEVENT\r\nEND:VCALENDAR"
TargetAccounts:
Ref: AWS::AccountId
TargetRegions:
Ref: AWS::Region
LocalDeploymentAdministrationRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/AWSCloudFormationStackSetAdministrationRole"
LocalDeploymentExecutionRoleName: "AWSCloudFormationStackSetExecutionRole"
※ ICalendarString
項目内 UID
について
ICalendarStringは必須項目です。
UID は必ずしも Resource Scheduler で作成する必要はなく、何らかの方法でユニークな ID が作成できれば問題ありません。
例えば、以下のコマンドをWindows PowerShellで実行して作成したUIDを使用してもOKです。
[Guid]::NewGuid()
参考(外部サイト):https://torutk.hatenablog.jp/entry/20160519/p1
6. Stack Sets デプロイ先のアカウントで、指定したタグ(上記の例ではキー: stop-start、バリュー:on)がついたEC2インスタンスのみ、指定した時間に起動・停止されることを確認する
以上で説明は終了です。
お疲れ様でした!