AWS EC2インスタンスの起動/停止をスケジュール実行（タグ指定あり）

## 1. はじめに
テスト環境の場合、コスト削減の観点で、決まった時間に起動、停止したいケースは多いと思います。
よくある方法として、インスタンスIDを指定する方式がありますが、対象のインスタンスが変動する場合は、メンテナンスが面倒になります。

ベターな方法として、タグの編集で制御する方法が考えられます。

本記事では、定期的なEC2の起動/停止を特定タグで管理して実現する方法を纏めました。

## 2. 実現したいこと（要件）
- 稼働時間帯：月-金の9時-20時
- 停止要件
    - 時間帯：月-金の20時に対象インスタンスを停止する
    - 対象インスタンス：下記のタグが設定されていること
        - Key：EC2AutoStop
        - Value：true
- 起動要件
    - 時間帯：月-金の9時に対象インスタンスを起動する
    - 対象インスタンス：下記のタグが設定されていること
        - Key：EC2AutoStart
        - Value：true

## 3. 構成図
停止要件を満たす、構成は下図の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/63c232a7-27bb-0ceb-ad20-d0f5cb75cca8.png)

##### 実行の流れ
- ①Amazon EventBridgeにより、設定した時刻にSSMのDocumentsを呼出す
- ②SSMのDocumentが、条件が一致するタグを検索し、該当のEC2インスタンスを停止
※起動要件は停止と同じになる為、記載省略

## 4. 実装の流れ
- 事前準備
    - テスト用EC2準備
- IAM
    - ポリシー作成：タグ情報取得用
    - ロール作成：SSM操作実行用
- SSM
    - デザイン編集：StartAutomationExecutionを流用
    - コード編集：タグ指定版にカスタマイズ
- EventBridge
    - スケジュール設定
    - ターゲット選択：SSMのドキュメント指定

## 5. 事前準備（テスト用EC2準備）
①　EC2を2台用意する
停止/起動対象として処理されるもの、されないものをテストしたい為

②　タグを設定する。
EC2AutoStart、EC2AutoStopをそれぞれ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/327370d3-6bcd-8509-dace-9f25800af378.png)

## 6. IAM
下記記事を参考に「ポリシー」「ロール」を作成してください。
https://www.k-friendly.com/16551

①読替え1：作成対象
　起動・停止それぞれで作成する必要はありません。兼用可

②読替え2：信頼ポリシーを編集
　編集前： “Service”: “**ec2**.amazonaws.com”
　編集後： “Service”: “**scheduler**.amazonaws.com”
　※このIAMロールは、EventBridgeSchedulerが実行する為、上記サービス名になります

## 7. SSM
### 7.1 デザイン編集：StartAutomationExecutionを流用
①AWS Systems Managerに移動する
②左メニューから、「ドキュメント」をクリックする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/d0a86138-2c16-b6de-64c2-943db7f88a34.png" width=25%>

③「ドキュメントの作成->オートメーション」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/86f78185-5f38-3b6f-3fef-88086b1ef144.png)

④任意の名前を設定し、AWS APIタブをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/d7f7b2a7-132c-330e-668e-e62e452d8000.png)

⑤StartAutomationExecutionを検索
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/187039e8-a0d8-8091-150b-3dd7fbd6b06f.png" width=25%>

⑥ドラックして配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/4d866a87-f3d5-f352-6f61-cfe8a65022f9.png)

### 7.2 コード編集：タグ指定版にカスタマイズ
①コードモードで編集
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/f48b268a-cde1-a603-21ae-edf9f4f469bf.png" width=25%>

②カスタマイズ
```ruby:編集前
schemaVersion: '0.3'
description: '*このデフォルトのテキストをランブックに関する指示や他の情報に置き換えてください。* --- # Markdown とは何ですか? Markdown とは、プレーンテキスト形式のコンテンツを、構造的に有効なリッチテキストに変換する軽量のマークアップ言語です。## 見出しを追加できます *斜体*を追加したり、フォントを**太字**にしたりできます。1. 番号付きリストを作成する * 箇条書きを追加する > `コードサンプル`にインデントを設定する [別のウェブページへのリンク](https://aws.amazon.com) を作成できます。'
mainSteps:
  - name: StartAutomationExecution
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
```
```ruby:編集後
schemaVersion: '0.3'
description: Stop EC2 instances by tagname
parameters:
  TagName:
    type: String
    description: ''
    default: EC2AutoStop
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: tag:{{ TagName }}
          Values:
            - 'true'
```
- parameters:追加
    - TagNameを設定
    - default：停止用タグ名を指定
    - description：任意
- mainSteps:
    - name：任意
    - DocumentName: AWS-StopEC2Instanceを指定
    - TargetParameterName: InstanceIdを指定
    - Tatgets：EC2停止条件を設定

③「ランブックを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/5538e10d-1942-b3e7-61ba-022cf2b1969a.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/c802e4ac-0f74-de4e-ccb2-e6bd5062b6db.png" width=25%>

④「自己所有」タブから該当ドキュメントが作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/0cf1f9ba-a69b-b391-ed77-90b003f9316f.png)

⑤検証
作成したドキュメントをお試し実行する
「オートメーションを実行する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/e142edbf-7af8-de1a-8ef7-d234ca30783f.png)

何も変更せず、「Excecute」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/0daf9035-494a-258f-47f3-802ad9d6856e.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/220da921-6bac-ac4d-4f47-ef88674bd94f.png)

EC2停止の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/9b362ecb-7da1-1eaf-d5fb-c29e9afb31db.png)

## 8. EventBridge
### 8.1 スケジュール設定
①「EventBridge」を検索する
②左のメニューから、「スケジュール」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/4f27a805-54fe-2fec-c8b4-73a3fdfdd1f6.png" width=25%>

③「スケジュールを作成」をクリック
④スケジュール名と説明を入力
任意の情報を記載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/fd5f0f6f-fa57-f19e-8d44-afb18928c067.png)

⑤スケジュールのパターン
停止要件を満たす時間帯を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/8c0a87ac-c47e-1fab-eb19-475d88d9896c.png)

夏時間は特に設定せず、次へを押下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/01079b35-1023-0550-4959-8aacb7f1474d.png" width=50%>

### 8.2 ターゲット選択：SSMのドキュメント指定
①「すべてのAPI」を選択
②「Systems」を検索し、「SystemsManager」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/8f201a70-a27b-05f9-bc94-fe138aa8a3d9.png)
③「StartAuto」を検索し、「StartAutomation」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/614f6b68-d43f-6ab7-bdb9-f2e4575d18fe.png)

④入力に作成した、「EC2AutoStop」のドキュメントを指定し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/ddc6f131-3898-7850-a7ea-3ff6c2615053.png)

⑤スケジュールを有効化
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/c784b196-b1ca-6791-f998-68895558b9f6.png" width=50%>

⑥既存ロールを設定
「6. IAM」で作成したロールを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/3cdb08e5-341c-1aee-1183-e496d340e5c1.png)

⑤「スケジュールを作成」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/724d5149-c102-6138-f275-faef393f1517.png" width=50%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/cee9129e-cf78-4759-2285-e047e61932f6.png" width=50%>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/d6bfb730-4a45-fbee-cf20-288cf2db7581.png)

## 9. EC2起動要件の対応
#### 9.1 SSM
「7. SSM」で作成したドキュメントを流用する
①「EC2AutoStop」を選択し、アクションから「ドキュメントのクローン作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/7c5814f1-f17f-7579-a0de-1a147e2c5795.png)

②ドキュメント名編集し、「コードモード」で編集する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/045e9646-ff1b-f1e4-90ac-eb2faf9dfba9.png" width=50%>

③「Stop」を「Start」に置き換え、ランブックを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/da255c4f-96a8-92f4-157f-280ad2fbf5ac.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/30e3bd59-dc46-e527-137f-7f399c5ea9a7.png" width=50%>

④ドキュメント作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/94718665-0226-e973-864f-ea9afb200123.png)

⑤検証
作成したドキュメントを実行する
「オートメーションを実行する」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/ab2a6137-5551-6c48-c73e-6317e76640f1.png)

「Excexute」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/b6683b29-6c7d-a1be-b07d-a51b48d46035.png)

⑥実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/3d3470ca-20b1-322d-6d44-035ba22db46f.png)

7.SSM⑤で「停止」したインスタンスが「実行中」になったことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/ca959964-f8bd-eb61-8c00-7df25b4bec42.png)

#### 9.2 EventBridge
「8. EventBridge」と同様に作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/d31166e1-2fe9-c54e-7de7-62a3aed31361.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/e8fe414b-484a-899b-01c6-66cdf70d0682.png)

## 10. 全体テスト
スケジュールの時刻をテスト時間に近い時刻に設定し、
想定通りの動作を確認した方が良いと思います。
今回は割愛します。

## 引用元
本記事は下記資料を参考に作成しています。
- [【手順】タグで指定したEC2インスタンスを毎日20時に自動停止する](https://www.k-friendly.com/15801)

- [AWS EventBridgeでSSM Automationを使用して特定タグのEC2の開始と停止をスケジューリングする](https://it-ouji.com/2021/10/11/aws-eventbridge%E3%81%A7ssm-automation%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E7%89%B9%E5%AE%9A%E3%82%BF%E3%82%B0%E3%81%AEec2%E3%81%AE%E9%96%8B%E5%A7%8B%E3%81%A8%E5%81%9C%E6%AD%A2%E3%82%92/)