はじめに

業務時間帯のみ稼働できれば良いインスタンスに関して、始業時と終業時に手動で起動停止していると手間がかかりますので、自動で起動停止してくれる仕組みを作ろうという話です。

実現したいこと

  • 平日の10:00にインスタンスを自動起動し、19:00に自動停止するように設定(休日は終日停止)
  • 対象のインスタンスはタグで指定
    ※対象をインスタンスID等で指定すると、リストア時に設定の変更が必要となってくるため今回はタグで対象のインスタンスを指定する
  • AWSのマネージドサービスを使用する

使用したAWSリソース

  • EventBridge
  • AWS Systems Managerドキュメント
  • IAMロール

作成手順

1. IAMロールの作成

EventBridgeとSSMドキュメントを設定時に使用するIAMロールを事前に作成します。

1-1. AWSコンソールの[IAM] > [ロール]から、[ロールを作成]よりIAMロール新規作成画面に移動

1-2. [信頼されたエンティティを選択]より[カスタム信頼ポリシー]を選択し、以下を入力し[次へ]

今回EventBridgeとSSMドキュメントにて使用するため、サービスにはこの二つを指定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "events.amazonaws.com",
                    "ssm.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

1-3. 以下二つのポリシーをアタッチし、[次へ]

AmazonSSMAutomationRole

SSMからインスタンスを起動停止するための許可ポリシー

ResourceGroupsandTagEditorReadOnlyAccess

タグの「key」と「Value」を取得するための許可ポリシー

1-4. [ロール名]を任意の値で入力し、内容確認後、[ロールを作成]

1-5. 次のSSMドキュメント作成時必要になるので、ARNを控えておく

2. SSMドキュメントの作成

2-1. [AWS Systems Manager] > [ドキュメント] > [ドキュメントの作成] > [オートメーション]を選択

2-1-1. EC2起動のためのSSMドキュメントを作成[1]

左上にリソース名を入力し、[{} コード]から以下の「assumeRole」にIAMロールのARNを入力し、「Key」と「Values」には対象リソースを決めるためのタグを入力し、[ランブックを作成]

description: StartEC2Instances
schemaVersion: '0.3'
assumeRole: IAMロールのARN
mainSteps:
  - name: StartEC2Instances
    action: 'aws:executeAwsApi'
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StartEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: 'tag:'
          Values:
            - ''

2-1-2. EC2停止のためのSSMドキュメントを作成[2]

左上にリソース名を入力し、[{} コード]から以下の「assumeRole」にIAMロールのARNを入力し、「Key」と「Values」には起動時と同様のタグを入力(今回一つのタグで起動停止設定をしたいため)し、[ランブックを作成]

description: StopEC2Instances
schemaVersion: '0.3'
assumeRole: IAMロールのARN
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: 'tag:'
          Values:
            - ''

3. EventBridgeルールの作成[3]

[Amazon EventBridge] > [ルール]に移動

3-1-1. EC2起動のためのEventBridgeルールを作成

「名前」を入力し、ルールタイプで「スケジュール」を選択し「続行してルールを作成する」

3-1-2. cron 式でインスタンスを起動したい時間を指定し、[次へ]

月〜金:10:00起動

3-1-3. ターゲットで、作成した起動用のSSMドキュメントとIAMロールを指定して、[ルールの作成]

3-2-1. EC2停止のためのEventBridgeルールを作成

「名前」を入力し、ルールタイプで「スケジュール」を選択し「続行してルールを作成する」

3-2-2. cron 式でインスタンスを停止させたい時間を指定し、[次へ]

月〜金:19:00停止

3-2-3. ターゲットで、作成した停止用のSSMドキュメントとIAMロールを指定して、[ルールの作成]

4. 動作テスト

4-1. SSMドキュメント作成時に設定したタグをEC2に付与

4-2. EventBridgeで設定した起動時間のスケジュールを直近の時間に変更し、起動できることを確認

CloudTrailより指定時間に起動していることを確認

4-3. 同様にEventBridgeで設定した停止時間のスケジュールを直近の時間に変更し、停止できることを確認

CloudTrailより指定時間に停止していることを確認

参考

[1]AWS-StartEC2Instance

https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-aws-startec2instance.html

[2]AWS-StopEC2Instance

https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-aws-stopec2instance.html

[3]スケジュールに従って実行する Amazon EventBridge ルールの作成

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html