タグ付きAWS EC2の自動停止・自動起動

AWSで設定検証する際にEC2を立てて起動したままで無駄な課金を発生させてしまうことが多々あり、反省を込めてEC2の自動停止（+自動起動）の設定を記事にします。対象EC2の判別はタグ付けで行い、特定のタグが付いているEC2のみを対象とします。

# 本記事でのゴール
時間になったら特定のタグが付いているEC2を自動停止、自動起動する

![スケジュールイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2fbd5ba6-d317-cd0a-143f-2b0d92519dc3.jpeg)

設定構成としてこんな感じです。
![EC2_自動停止_全体構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/ea627f47-283a-33ed-a6f3-6a14c1085769.jpeg)

[AWS EventBridge]で時間指定で、SSM内の実行したい内容を記述した[ドキュメント]を呼び出し、[Run Command]で実行すると流れになります。

# 前提条件（免責事項）
- タグ付けしたEC2を対象として自動停止、自動起動を行う
- 自動化はAWS System Manager(旧SSM)を利用し、時間指定によるトリガーはAWS EventBridgeを利用する
- 本件の停止処理はOSからのシャットダウンとは違い、OS内のデータが破損する可能性があります


# 設定流れ
① 実行時に利用するIAMロールを作成
② EC2に特定タグを付与
③ 動作内容を記述したSSMドキュメントを作成
④ AWS EventBridgeで時間指定でSSMドキュメントを呼び出す設定






# 実際にやってみた
## ①実行時に利用するIAMロールを作成
後ほど作成する③のドキュメントで作成したロールを使って処理を実行するように記述しますので、そのロールを作っていきます。
AWSコンソール画面で[IAM]>[ロール]にアクセスし、新規ロールを作成します。「信頼されたエンティティを選択」で「カスタム信頼ポリシー」を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/eb5c23a4-d4d2-ee43-2ca5-b8afb2c4b3ba.png)

ポリシーは以下の内容を記述します。

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

```

許可するポリシーには以下２つを追加します。

・AmazonSSMAutomationRole
・ResourceGroupsandTagEditorReadOnlyAccess
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5d79d901-2d1a-b74d-3347-ee99832e4949.png)

設定後はこんな感じになります。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/d6981a09-8511-8812-7441-0a9f899de82b.png)

ロールを作成した後にARNを控えておきましょう。後ほど設定に必要となります。

## ②EC2に特定タグを付与
自動起動、自動停止の対象としたいECを起動させたあと、「タグ」の設定で任意のタグを設定します。今回は自動停止はキー名=”STOP”で値="STOP"という設定にします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c3be1095-2ea3-0213-e56f-578ec88794cf.png)

自動起動も同じようにキー名=”START”で値="START"で設定します。これで対象のEC2を選別する設定ができました。

## ③動作内容を記述したSSMドキュメントを作成
では実際の動作内容を記述するドキュメントを作成していきます。左下の「共有リソース」-「ドキュメント」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c9b9ca85-33d0-031b-ec01-813174f517e6.png)



右上のアクションタブ横の「ドキュメントの作成」をクリックし、「オートメーション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/758e4b57-089c-14cc-55fa-47ef79b99d1a.png)

こんな感じでどういう操作をするか記述する画面が表示されますので、ここに内容を記載していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9cac5a5d-db1a-65d8-c135-8b75323586c5.png)

左上の「NewRunbook」はドキュメント名になるので判別しやすい任意のものに変更してください。
自動停止の記載はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/34864263-19ea-e7a5-5f22-bd4c2941a665.png)

```
description: StopEC2Instances
schemaVersion: '0.3'
assumeRole: arn:<①で作成したIAMロールのARN>
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: tag:STOP
          Values:
            - STOP
```
この内容の”STOP”の部分を”START”に書き換えたものが自動起動のドキュメントになりますので、セットで作成していきます。

この段階でこのドキュメントの内容が実際に動作するのかはテスト可能ですので左上の「オートメーションを実行する」でテストしてみましょう。テスト結果は「変更管理」＞「オートメーション」をクリックして実行ログで確認可能です。ステータスがSuccessになっていればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1c18e5c7-2eed-d015-273c-a8f352628d8d.png)

## ④AWS EventBridgeで時間指定でSSMドキュメントを呼び出す設定
あとはAW EventBridgeで設定したドキュメントを呼び出せればOKです。「ルールの作成」をクリックして、ルールを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1a295f4f-7aa9-50e2-3c2b-2e8dca9f4530.png)

ルールの名前は任意の値を設定し、ルールタイプを「スケジュール」に設定し、「続行してルールを作成する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/859ceaf1-cf48-8056-ad1a-d560ab223f43.png)

スケジュールパターンで「特定の時刻~」を選択し、Cronを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0a63e8f1-6c60-c66e-6994-7c9fd1cf6b22.png)

画像では自動停止側のルールを設定しているので、毎日20：00に実行したいため上記のように設定しました。
設定パラメーターは日付を「？」に「月」、「曜日」、「年」の値を「*」に設定します。
タイムゾーンがUTCになっているため、日本時間になっているか注意してください。

ターゲットタイプを「AWSサービス」で、ターゲットを「SystemManagerオートメーション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5b88b827-c3ff-48dd-be07-36189f90b248.png)

あとはロール名やドキュメント名は先ほど作成したものを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/ac1dbd04-8fbd-0bd2-d3c3-7de603ac86dd.png)

:::note info
このルールセットをcronの時間設定と実行ドキュメントを変えて***自動停止分***と***自動起動分***の２つ作成すれば完成です。
:::

# 終わりに
lambdaでコードを書く方法もあるみたいですがなるべくコードは書きたいない精神で設定してみました。手抜きをして自動起動側の設定はあまり載せずに記事にしてしまいましたのであしからず。


# 参考

https://www.k-friendly.com/15801


https://iret.media/94309