AWS

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

スポンサーリンク
SQSキューでLambda関数をトリガーする AWS
スポンサーリンク
スポンサーリンク

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

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

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

本ページでは、以下の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テンプレートを配置しています。

awstut-fa/114 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

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

本ページでは、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 実行ロールに以下の許可が含まれている必要があります:
・sqs:DeleteMessage
・sqs:GetQueueAttributes
・sqs:ReceiveMessage

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

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

環境構築

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オブジェクトを出力する内容です。

動作確認

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

Detail of Lambda 3.

正常に動作しました。

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

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

Detail of Lambda 4.

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

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

まとめ

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

タイトルとURLをコピーしました