SQSのキューをトリガーにしてLambdaでメッセージを受信する(Python)

## はじめに
[S3をトリガーにしてLambdaでSQSにメッセージを送信する](https://qiita.com/ybsh2891/items/55a2c95a15234acd64d7)の続きとして、SQSのキューに入ったメッセージをLambdaで取得する方法のメモ。

## 目標
図のように、SQSをトリガーにして、Lambdaを起動させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/0c31e192-bcc3-6325-7737-c610b4e790ec.png)

## 1. SQSでキューを作成する
### キューの新規作成
キューを新規作成する。詳細は[こちら](https://qiita.com/ybsh2891/items/55a2c95a15234acd64d7#1-sqs%E3%81%A7%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参照。
既にあるキューを使用する場合は2.以降を実施。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/3bc5d328-411b-afbd-ae9a-9d390f20e40c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/bb0e8c71-c229-dc2b-a758-6affed66db3b.png)

標準とFIFOの違い、ショートポーリングとロングポーリング(メッセージ受信待機時間0がショート、それ以外はロング)の違いは以下を参照。

https://ya6mablog.com/aws-sqs/#index_id11

## 2. Lambda関数を作成する
### SQSのメッセージを取り出すコードを作成
```python: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`の構造は以下の形になっている。
```json
{
  "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」のポリシーをアタッチする。
![lambda_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/a09e4ac8-bb6c-4e10-46e3-fafdb6ab3234.png)



## 3. SQSでキューにLambdaトリガーを設定する
キューを選択し、「Lambdaトリガー」→「Lambda関数トリガーを設定」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/62d123d6-c90e-cc16-2205-03bc825b0a0e.png)

起動したいLambda関数を選択し、保存する。
![lambda_sqs_trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/2b281e4c-d8df-7ccf-bb8f-aa3e70463750.png)

リストに起動したいLambda関数が追加され、設定完了。
![lambda_sqs_trigger_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/f61311c0-c57f-643a-f426-d41f778a105e.png)

## 4. テスト
### テストイベントを作成
テンプレートでSQS(sqs-recieve-message)を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/9905e008-06c2-8c82-d19b-d237eacf9a57.png)
### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/5d2b4915-0f7a-726e-ffeb-a220169a9ef0.png)

## 参考
[[serverless] AWS LambdaのイベントソースにSQSを使う](https://dev.classmethod.jp/articles/sqs-lambda/)
[SQSのメッセージをトリガーにLambdaを起動する](https://qiita.com/leomaro7/items/28d646bb34f9a244c24f)
[SQSのイベントをトリガーに起動するLambdaの仕組みを完全に理解する](https://bluepixel.hatenablog.com/entry/2020/05/06/070732)