【AWS】オートメーションでEC2を自動停止・起動する手順（画像付き）

## はじめに
EC2インスタンスを検証環境と本番環境で分けている場合、検証環境を丸一日起動させたくないときに自動で停止起動を組み込みたい。

## 使用環境
- VPC
EC2インスタンスを配置するのに必要
- EC2
自動停止・起動する対象
- Systems Manager（SSM）
今回の主役
- Amazon EventBridge
SSMターゲットを紐付けるために必要

## やってみた
### ドキュメントを作成する
「AWS Systems Manager」を開き、左から「共有リソース」＞「ドキュメント」を開きます。
「Create document」から「Automation」をクリックします。
![スクリーンショット 2022-05-04 23.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/55f4663e-a2f1-3efb-63fe-7a67250a8fe4.png)


名前を入力して、エディタを開きます。
今回はご自身がわかるように設定してください。
![スクリーンショット 2022-05-05 0.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/b4e8ac61-12f4-1cbd-2959-1823eacff932.png)

エディタの中身を以下の通りにしました。
パラメータの説明は後述の通りです。
```
---
description: Exec AWS-StopEC2Instances Tags:Staging
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  Environment:
    type: String
    default: Staging
    description: (Required) Staging or Product 
    allowedValues:
    - Staging
    - Product
  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:Environment
           Values: 
             - "{{ Environment }}"
```

|パラメータ|内容|
| ----| ----|
|description|エディタの概要を書く|
|schemaVersion|スキーマのバージョンを書く<br>★以下の公式ドキュメントを参考にしてみてください<br>[SSMドキュメントスキーマの機能と例](https://docs.aws.amazon.com/ja_jp/ja_jp/systems-manager/latest/userguide/document-schemas-features.html)|
|assumeRole|このオートメーションを実行するロールを持つIAMユーザ(ARN形式)を書く<br>★記載がなければIAMユーザアカウントの管理者権限で実行される<br>★今回はパラメータセクション内にある「AutomationAssumeRole」を参照するようにしています<br>ベストプラクティスは以下の公式ドキュメントを参考にしてください<br>[委任管理者を使用して、オートメーションを実行する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-walk-security-delegated.html)<br>[IAMを使用して、オートメーションのロールを設定する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-permissions.html#automation-role)|
|Parameters|パラメータを入力する箇所を定義できます<br>今回はEC2の使用環境を意味する「Environment」と実行する委任ロールが付与された「AutomationAssumeRole」を定義しました<br>以下の画像を参考にパラメータと反映される箇所をインプットしてみてください。<br>![スクリーンショット 2022-05-06 10.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/26a9c867-99bc-2977-24aa-db52cab6b805.png)|
|mainSteps|ドキュメントに記載されている実行オブジェクトをステップとして定義されています。<br>セクションの書き方は以下の公式ドキュメントを参考にしてみてください。<br>[Systems Manager Automationアクションのリファレンス](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html#automation-common)<br>[AWS APIオペレーションの呼び出しと実行](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-executeAwsApi.html)<br>[StartAutomationExecution](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartAutomationExecution.html)<br>★ドキュメント上には以下の画像のように表示されます。<br>![スクリーンショット 2022-05-06 10.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/c8534ecc-1f19-29fc-6daa-657a4a824fb7.png)|


作成したら、「自己所有」に作成されています。
![スクリーンショット 2022-05-05 0.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/26a52f74-b9e6-c446-653b-67dc7f930a54.png)


今回はEC2を停止起動するので、停止と起動で1つずつ作りましょう。
![スクリーンショット 2022-05-05 0.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/ced56254-ee31-9c1d-161c-c928ef7a571b.png)


### 動作確認してみる
#### EC2を停止
作成した停止ドキュメントを選択して、オートメーションを実行します。
![スクリーンショット 2022-05-06 11.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/1f75cacd-0dde-b98d-1a87-4c32e3b2b69f.png)

「シンプルな実行」で入力パラメータは「Staging」、AssumeRoleは「なし」で実行します。
![スクリーンショット 2022-05-06 11.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/5d04f401-e711-a85d-7b37-c19f0cfed8da.png)

実行が開始されます。
![スクリーンショット 2022-05-06 11.58.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/dbca3bfd-3862-6d5c-2ae3-94c2e262a604.png)

実行履歴は「変更管理」＞「自動化」内で確認できます。
![スクリーンショット 2022-05-06 12.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/08f8dbd5-161f-10e0-069c-3b0aa7bc2d04.png)
作成したドキュメント内のステップ実行履歴
![スクリーンショット 2022-05-06 12.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/7e1d7a0b-3889-3f89-3d31-08b9b2c273ff.png)
「AWS-StopEC2Instance」というAWSが所有しているドキュメントを実行した履歴
![スクリーンショット 2022-05-06 12.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/ec1a235d-9e40-da6d-de48-20c19929d1bc.png)
![スクリーンショット 2022-05-06 12.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/598bdf24-f16a-36cf-4d6d-e1b5359f2ff9.png)

停止ができました。
![スクリーンショット 2022-05-06 12.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/c53556b4-e8e8-b659-9dc7-20417787f7aa.png)


#### EC2を起動
作成した起動ドキュメントを選択して、オートメーションを実行します。
![スクリーンショット 2022-05-06 12.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/6fcb96a6-7fc9-9dbf-87a6-9f7232947656.png)

実行履歴を見れば成功しています。
![スクリーンショット 2022-05-06 12.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/83d6d5c8-4c71-dc8b-3666-4820dc494b36.png)
![スクリーンショット 2022-05-06 12.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/82e9e86e-0dce-58c6-f036-044c7fe0735d.png)
![スクリーンショット 2022-05-06 12.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/c86778a6-cc65-4a67-5369-79e6465b6000.png)
![スクリーンショット 2022-05-06 12.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/f5556135-ecfd-dc7a-dadb-7da3fd256bbd.png)

EC2も起動できました。
![スクリーンショット 2022-05-06 12.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/97351167-4f0e-83db-66c3-dcc350d187c9.png)


### Amazon EventBridgeでスケジューリング
Cloudwatch Eventsは古いサービスなので、Amazon EventBridgeで実施します。
サービスを起動して、「イベント」＞「ルール」、「ルールを作成」をクリックします。
![スクリーンショット 2022-05-06 12.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/271fd92b-ff56-cf3c-ef18-67ce6ccf1ca8.png)

今回は決まった時間に停止と起動を行いたいので、「スケジュール」タイプのルールタイプを指定します。
![スクリーンショット 2022-05-06 12.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/12cbe6c2-3404-aeb8-1ee8-dab521513980.png)

スケジュールはCron形式で行います。
※例では、毎日21時に停止する想定です。
書き方は以下の公式ドキュメントを参考にしてください。
[スケジュールに従って実行する Amazon EventBridge ルールの作成](https://docs.aws.amazon.com/ja_jp/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html)
![スクリーンショット 2022-05-06 12.33.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/f6c664f9-19f3-8833-2747-6f208f9587a8.png)

ターゲットを作成したSystems Managerオートメーションのドキュメントを指定してあげます。
![スクリーンショット 2022-05-06 12.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/c7246b3b-66ba-0602-ca9f-13f63a5c834f.png)

作成しようとしたら、エラーが発生しました。（２2年/4月段階）
理由は、`実行ロールを指定する際にEC2を停止・起動するポリシーを持ったIAMロールが必要でした`
新規で作成することはできないようですので、IAMポリシー作成後、ロールにアタッチしていきます。
![スクリーンショット 2022-05-06 17.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/30b029d8-499c-4552-6c17-19b80e34be12.png)

#### IAMロールとポリシーを作成
まずはEC2の停止・起動のポリシーを作成します。
（{Your Instance}はご自身のAWSアカウントIDを入れてください）
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:StopInstances",
            "Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "tag:GetResources",
            "Resource": "*"
        }
    ]
}
```

Systems Managerのオートメーションから実行されるので、専用のIAMロールを作成します。
IAMロールからユースケースを「EC2」選択。
許可ポリシーが以下の画像を参照。
![スクリーンショット 2022-05-06 17.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/30e10da3-9ec5-ee37-7e9b-06b650ed841f.png)

信頼関係を選択して、信頼ポリシーを編集します。
![スクリーンショット 2022-05-06 17.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/1aa3a1c8-099c-c68c-6346-24692156f61a.png)


#### 再びEventBridgeに戻ってきた
実行ロールに先ほど作成したロールを指定する。
![スクリーンショット 2022-05-06 18.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/4a8f590b-dcf6-8e49-82db-18ee3f186890.png)

無事に作成できました。
![スクリーンショット 2022-05-06 18.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/44076542-4d7f-0ab6-42bb-7412c029a105.png)

起動分のルールも作成します。
![スクリーンショット 2022-05-06 18.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/d6afe087-da8f-6eb8-c665-f58270cf2135.png)
![スクリーンショット 2022-05-06 18.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/09466a41-c439-4461-be9a-6e264f9161b3.png)

無事に作成完了です。
![スクリーンショット 2022-05-06 18.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/6e6cff1f-59e2-72eb-b2d8-67cf5af32548.png)


## 最後に
EventBridgeからSSMオートメーションが起動され、EC2インスタンスが停止・起動とされればOKです。
実行履歴はCloudTrailからも確認することができます。
実行しない場合は以下の理由が考えられますので、切り分けの参考としてください。

- EC2のタグがドキュメントのパラメータセクションと紐づいていない
- イベントが有効にされていない
- イベントスケジュールの設定が誤っている（基準時刻がローカルタイムゾーンとなっているとか）


## 参考
[SSMドキュメントの構文](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-doc-syntax.html)
[aws:executeAutomation – 別のオートメーションを実行する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-executeAutomation.html)