EC2インスタンスを時刻指定で起動する

## 概要

スケジューリングはCloudWatchを使って、実際の起動はLambdaを使って実現します。Lambdaでのスクリプト実行のために必要なロールの作成についても説明します。

## 起動用ロールを作成する

AWSコンソールにログインしたら画面左上の「サービス」をクリックして、サービスの一覧を開きます。その中から「IAM」を選択してください。
![スクリーンショット 2017-03-17 11.35.46.png](https://qiita-image-store.s3.amazonaws.com/0/127776/cb05135b-4469-50f1-38f5-1882ec0bc009.png)

画面左部分に並ぶメニューから「ロール」を選択して、ロールの一覧を表示します。一覧の上にある青いボタン「新しいロールの作成」をクリックしてください。
![スクリーンショット 2017-03-17 11.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/127776/38f92b92-8af8-b554-3526-e6e4ccc4d0db.png)

### 手順 1 : ロール名の設定

ロール名の設定をします。EC2起動に関するロールとして分かり易い任意の名称を設定してください。入力したら「次のステップ」ボタンをクリックします。

|項目名|設定値|備考|
|---|---|---|
|ロール名|Start_EC2_Instance_Lambda|

![スクリーンショット 2017-03-17 11.40.15.png](https://qiita-image-store.s3.amazonaws.com/0/127776/526a939e-0634-b9b6-cab9-50ad63a0973f.png)

### 手順 2 : ロールタイプの選択

今回、EC2インスタンスの起動にはLambdaを利用します。AWSサービスロールから「AWS Lambda」を選択してください。

![スクリーンショット 2017-03-17 11.45.07.png](https://qiita-image-store.s3.amazonaws.com/0/127776/8478d891-6d0e-2dfc-14d5-19138e05859d.png)

### 手順 3 : 信頼性の確立

ここは何故がスキップされました。作成後に「信頼されたエンティティ」が「ID プロバイダー lambda.amazonaws.com」となっていたのでバックグラウンドで何か処理が走っているんでしょうか？ご存知の方、コメントをお願いします。

### 手順 4 : ポリシーのアタッチ

後ほどインラインポリシーを設定するので、ここでは何も選択せずに「次のステップ」ボタンをクリックしてください。![スクリーンショット 2017-03-17 11.51.44.png](https://qiita-image-store.s3.amazonaws.com/0/127776/5c4a4ecf-14c0-79a0-0f2a-997978853032.png)

### 手順 5 : 確認

入力した内容を確認して「ロールの作成」ボタンをクリックします。
![スクリーンショット 2017-03-17 11.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/127776/8d953bb0-0178-f35c-2607-270097ca4122.png)

### インラインポリシーを設定する

いま作成したロールが一覧に表示されるので、作成したロール名をクリックしてください。![スクリーンショット 2017-03-17 11.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/127776/c7d594d3-c88d-63b3-a90d-7e867f1eebe1.png)

概要が表示されるので、アクセス許可のタブから「インラインポリシー」の詳細を開き、「ここをクリックしてください」の文字をクリックします。![スクリーンショット 2017-03-17 11.58.12.png](https://qiita-image-store.s3.amazonaws.com/0/127776/250bbc6b-9e20-9270-4818-2fd60e286e21.png)

カスタムポリシーを設定します。「カスタムポリシー」をクリック、その後「選択」ボタンをクリックしてください。![スクリーンショット 2017-03-17 11.59.51.png](https://qiita-image-store.s3.amazonaws.com/0/127776/9d3803cf-0956-a8b7-73cd-8122a77df93e.png)

ポリシー名には任意の名称を、ポリシードキュメントには以下の内容を入力します。入力したら「ポリシーの適用」ボタンをクリックします。

|項目名|設定値|備考|
|---|---|---|
|ポリシー名|Start_EC2_Instance_Lambda|

```js:ポリシードキュメント
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*",
                "arn:aws:ec2:*"
            ]
        }
    ]
}
```

![スクリーンショット 2017-03-17 12.07.19.png](https://qiita-image-store.s3.amazonaws.com/0/127776/87434757-fbe5-6b0b-2ea7-935ff68371b8.png)

長くなりましたが、ロールの作成は以上です。

## Lambdaで起動用スクリプトを作成する

まずAWS Lambdaの画面に移動します。画面左上の画面左上の「サービス」をクリックして、サービスの一覧を開きます。その中から「Lambda」を選択してください。
![スクリーンショット 2017-03-17 11.35.46.png](https://qiita-image-store.s3.amazonaws.com/0/127776/cb05135b-4469-50f1-38f5-1882ec0bc009.png)

「今すぐ始める」ボタンをクリックしてください。
![スクリーンショット 2017-03-17 12.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/127776/9575e386-f6b4-77d7-e3ac-239b85ffa7b1.png)

### 設計図の選択

新しくLambda関数を作成するので、「ブランク関数」をクリックします。
![スクリーンショット 2017-03-17 12.11.24.png](https://qiita-image-store.s3.amazonaws.com/0/127776/f5ab5019-9e89-1c2b-43a5-d6cae0f75969.png)

### トリガーの設定

起動はスケジュールで行うので、トリガーとして「CloudWatch イベント - スケジュール」を選択します。![スクリーンショット 2017-03-17 12.12.35.png](https://qiita-image-store.s3.amazonaws.com/0/127776/26395a90-c4b2-510b-d0e2-3e404206b577.png)

入力欄が出現するので、以下のとおりに入力します。

|項目名|設定値|備考|
|---|---|---|
|ルール名|Start_webserver|この値は任意です。分かり易い名称にしてください。|
|ルールの説明|webサーバを起動する|この値は任意です。分かり易い説明にしてください。|
|スケジュール式|cron(0 17 ? * MON-FRI *)|左記は月〜金の17時にEC2インスタンスを起動する例です。時刻はUTCです。日本時間で考える時は-9時間の時刻で指定します。|
|トリガーの有効化|チェック|

入力を終えたら「次へ」ボタンをクリックします。
![スクリーンショット 2017-03-17 12.46.22.png](https://qiita-image-store.s3.amazonaws.com/0/127776/8a77ad0b-23aa-e5c9-8d5e-25ab450cf710.png)


### 関数の設定

EC2インスタンスを起動するためのスクリプトを指定します。

|項目名|設定値|備考|
|---|---|---|
|名前|Start_webserver|この値は任意です。分かり易い名称にしてください。|
|説明|webサーバを起動する|この値は任意です。分かり易い説明にしてください。|
|ランタイム|Node.js 4.3|
|コードエントリタイプ|コードをインラインで編集|

```js
const INSTANCE_ID = 'i-xxxxxxxxxxxxxxxxx'; // 対象のEC2インスタンスIDを指定する
 
var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1'; // 対象のEC2が所属するリージョンを指定する
 
function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: [
            INSTANCE_ID
        ]
    };
  
    ec2.startInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context) {
    console.log('start');
    ec2Start(function() {
        context.done(null, 'Started Instance');
    });
};
```

![スクリーンショット 2017-03-17 12.29.11.png](https://qiita-image-store.s3.amazonaws.com/0/127776/6478cd18-b941-8b9b-6519-feee56f25532.png)

さきほど作成したロールを指定します。

|項目名|設定値|備考|
|---|---|---|
|ハンドラ|index.handler|
|ロール|既存のロールを選択|
|既存のロール|Start_EC2_Instance_Lambda|[ここ](#起動用ロールを作成する)で作成したロール名を指定します|

![スクリーンショット 2017-03-17 12.29.20.png](https://qiita-image-store.s3.amazonaws.com/0/127776/cdc08a04-cac0-3425-e5e2-5b3e3415aae0.png)

詳細設定は行いません。「次へ」ボタンをクリックしてください。
（念のため、詳細設定のデフォルト値が確認できるスクリーンキャプチャを掲載します）
![スクリーンショット 2017-03-17 12.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/127776/69e43adf-b083-12c8-7d29-9ba341631886.png)

確認画面が表示されるので、内容を確認して問題なければ「関数の作成」ボタンをクリックします。![スクリーンショット 2017-03-17 12.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/127776/03426908-2f35-7e47-5f50-59b2e550453e.png)

Lambda関数の作成は以上です。
作成したLambda関数の詳細（トリガータブ）が開いていると思いますので、「テスト」ボタンをクリックして、さらに「保存してテスト」ボタンをクリックすると、作成したLambda関数が実行されます。指定したEC2インスタンスが起動されたかを確認してください。
![スクリーンショット 2017-03-17 12.50.12.png](https://qiita-image-store.s3.amazonaws.com/0/127776/5c39bdeb-1731-a07a-4b04-74b5121c385b.png)