SQSキューでLambda関数をトリガーする

目次

SQSキューでLambda関数をトリガーする

以下のページで、SQS入門ということで、SQSキューを使ってLambda関数間をデータ連携する構成をご紹介しました。

あわせて読みたい
SQS入門 Lambda同士をデータ連携する 【SQSを使用してLambda間でデータ連携する構成】 SQSを使用することで、リソース間の結合を疎の状態に保ちつつ、連携することができます。今回はSQSを使用して、3つのLa...

上記のページでは、キューからメッセージを受け取る関数は、手動で実行していました。

本ページでは、以下のAWS公式ページで取り上げられているように、Lambda関数を自動的に実行することを考えます。

AWS Lambda 関数を使用して Amazon SQS キューのメッセージを処理できます。Lambda はキューをポーリングし、Lambda 関数を、キューメッセージを含むイベントと共に同期的に呼び出します。

AWS Lambda 関数 (コンソール) をトリガーするキューの設定

構築する環境

Diagram of triggering Lambda function from SQS queue

冒頭で取り上げたページと概ね同様の環境です。

Lambda関数2において、SQSキューをポーリングし、キューにメッセージがあれば、それを受け取って処理します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/114

テンプレートファイルのポイント解説

本ページでは、SQSキューでLambda関数をトリガーする方法をご紹介します。

それ以外の事項については、以下のページをご紹介します。

あわせて読みたい
SQS入門 Lambda同士をデータ連携する 【SQSを使用してLambda間でデータ連携する構成】 SQSを使用することで、リソース間の結合を疎の状態に保ちつつ、連携することができます。今回はSQSを使用して、3つのLa...

Lambda

関数

Resources:
  Function2:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          def lambda_handler(event, context):
            print(event)
      FunctionName: !Sub "${Prefix}-Function2"
      Handler: !Ref Handler
      MemorySize: !Ref MemorySize
      Runtime: !Ref Runtime
      Role: !GetAtt LambdaRole2.Arn
      Timeout: !Ref Timeout
Code language: YAML (yaml)

SQSキューをポーリングするLambda関数です。

Lambda関数で実行するコードをインライン形式で記載します。
詳細につきましては、以下のページをご確認ください。

あわせて読みたい
CloudFormationでLambdaを作成する3パータン(S3/インライン/コンテナ) 【CloudFormationでLambdaを作成する】 CloudFormationでLambdaを作成する場合、大別すると以下の3パターンあります。 S3バケットにコードをアップロードする インライ...

実行するコードですが、eventオブジェクトの中身を出力するシンプルな内容です。

冒頭でご紹介したページですと、コード内でSQSキューにポーリングする内容でしたが、そういった内容は省略されています。
ポーリングは後述のイベントソースマッピングで定義するため、Lambda関数側では実装不要ということです。

イベントソースマッピング

Resources:
  EventSourceMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      BatchSize: !Ref BatchSize
      Enabled: true
      EventSourceArn: !Ref QueueArn
      FunctionName: !Ref Function2
Code language: YAML (yaml)

イベントソースマッピングを作成し、SQSキューとLambda関数を関連付けます。
EventSourceArnプロパティでキューを、FunctionNameプロパティで関数を指定します。

BatchSizeプロパティで、関数がポーリングする最大数を指定できます。
今回は検証ということで、「1」を指定します。
つまり1回のポーリングで、最大1つのメッセージを取得します。

IAMロール

Resources:
  LambdaRole2:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - lambda.amazonaws.com
      Policies:
        - PolicyName: GetSSMParameter
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - sqs:ReceiveMessage
                  - sqs:DeleteMessage
                  - sqs:GetQueueAttributes
                Resource:
                  - !Ref QueueArn
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Code language: YAML (yaml)

以下の通り、AWS公式ページにおいて、関数をトリガーするために必要な権限が言及されています。

Lambda 実行ロールに以下の許可が含まれている必要があります:
・sqs:DeleteMessage
・sqs:GetQueueAttributes
・sqs:ReceiveMessage

AWS Lambda 関数 (コンソール) をトリガーするキューの設定

上記の引用に従い、Lambda関数用のIAMロールに3つの権限を付与します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • SQSキュー:fa-114-Queue
  • Lambda関数1:fa-114-Function1
  • Lambda関数2:fa-114-Function2

AWS Management Consoleから各リソースを確認します。

SQSキューを確認します。

Detail of SQS 1.

正常にキューが作成されています。

Lambdaトリガーに後述のLambda関数2が指定されています。
つまりこのキューにメッセージが格納されている場合は、自動的に関数2がメッセージを受け取ることになります。

Lambda関数を確認します。

Detail of Lambda 1.
Detail of Lambda 2.

2つの関数が作成されています。
1つ目の関数は先述のSQSキューに現在日時データを送信する内容です。
2つ目の関数はeventオブジェクトを出力する内容です。

動作確認

Detail of Lambda 3.

準備が整いましたので、関数1を実行します。

正常に動作しました。

これで関数1からSQSキューにメッセージが送られ、これを関数2が受け取って自動実行されるはずです。

関数2の実行ログを確認します。

Detail of Lambda 4.

確かに関数2が自動実行されました。
eventオブジェクトにSQSキューに送られたメッセージが格納されていることがわかります。

以上のことから、SQSキューにLambda関数を関連づけることで、キューにメッセージが格納される度に、自動的に関数を実行させることができました。

まとめ

SQSキューでLambda関数をトリガーする方法をご紹介しました。

目次