エンジニアはこわくない

好きなように書く

Lambdaを定期的に実行させる環境をAWS CloudFormationで構築した


スポンサーリンク

f:id:tsujitaku50:20170124085842p:plain

こんにちは、つじたく(@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)

他にも様々なクーロンが設定できるので、公式ドキュメントを一度見ることをオススメします。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

ブラウザで設定する場合

なお、ブラウザぽちぽち設定する場合はこちらの記事が参考になるかと思います。

dev.classmethod.jp

公式はこちら

docs.aws.amazon.com

まとめ

LambdaはS3と連携させて様々なことができます。

S3に画像が上がったことを検知して、画像を縮小する。。とか

今回のクーロン処理を設定することでより便利にLambdaを使えるようになるんじゃないでしょうか

おわり!!