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関数をトリガーする方法をご紹介しました。