【AWS】EC2インスタンスの夜間停止を自動化する

こんにちは。NTTテクノクロスの増田です。
普段はAWSを用いたインフラ構築を行っています。

# はじめに
本記事では、EC2インスタンスの夜間停止自動化作業についてご紹介します。

# 背景
最近の生成AIブームにおいて、GPUインスタンスの需要が増しています。そこで、コスト削減の観点からインスタンス停止漏れによって夜間に起動しているインスタンスの停止自動化を行いました。

今回は、指定したインスタンスを希望の時間に自動停止するためのリソース構築をご紹介します。

# 構成
構築する簡単な構成図です。
図のサービス以外に、対象インスタンスを管理する Resource Groups & Tag Editor も使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/8ef655e7-866f-4c1c-8cea-9b1f442e488d.png)

# 構築手順
各リソースの構築手順を記載していきます。

### Resource Groups & Tag Editor
- 停止対象のインスタンスをグループ化するため、インスタンスにタグを一括付与します
- リソースグループ作成後、タグエディタを使用することで対象インスタンスを管理できます
- 停止対象から除外したい場合は設定したタグを外します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/f92e5172-a151-44b0-8742-6dedf5e740af.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/48396503-5b0a-4c9e-ab08-10b4afde1ec9.png)

### System Manager
#### IAMロール/ポリシー
- SSMドキュメントに使用するポリシーを設定します
- マネジメントコンソール > IAM  > ロール > ロールを作成 を順に選択し以下を設定します


| 項目 | 設定値 |
|:-|:-|
|  信頼されたエンティティタイプ | AWSのサービス  |
|  ユースケース |  System Manager |
|  許可ポリシー | AmazonSSMAutomationRole ResourceGroupsandTagEditorReadOnlyAccess  |
|  ロール名 |  任意のロール名 |


#### SSMドキュメント
- マネジメントコンソール > System Manager > ドキュメント > ドキュメントの作成 > オートメーション を順に選択します
- 鉛筆マークを選んで"ドキュメント名"を編集、"{} コード"を選択後、コードを記載し、"ランブックを作成" を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/9c844e1a-df61-404a-a626-0d634eb0a042.png)

- ドキュメントのコードは以下を参考にしてください
※"assumeRole"は先ほど作成したロールのARMを記載してください
※"Targets"の”Key：Values"はResource Groupsで設定した"キー：値"を設定してください

```yaml:sample.yaml
description: StopEC2Instances
schemaVersion: '0.3'
assumeRole: arn:aws:iam::AWS:accountId:role/<IAM_roles_name>
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: tag:StopInstance
          Values:
            - 'true'
```

### EventBridge
#### IAMロール/ポリシー
- EventBridgeに使用するポリシーを設定します
- マネジメントコンソール > IAM > ロール > ロールを作成 を順に選択し以下を設定します

| 項目 | 設定値 |
|:-|:-|
| 信頼されたエンティティタイプ  | カスタム信頼ポリシー  |
| カスタム信頼ポリシー  | 以下に記載  |
| 許可ポリシー  |  AmazonSSMAutomationRole |
| ロール名  | 任意のロール名  |

- カスタム信頼ポリシーに記載する内容は以下を参考にしてください
```json:sample.json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "scheduler.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		}
	]
}
```

#### EventBridgeスケジュール
- マネジメントコンソール > EventBridge > スケジュール > スケジュールを作成 を順に選択します
- [スケジュールの詳細を定義] ページは以下を参考にしてください
※cron式には停止したい任意の時間を設定します

| 項目 | 設定値 |
|:-|:-|
| スケジュール名 | 任意のスケジュール名 |
| 頻度  | 定期的なスケジュール |
| スケジュールの種類 | cronベースのスケジュール |
| cron式 | ex) 平日AM0時：cron( 0  0  ?  *  MON-FRI  * )|
| フレックスタイムウィンドウ | オフ |

- [ターゲットの選択] ページで すべてのAPI > System Manager > StartAutomationExecution を選択し以下を記載します
- "document_name"に先ほど作成したドキュメント名を記載してください

```json:sample.json
{
  "DocumentName": "<document_name>"
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/6c50489d-b9cc-4f61-9811-158633b2bb2e.png)

- [設定] ページの [アクセス許可]で先ほど作成したロールを選択し、作成してください

# まとめ
以上、EC2インスタンスの夜間停止自動化作業についてご紹介しました。

サーバーレスアーキテクチャの拡大により変化があるものの、インスタンスの活用は依然として有用だと考えます。
今後もAWS環境のコスト削減に向けたサービスの活用事例をご紹介させていただきます。