Lambdaを定期的に実行させる環境をAWS CloudFormationで構築した
こんにちは、つじたく(@Tsuji_Taku50)です。
Lambdaを定期的に実行させたいと思い、その方法を調べました。
AWS CloudFormationでの環境構築のサンプルコードも載せておきます。
思っていたよりも意外と簡単にできました!さすがAWS!
スケジュール機能
Lambdaを定期的に実行するのはスケジュールというものを作成する必要があります。
イメージとしてはスケジュールを作成して、それをLambda側に引っ付けるイメージです。
このスケジュールを利用すると1時間に1回、1分間に1回、などルールに沿ってLambdaを実行させることができます。
環境構築のソースコード
こちらの記事で書いたコードに追記する形でAWS CloudFormationでの環境構築をしようと思います。 tsujitaku50.hatenablog.com
AWSTemplateFormatVersion: '2010-09-09' Description: test Resources: # Lambda作成 LambdaFunction: Type: AWS::Lambda::Function Properties: Code: # ソースコードは直書き ZipFile: !Sub | test Description: Lambda is best FunctionName: test_function Handler: index.handler MemorySize: 128 Role: Fn::GetAtt: - LambdaRole - Arn Runtime: nodejs4.3 Timeout: 10 # Lambdaのロール作成 LambdaRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: - sts:AssumeRole Effect: Allow Principal: Service: - lambda.amazonaws.com ManagedPolicyArns: - arn:aws:iam::aws:policy/PowerUserAccess Path: / RoleName: lambdaRole # 定期イベント(クーロン)作成 LambdaSchedule: Type: AWS::Events::Rule Properties: Description: クーロンを作成してるよ Name: ScheduleRule ScheduleExpression: rate(60 minutes) State: ENABLED Targets: - Arn: Fn::GetAtt: - LambdaFunction - Arn Id: TargetFunctionV1 # 作成した定期イベント(クーロン)をLambdaに付与 PermissionForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: Ref: LambdaFunction Principal: events.amazonaws.com SourceArn: Fn::GetAtt: - LambdaSchedule - Arn
少し説明すると、大枠はこの前に書いたものと変わりません。
ただ
「クーロン作成」と「作成したクーロンをLambdaに付与する」という処理を追加で書き足したしています。
その中でScheduleExpression
という箇所がありますが、ここがクーロンの周期を設定する部分になっています。
今回の場合は
ScheduleExpression: rate(60 minutes)
となっているので、「60分に1回起動する」という意味になります。
例えば、以下のような書き方になります。
例 | Cron 式 |
---|---|
Lambda 関数を 5 分ごとに呼び出す | rate(5 minutes) |
Lambda 関数を 1 時間ごとに呼び出す | rate(1 hour) |
Lambda 関数を 7 日ごとに呼び出す | rate(7 days) |
他にも様々なクーロンが設定できるので、公式ドキュメントを一度見ることをオススメします。
ブラウザで設定する場合
なお、ブラウザぽちぽち設定する場合はこちらの記事が参考になるかと思います。
公式はこちら
まとめ
LambdaはS3と連携させて様々なことができます。
S3に画像が上がったことを検知して、画像を縮小する。。とか
今回のクーロン処理を設定することでより便利にLambdaを使えるようになるんじゃないでしょうか
おわり!!