AWS LambdaからPythonでEC2のインスタンスを起動するスケジュールを設定してみた #reinvent

2015.10.09

サーモン大好き、横山です。

今回は AWS LambdaがPython(2.7)に対応し、Scheduled Eventができるようになったということで、EC2インスタンスの起動をAWS Lambda に定期的に実行するところまでの設定をまとめてみました。

参考

Lambda function の設定

起動処理実装

blueprintからPythonで絞込むと7つ用意されていますので、 ここから 「hello-world-python」を選びます

lambda_python_instances_01

Configure functionの「Name」と「Description」にはそれぞれ適した名称入れます。 今回は「start_instance」「start instance from AWS lambda」と入れてます。

lambda_python_instances_02

下部にスクロールすると「Lambda function handler and role」とあります。 Handlerは今回はいじらずに、Roleは新規に作るため「Basic execution role」を選びます。

lambda_python_instances_04

「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:*:*:*"
]
}
]
}

lambda_python_instances_03

各種設定を確認し、問題なければ「Create function」を押します。

lambda_python_instances_05

次に、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

lambda_python_instances_06

コードを書き写したら「Save and Test」ボタンを押すとそのまま実行テストを行ってくれます。 標準出力を設定していた場合、下部にある「Log output」に結果を表示してくれます。

lambda_python_instances_07

「Log output」にエラーが無ければ、指定したEC2が起動していると思います。

lambda_python_instances_08

Scheduled Event の設定

次にスケジュールの登録行います。 「Event sources」のタブをクリックし、「Add event source」をクリックします。

そしたら、「Event source type」で「Scheduled Event」を選択します。

lambda_python_instances_09

lambda_python_instances_10

そしたら、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 *)

と、なります。

lambda_python_instances_11

まとめ

今回起動だけの説明でしたが、同様に stop_instances を使う場合は、RoleのActionに ec2:StopInstances を追加すれば、指定時間に自動でStopするLambda functionを作ることも可能です。

boto3とIAMの設定をしっかりしてしまえば、もう何でも出来そうな感じがするAWS Lambda。 今回のアップデートでPythonも使えるようになり、個人的にはAWS Lambdaとの距離が一気に縮まりました。