EC2を自動停止・自動起動する

使用していない時間の稼働費用ってもったいないですよね...！
お高いインスタンスを止め忘れて連休明けに絶望したことはありませんか。
そんな時に役立つEC2の自動停止と自動起動の設定方法をまとめました。(今更感ありますが)
CloudWatchEvent と SSMAutomation を利用します。

## 自動停止

自動停止の方が簡単。

* `CloudWatch` > `ルール` > `ルールの作成` をクリック
![スクリーンショット 2020-10-14 14.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/b0aed48b-6540-8288-848f-8c01dbff4c54.png)
* `スケジュール` で `Cron式` を選択
* 自動停止させたい時間をcron式で入力する
    * GMTなので日本時間に合わせるために **-9時間** する
    * 例: 毎日23:00に停止させたい → `00 14 ? * * *`
![スクリーンショット 2020-10-14 14.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/859be7a1-f71e-d249-971f-84c83f7d29b7.png)
* `ターゲット` のアクションから「EC2 StopInstances API 呼び出し」を選択
    * 「stop」を入力するとすぐに出てくる
![スクリーンショット 2020-10-14 14.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/e230305a-d83f-0397-4833-df6819181557.png)
* `インスタンスID` に対象のインスタンスIDを入力
* 他にも停止させたいインスタンスがある場合は「ターゲットの追加」をクリックし同様に追加
* 完了したら「設定の詳細」をクリック
* 任意のルール名と説明を入力
    * ルール名は後から変更できないので注意
* 有効化にチェックが入っていることを確認して「ルールの作成」をクリック

## 自動起動

SSMAutomation実行用ロールが必要。
すでにある場合は [イベントルールの作成](#イベントルールの作成) へ。

### SSMAutomation実行用ロールの作成

* `IAM` > `ロール` > `ロールの作成` をクリック
![スクリーンショット 2020-10-14 15.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/bb2ec6f5-a1b3-6eeb-5a65-8e561ba6ebb8.png)
* `AWSサービス` > `EC2` を選択して次のステップへ
![スクリーンショット 2020-10-14 15.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/aa17f006-cb28-4fbe-4886-23486d50378e.png)
* 「AmazonSSMAutomationRole」を選択して次のステップへ
![スクリーンショット 2020-10-14 15.26.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/e64a48c2-f76c-2808-c8fb-3f6f46870757.png)
* タグは特に必要ないので次のステップへ
* 任意の「ロール名」を設定し「ロールの作成」をクリック
![スクリーンショット 2020-10-14 15.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/aa7e3679-b218-fb74-7388-16f51504deec.png)
* ロール一覧から作成したロールを選択
* `信頼関係` > `信頼関係の編集` をクリック
![スクリーンショット 2020-10-14 15.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/301fe65b-b3b8-ae11-86dc-c0fc7400e74d.png)
* `Principal > Service` を `["ec2.amazonaws.com","events.amazonaws.com"]` にして更新
![スクリーンショット 2020-10-14 15.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/021b12d5-afaa-5e49-eee4-78659fc6d5ea.png)

### イベントルールの作成

ターゲットの選択以前は [自動停止](#自動停止)の手順と同じ。

* `ターゲット` のアクションから「SSM Automation」を選択
    * 「ssm」を入力するとすぐに出てくる
* `ドキュメント` で「AWS-StartEC2Instance」を選択
    * 「start」を入力するとすぐに出てくる
* `定数` > `InstanceId` に対象のインスタンスIDを入力
* 「既存のロールを使用」を選択
* 先ほど作成したロールを選択する
    * ロール名で絞り込み出来る
* ターゲットを追加したい場合は同様にして追加する
![スクリーンショット 2020-10-14 15.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/86c907c7-8339-874b-c9b7-619bc99dd0b4.png)
* 「設定の詳細」をクリック
* 任意のルール名と説明を入力
    * ルール名は後から変更できないので注意
* 有効化にチェックが入っていることを確認して「ルールの作成」をクリック

## cron式サンプル

cron式は `分 時間 日 月 曜日 年` となっている

### 平日(月曜〜金曜)のAM8:00に実行

* `0 23 ? * SUN-THU *`
    * 英字3文字で曜日指定が出来る
    * -9時間した時にマイナスになってしまう場合は、前日の曜日になる点に注意

### 毎月1日のPM23:00に実行

* `0 14 1 * ? *`

## 参考

[ルールのスケジュール式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)

## 関連

[RDSを自動停止・自動起動する](https://qiita.com/bambis13s/items/a4480a5e0007b01dd95a)