EC2インスタンスをスケジュールで起動、停止させる

# EC2インスタンスをスケジュールで起動、停止させる

## 目的

1. lamdbaについて勉強したい
2. インスタンスの停止忘れを無くしたい
3. Pythonについて知りたい

## 関数作成 その1

関数名とロールを設定する。

- 名前
    - myStartStopEC2Instances
- ロール
    - カスタムロール作成

> カスタムロールの作成を選択すると、カスタムロール作成の新規画面が開く

![Screenshot 2017-10-28_20-09-37.png](https://qiita-image-store.s3.amazonaws.com/0/88753/1e22626d-fd18-c821-fd3c-e665c6a223d1.png)

### カスタムロールの作成

- ロール名
    - myStartStop_EC2_Instances
- ポリシードキュメント
    - EC2の起動、停止を許可

```json:ポリシードキュメント
{
  "Version": "2012-10-17",
  "Statement": [![Screenshot 2017-10-28_20-38-06.png](https://qiita-image-store.s3.amazonaws.com/0/88753/6aee1997-0196-ebb1-303b-d52803d52427.png)

    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}    
```

![Screenshot 2017-10-28_20-12-34.png](https://qiita-image-store.s3.amazonaws.com/0/88753/7ead0dd0-91f1-252f-e5c0-8ddaf543f409.png)

## 関数作成 その2

作成したロールが既存のロールとして読み込まれているので、[関数の作成]を行う。

![Screenshot 2017-10-28_20-13-10.png](https://qiita-image-store.s3.amazonaws.com/0/88753/09aa2d65-518f-4908-1525-36c04762b9ec.png)

- ランタイム
    - Python 2.7
- コード
    - lambda_function.py
- ハンドラ
    - lambda_function.lamdbda_handler

```python:lambda_handler.py
import boto3
 
def lambda_handler(event, context):
    region = event['Region']
    instances = event['Instances']
    ec2 = boto3.client('ec2', region_name=region)
    if event['Action'] == 'start':
        ec2.start_instances(InstanceIds=instances)
        print 'started your instances: ' + ", ".join(instances)
    elif event['Action'] == 'stop':
        ec2.stop_instances(InstanceIds=instances)
        print 'stopped your instances: ' + ", ".join(instances)
```

## 動作テスト

任意のパラメータを設定して、動作を確認する。
3つのインスタンスに対して起動を指示してみます。

![Screenshot 2017-10-28_20-38-06.png](https://qiita-image-store.s3.amazonaws.com/0/88753/b82a7c75-b947-d8a4-a87a-d5afa1fa67b4.png)

インスタンスIDは任意のIDに変更
対象を3つ定義しているが、当然増減させて良い

- イベント名
    - TestStartEC2

```json:test.json
{
 "Action": "start",
 "Region": "ap-northeast-1", 
 "Instances":
  [
   "i-xxxxxxxxxxxxxxxxx",
   "i-yyyyyyyyyyyyyyyyyy",
   "i-zzzzzzzzzzzzzzzzz"
  ]
}
```

![Screenshot 2017-10-28_20-19-54.png](https://qiita-image-store.s3.amazonaws.com/0/88753/f991add1-be58-c660-1a7a-d7f036430ee5.png)

## 動作テスト

EC2インスタンスが起動するか、動作確認を行います。
実行結果が成功となり、EC2が起動していればOKです。

![Screenshot 2017-10-28_20-20-28.png](https://qiita-image-store.s3.amazonaws.com/0/88753/0b0ab00b-0b69-82a6-75c6-fa75ee5a9886.png)

![Screenshot 2017-10-28_20-20-55.png](https://qiita-image-store.s3.amazonaws.com/0/88753/b63b49bd-5e91-ddac-136d-db3f14c6dd11.png)

## CloudWatch

- 名前
    - DailyStopEC2
- イベントソース
    - Cron式
        - 毎日 23:30
        - **画像ではJSTで23:30を指定していますが、GMTに変換する必要があります**
        - ```30 14 * * ? *```
- ターゲット
    - 機能
        - myStartStop_EC2_instances
    - 入力
        - 定数(JSON テキスト)
        - Action,Region,Instancesは対象に合わせて設定
        - ```{"Action": "stop", "Region": "ap-northeast-1", "Instances": ["i-xxxxxxxxxxxxxxxxx","i-yyyyyyyyyyyyyyyyyy","i-zzzzzzzzzzzzzzzzz"]}```

![Image 002.png](https://qiita-image-store.s3.amazonaws.com/0/88753/7ef78d17-480a-f0b7-cc7a-2b52130865cd.png)
![Image 003.png](https://qiita-image-store.s3.amazonaws.com/0/88753/7021a589-90bf-09db-ec6e-64bc16376599.png)

## 参考

- 超参考に...というかやっていることそのまま
    - [できるだけシンプルな仕組みで簡単にEC2の自動起動・停止を実現したい！ ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/simple-auto-start-stop-for-ec2/)