AWS LambdaからPythonでEC2のインスタンスを起動するスケジュールを設定してみた #reinvent
サーモン大好き、横山です。
今回は AWS LambdaがPython(2.7)に対応し、Scheduled Eventができるようになったということで、EC2インスタンスの起動をAWS Lambda に定期的に実行するところまでの設定をまとめてみました。
参考
Lambda function の設定
起動処理実装
blueprintからPythonで絞込むと7つ用意されていますので、 ここから 「hello-world-python」を選びます
Configure functionの「Name」と「Description」にはそれぞれ適した名称入れます。 今回は「start_instance」「start instance from AWS lambda」と入れてます。
下部にスクロールすると「Lambda function handler and role」とあります。 Handlerは今回はいじらずに、Roleは新規に作るため「Basic execution role」を選びます。
「Basic execution role」を選択すると、Role名とポリシードキュメントを編集する画面が新しいタブで開かれます。
こちらで、適した名称とポリシーを編集します。
今回ポリシーでは、Actionの ec2:StartInstances
とResourceの arn:aws:ec2:*:*:*
を追加しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:StartInstances" ], "Resource": [ "arn:aws:logs:*:*:*", "arn:aws:ec2:*:*:*" ] } ] }
各種設定を確認し、問題なければ「Create function」を押します。
次に、start_instanceの実行コードを書いていきます。 zipに固めて実行することも出来ますが、今回は10行ほどのコードなので、 「Edit code inline」で設定していきます。 以下のコードをコピーして、貼り付けて、InstanceIdsの中に書いてある、InstanceIdを変更すれば動きます。
import boto3 def lambda_handler(event, context): client = boto3.client('ec2') response = client.start_instances( InstanceIds=[ 'i-2d483bde', ] ) print response
コードを書き写したら「Save and Test」ボタンを押すとそのまま実行テストを行ってくれます。 標準出力を設定していた場合、下部にある「Log output」に結果を表示してくれます。
「Log output」にエラーが無ければ、指定したEC2が起動していると思います。
Scheduled Event の設定
次にスケジュールの登録行います。 「Event sources」のタブをクリックし、「Add event source」をクリックします。
そしたら、「Event source type」で「Scheduled Event」を選択します。
そしたら、Schedule expressionでCronやRateを設定します。 今回は「◯◯時に実行」とやりたいので、cronを使います。 cronは以下のような引数になっています。
cron(Minutes Hours Day-of-month Month Day-of-week Year)
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 | , - * / |
注意点として、UTCで時刻設定をしなければなりません。平日朝9時(JST)で起動したい場合は、UTCで0時なので
cron(0 0 ? * MON-FRI *)
と、なります。
まとめ
今回起動だけの説明でしたが、同様に stop_instances
を使う場合は、RoleのActionに ec2:StopInstances
を追加すれば、指定時間に自動でStopするLambda functionを作ることも可能です。
boto3とIAMの設定をしっかりしてしまえば、もう何でも出来そうな感じがするAWS Lambda。 今回のアップデートでPythonも使えるようになり、個人的にはAWS Lambdaとの距離が一気に縮まりました。