はじめに
S3をトリガーにしてLambdaでSQSにメッセージを送信するの続きとして、SQSのキューに入ったメッセージをLambdaで取得する方法のメモ。
目標
図のように、SQSをトリガーにして、Lambdaを起動させる。
1. SQSでキューを作成する
キューの新規作成
キューを新規作成する。詳細はこちらを参照。
既にあるキューを使用する場合は2.以降を実施。
標準とFIFOの違い、ショートポーリングとロングポーリング(メッセージ受信待機時間0がショート、それ以外はロング)の違いは以下を参照。
2. Lambda関数を作成する
SQSのメッセージを取り出すコードを作成
lambda_function.py
import json
def lambda_handler(event, context):
# eventオブジェクトからメッセージとキュー名称を取得
msg = event['Records'][0]['body']
queue = event['Records'][0]['eventSourceARN']
# メッセージとキューを返す
return {
'statusCode': 200,
'body': {'Message':msg, 'Queue':queue}
}
eventオブジェクトの例
SQSから送られてくるevent
の構造は以下の形になっている。
{
"Records": [
{
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
"receiptHandle": "MessageReceiptHandle",
"body": "Hello from SQS!",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1523232000000",
"SenderId": "123456789012",
"ApproximateFirstReceiveTimestamp": "1523232000001"
},
"messageAttributes": {},
"md5OfBody": "{{{md5_of_body}}}",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue",
"awsRegion": "us-east-1"
}
]
}
LambdaにSQS向けのポリシーをアタッチ
Lambdaの実行ロールに「AWSLambdaSQSQueueExecutionRole」のポリシーをアタッチする。
3. SQSでキューにLambdaトリガーを設定する
キューを選択し、「Lambdaトリガー」→「Lambda関数トリガーを設定」
4. テスト
テストイベントを作成
テンプレートでSQS(sqs-recieve-message)を選択する。
実行結果
参考
[serverless] AWS LambdaのイベントソースにSQSを使う
SQSのメッセージをトリガーにLambdaを起動する
SQSのイベントをトリガーに起動するLambdaの仕組みを完全に理解する