AWS Resource Schedulerの設定を、OUを使わずに任意の複数アカウントに展開したい

本記事を閲覧いただき、ありがとうございます。
駆け出しクラウドエンジニアの青木です。

## 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 を作成する
[こちら](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml) をダウンロードし、必要に応じてロールを変更

参考ドキュメント：https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html

#### 2. 同様に Quick Setup のデプロイターゲットのアカウントでも AWSCloudFormationStackSetAdministrationRole を作成する
[こちら](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml) をダウンロードし、必要に応じてロールを変更

参考ドキュメント：同上


#### 3. AWSCloudFormationStackSetExecutionRole.yml をダウンロードし、以下のように変更
[こちら](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/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***

![{68D6FE44-BC78-45C8-AF0B-2F112CC4F686}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/0ea51e52-39e7-6607-a834-051c711d2244.png)

- デプロイ先: ***スタックをアカウントにデプロイ***
　- ***ターゲットアカウントの ID***
![{7918B2D6-3DD9-4099-9928-1DC6AB4BFADC}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/7e5cf75b-abfb-2849-85e6-cb35b1f2408f.png)

- リージョンの指定: ***任意***

![{20355D11-191D-403D-8671-269C06472568}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/d6307269-a397-c2b4-10cd-8d3315effc15.png)

***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インスタンスのみ、指定した時間に起動・停止されることを確認する

以上で説明は終了です。
お疲れ様でした！