AWS
googleAppscript
APIGateway
AWSLambda

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

More than 1 year has passed since last update.

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


きっかけ

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

U「あのさー、勉強会でさー、Googleカレンダーでインスタンス管理してるの見たんだよねー」

私「はぁ。。。」

U「やりたいよねー」

私「(作らせるつもりだ。。。)」

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

Googleカレンダー側はGASで実装。

AWS側は、API gatewayとlambdaで実装しました。

image


まずはAWS側です。

AWS側の受け口を作成します。

当時から知っていれば、サーバーレスフレームワークのChaliceを使ったところですが、

残念ながら、手で設定してしまっています。

ああ、そのうち実装を変えよう。

labmdaはこちら。

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

https://github.com/yutako0217/lambda_python_with_apigateway

それぞれをlamda functionとして登録します。

これChaliceなら、サクッとAPIまで作れるんだよーークゥ。。。

これ初回だからね、初回。

あとで実装を変えよう。

image

ここで、統合リクエストは

本文マッピングテンプレートの設定をする必要があります。

ここで、「テンプレートが定義されていない場合 (推奨)」を選択して、特にいじっていないのですが、

なんかこんな感じになっています。

多分、これ、変な情報入っていないはず。

また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

またスプレッドシート上でも管理する必要があるので

こんな感じにします。

image

またログを、スプレッドシートのオーナー以外が見られるように、

ログシートを用意します。

image

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

スクリプトエディタができたら、

こちらからコピってきてきます。他の提供方法を知りません。誰かGoogleSpreadsheetのテンプレを適用する方法を教えてください。

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

「ドメイン」の部分を、APIgatewayのエンドポイントに設定。

ちなみにカレンダーに記述されたユーザーのカレンダーをチェックし、

スプレッドシートに記述されたインスタンスIDがあるときには起動インスタンス、ないときは停止のAPIを叩くだけです。

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

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

image

トリガーを10分おきに設定します。

はい事前準備完了。


利用する

スプレッドシートの方は

こんな感じに

image

カレンダーの方はこんな感じに予定を入れておきます。

image

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