LoginSignup
9
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-08

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

きっかけ

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

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

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

Googleカレンダー側はGASで実装。
AWS側は、API gatewayとlambdaで実装しました。
image

まずはAWS側です。

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

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

それぞれを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のテンプレを適用する方法を教えてください。

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

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

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

image

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

利用する

スプレッドシートの方は
こんな感じに
image

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

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

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4