Googleカレンダーでインスタンス起動停止を管理する

せっかくなのでアドベントカレンダーに登録してみることにしました。


## きっかけ
ある日、U先輩がこんなこと言ってきました。

U「あのさー、勉強会でさー、Googleカレンダーでインスタンス管理してるの見たんだよねー」
私「はぁ。。。」
U「やりたいよねー」
私「（作らせるつもりだ。。。）」

ってことで作ったので、ここに記述


Googleカレンダー側はGASで実装。
AWS側は、API gatewayとlambdaで実装しました。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/5c4c0fd9-7e56-0406-bf50-206f357afe33.png)

##まずはAWS側です。
AWS側の受け口を作成します。
当時から知っていれば、サーバーレスフレームワークのChaliceを使ったところですが、
残念ながら、手で設定してしまっています。
ああ、そのうち実装を変えよう。

labmdaはこちら。
構成編とか言わないでください。初めてのgithub公開なんですから。

https://github.com/yutako0217/lambda_python_with_apigateway

それぞれをlamda functionとして登録します。
これChaliceなら、サクッとAPIまで作れるんだよーークゥ。。。
これ初回だからね、初回。
あとで実装を変えよう。

![image](https://qiita-image-store.s3.amazonaws.com/0/63125/86e1fede-c2b6-4797-c592-52b47d047615.png)

ここで、統合リクエストは
本文マッピングテンプレートの設定をする必要があります。
ここで、「テンプレートが定義されていない場合 (推奨）」を選択して、特にいじっていないのですが、
なんかこんな感じになっています。
多分、これ、変な情報入っていないはず。
またAPI叩くときは、restで{InstanceId}の部分に、インスタンスIDが入るイメージです。
統合リクエストを実行するときに、

```

{
"body-json" : $input.json('$'),
"params" : {
#foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
"$type" : {
    #foreach($paramName in $params.keySet())
    "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}
    #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
    #if($foreach.hasNext),#end
#end
},
"context" : {
    "account-id" : "$context.identity.accountId",
    "api-id" : "$context.apiId",
    "api-key" : "$context.identity.apiKey",
    "authorizer-principal-id" : "$context.authorizer.principalId",
    "caller" : "$context.identity.caller",
    "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
    "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
    "cognito-identity-id" : "$context.identity.cognitoIdentityId",
    "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
    "http-method" : "$context.httpMethod",
    "stage" : "$context.stage",
    "source-ip" : "$context.identity.sourceIp",
    "user" : "$context.identity.user",
    "user-agent" : "$context.identity.userAgent",
    "user-arn" : "$context.identity.userArn",
    "request-id" : "$context.requestId",
    "resource-id" : "$context.resourceId",
    "resource-path" : "$context.resourcePath"
    }
}
```

きっと必要なものを厳選すればスリムになるんでしょうが、
AWSの更新もあったし、実装時間はお昼休みだし、なので勘弁を。。
ココを通過することで、lamdbaのこの箇所でpathパラメータを取得できます。

```
pathparam = event['params']['path']
instance = pathparam['instanceId']
```

API叩くときは、

GET https://ドメイン/ec2/i-xxxxx/start
GET https://ドメイン/ec2/i-xxxxx/stop

みたいな感じでAPIを叩きます。
ということで、AWS側の口が用意できました。

##はい、次はGoogle側の設定！

Googleカレンダーは、
スプレッドシートから作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/5e66283a-a606-d2da-b69e-251f8bed828f.png)

またスプレッドシート上でも管理する必要があるので
こんな感じにします。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/a2a9ad4d-7993-cee6-01ad-a7f1fccba308.png)

またログを、スプレッドシートのオーナー以外が見られるように、
ログシートを用意します。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/27f576fd-be09-e150-2535-4834acfe99b3.png)

すみません。見せたいのは、手順でなく、ログシートにログ履くようにしたよってことです。

スクリプトエディタができたら、
こちらからコピってきてきます。他の提供方法を知りません。誰かGoogleSpreadsheetのテンプレを適用する方法を教えてください。

https://github.com/yutako0217/sync_googleCalender_and_AWS.git

「ドメイン」の部分を、APIgatewayのエンドポイントに設定。
ちなみにカレンダーに記述されたユーザーのカレンダーをチェックし、
スプレッドシートに記述されたインスタンスIDがあるときには起動インスタンス、ないときは停止のAPIを叩くだけです。

とりあえず、正常系しか見てません。あと、DryRunのFunctionはドライランです。

そしたら、実行の下の部分にある、時計マークから

![image](https://qiita-image-store.s3.amazonaws.com/0/63125/2957e2ed-8851-94a9-6954-a2ed3debbe85.png)

トリガーを10分おきに設定します。
はい事前準備完了。


## 利用する
スプレッドシートの方は
こんな感じに
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/469182c4-9bda-5c81-e500-006091f22cee.png)

カレンダーの方はこんな感じに予定を入れておきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/a3ad107e-a202-a0f5-0c18-c9658ef9222f.png)

あとは指定の時間になったら、インスタンスが起動しているかの見てみましょう！