せっかくなのでアドベントカレンダーに登録してみることにしました。
きっかけ
ある日、U先輩がこんなこと言ってきました。
U「あのさー、勉強会でさー、Googleカレンダーでインスタンス管理してるの見たんだよねー」
私「はぁ。。。」
U「やりたいよねー」
私「(作らせるつもりだ。。。)」
ってことで作ったので、ここに記述
Googleカレンダー側はGASで実装。
AWS側は、API gatewayとlambdaで実装しました。
##まずはAWS側です。
AWS側の受け口を作成します。
当時から知っていれば、サーバーレスフレームワークのChaliceを使ったところですが、
残念ながら、手で設定してしまっています。
ああ、そのうち実装を変えよう。
labmdaはこちら。
構成編とか言わないでください。初めてのgithub公開なんですから。
それぞれをlamda functionとして登録します。
これChaliceなら、サクッとAPIまで作れるんだよーークゥ。。。
これ初回だからね、初回。
あとで実装を変えよう。
ここで、統合リクエストは
本文マッピングテンプレートの設定をする必要があります。
ここで、「テンプレートが定義されていない場合 (推奨)」を選択して、特にいじっていないのですが、
なんかこんな感じになっています。
多分、これ、変な情報入っていないはず。
また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カレンダーは、
スプレッドシートから作成します。
またスプレッドシート上でも管理する必要があるので
こんな感じにします。
またログを、スプレッドシートのオーナー以外が見られるように、
ログシートを用意します。
すみません。見せたいのは、手順でなく、ログシートにログ履くようにしたよってことです。
スクリプトエディタができたら、
こちらからコピってきてきます。他の提供方法を知りません。誰かGoogleSpreadsheetのテンプレを適用する方法を教えてください。
「ドメイン」の部分を、APIgatewayのエンドポイントに設定。
ちなみにカレンダーに記述されたユーザーのカレンダーをチェックし、
スプレッドシートに記述されたインスタンスIDがあるときには起動インスタンス、ないときは停止のAPIを叩くだけです。
とりあえず、正常系しか見てません。あと、DryRunのFunctionはドライランです。
そしたら、実行の下の部分にある、時計マークから
トリガーを10分おきに設定します。
はい事前準備完了。
利用する
あとは指定の時間になったら、インスタンスが起動しているかの見てみましょう!