AWS LambdaのScheduled EventでEC2インスタンスの定期停止、起動してみた
AWS Lambdaで「Scheduled Functions (Cron)」というのが増えてcronのように定時実行が追加された。 試してみようと思って、題材としてはちょうどインスタンスを定期的起動、停止をする必要があったのでそれにしてみた。 今まではJenkinsで行っていたが、それだけの為にはJenkinsは要らなくなる。
Lambdaソース
まずはLambdaのソースは以下を用意した。
EC2インスタンス起動
EC2インスタンス停止
Scheduled Functions (Cron)
設定
Functionsの「Event sources」タブで「Add event source」をクリックしてダイアログから設定する。
「Schedule expression」にcronの様な設定を入れるのだが、数が1つ多く6つになっている。 ドキュメントを見ると以下のようになっている。
Field | Values | Wildcards |
---|---|---|
Minutes | 0-59 | , - * / |
Hours | 0-23 | , - * / |
Day-of-month | 1-31 | , - * ? / L W |
Month | 1-12 or JAN-DEC | , - * / |
Day-of-week | 1-7 or SUN-SAT | , - * ? / L # |
Year | 1970-2199 | , - * / |
最後の「年」指定が増えている。 うるう年とか年を意識する時に使うイメージなのだろうか。
形式
基本crontabの書き方と同じなのだが、「?」が追加されている。 「Day-of-month」か「Day-of-week」のどちらかは「?」にしなければならない。
タイムゾーン
時間の指定はUTC指定となる。 日本時間(JST)とは9時間ずらす必要がある。
イベント
Lambda側に渡されるイベントは以下。 「time」をハンドリングして、処理を変えるは出来そうだ。
{ "id": "bd142023-9806-4b1d-9957-acea12a09f89", "detail-type": "Scheduled Event", "source": "aws.events", "account": "XXXXXXXXXXXX", "time": "2015-10-10T05:15:00Z", "region": "ap-northeast-1", "resources": [ "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/stop_ec2_instance" ], "detail": {} }
まとめ
インスタンスがいらないのは良いが、時間を修正したい場合にこのままだとAWS Consoleにログインする必要がある。 簡単に修正出来るようにしないと色々な人が修正出来ない。 そこでインスタンスを立ててしまっては意味が無いので、S3とLambdaとかAPI Gatewayを組み合わせて簡単な画面を用意すれば良いかも。