wataメモ

日々のメモをつらつらと書くだけ

AWS LambdaのScheduled EventでEC2インスタンスの定期停止、起動してみた

 AWS Lambdaで「Scheduled Functions (Cron)」というのが増えてcronのように定時実行が追加された。 試してみようと思って、題材としてはちょうどインスタンスを定期的起動、停止をする必要があったのでそれにしてみた。 今まではJenkinsで行っていたが、それだけの為にはJenkinsは要らなくなる。

Lambdaソース

 まずはLambdaのソースは以下を用意した。

EC2インスタンス起動

gist13e268a8040d8d008ece

EC2インスタンス停止

gistf8292b79ebd68b8b98e8

Scheduled Functions (Cron)

設定

Functionsの「Event sources」タブで「Add event source」をクリックしてダイアログから設定する。

f:id:wata_htn:20151010193703p:plain

f:id:wata_htn:20151010193727p:plain

「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を組み合わせて簡単な画面を用意すれば良いかも。