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

上記のページでは、キューからメッセージを受け取る関数は、手動で実行していました。
本ページでは、以下のAWS公式ページで取り上げられているように、Lambda関数を自動的に実行することを考えます。
AWS Lambda 関数を使用して Amazon SQS キューのメッセージを処理できます。Lambda はキューをポーリングし、Lambda 関数を、キューメッセージを含むイベントと共に同期的に呼び出します。
AWS Lambda 関数 (コンソール) をトリガーするキューの設定
構築する環境

冒頭で取り上げたページと概ね同様の環境です。
Lambda関数2において、SQSキューをポーリングし、キューにメッセージがあれば、それを受け取って処理します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/114
テンプレートファイルのポイント解説
本ページでは、SQSキューでLambda関数をトリガーする方法をご紹介します。
それ以外の事項については、以下のページをご紹介します。

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

実行するコードですが、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 実行ロールに以下の許可が含まれている必要があります:
AWS Lambda 関数 (コンソール) をトリガーするキューの設定
・sqs:DeleteMessage
・sqs:GetQueueAttributes
・sqs:ReceiveMessage
上記の引用に従い、Lambda関数用のIAMロールに3つの権限を付与します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- SQSキュー:fa-114-Queue
- Lambda関数1:fa-114-Function1
- Lambda関数2:fa-114-Function2
AWS Management Consoleから各リソースを確認します。
SQSキューを確認します。

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


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

準備が整いましたので、関数1を実行します。
正常に動作しました。
これで関数1からSQSキューにメッセージが送られ、これを関数2が受け取って自動実行されるはずです。
関数2の実行ログを確認します。

確かに関数2が自動実行されました。
eventオブジェクトにSQSキューに送られたメッセージが格納されていることがわかります。
以上のことから、SQSキューにLambda関数を関連づけることで、キューにメッセージが格納される度に、自動的に関数を実行させることができました。
まとめ
SQSキューでLambda関数をトリガーする方法をご紹介しました。