Amazon S3 → Amazon SQS → AWS Lambda を連携する

# はじめに
S3のイベントをSQSキューに入れて、Lambdaに渡すまでの操作をまとめました。
![Screen Shot 2022-08-25 at 22.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/d23f455f-42ab-5fd7-4bf8-13b7129ad88a.png)

# やること
- Lambda関数の作成 → SQS権限設定
- SQSキューの作成 → Lambdaトリガー設定
- S3バケットの作成 → イベント通知設定

# 1. Lambda関数の作成

まずはLambda関数を作成します。

関数名：test-202208（任意のもの）
ランタイム：Python3.9

その他はデフォルト設定のまま「関数の作成」
![Screen Shot 2022-08-25 at 20.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/0d5abec1-4b8e-e548-ea1d-41f02086954d.png)
SQSの権限を設定したいので、「設定」→「アクセス権限」→「ロール名」をクリック
![Screen Shot 2022-08-25 at 20.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/decf619e-5134-a684-a98f-16a10c2d3339.png)

IAMコンソールの画面が開きます。
右上の「許可を追加」→「ポリシーをアタッチ」をクリック
![Screen Shot 2022-08-25 at 20.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/fa49c85f-5dea-d6d4-e0b9-9d2c29c1c740.png)
「SQS」とフィルター検索をかけて、「AmazonSQSFullAccess」を選択→「ポリシーをアタッチ」（用途に応じて最小権限を選択するのがベストプラクティスです）
![Screen Shot 2022-08-25 at 20.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/c2c16e5e-3397-7779-3ac7-30687d81bc37.png)

lambda_function.py に以下のコードを書いて「Deploy」します。
```Python
# coding: utf-8
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(event)
```
# 2. SQSキューの作成

「キューを作成」をクリック
![Screen Shot 2022-08-25 at 20.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/b2c37568-5a95-2bb5-abb7-6903f4f4793d.png)
キューの名前（任意のもの）を入力して、その他はデフォルト設定のまま「キューを作成」
![Screen Shot 2022-08-25 at 20.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/6bef2f69-3997-bf35-1263-deea83a8a4d7.png)
作成したキューにLambda関数のトリガーを設定していきます。
「Lambdaトリガー」→「Lambda関数トリガーを設定」をクリック。

先ほど作成したLambda関数を選択して「保存」。
![Screen Shot 2022-08-25 at 23.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/fe0163c1-2b33-ee9f-8b73-ab2ed44cdfc9.png)
アクセス権限も設定する必要がありますが、先にS3バケットを作成します。

# 3. S3バケットの作成

バケット名：sqs-lambda-test-202208　※バケット名はグローバルで一意のもの
リージョン：ap-northeast-1（東京）

その他の設定はデフォルトのまま作成。
![Screen Shot 2022-08-25 at 20.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/8d89b81a-fa8d-b4bc-a9a0-0f455320b92a.png)
イベント通知の設定をしていきます。
先ほど作成したバケットの「プロパティ」→「イベント通知」→「イベント通知を作成」をクリック。
![Screen Shot 2022-08-25 at 20.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/c821d2e8-cd69-7236-2b87-18c07759eabd.png)
イベント名を入力し、任意でプレフィックス・サフィックスを設定します。
（今回は試しに「.jpg」がアップロードされた場合のみイベントが発火するよう設定します）
![Screen Shot 2022-08-25 at 21.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/5ec6863b-9039-002e-5fe5-6ea1c8cb89f2.png)
イベントタイプは「PUT」にチェック。
![Screen Shot 2022-08-25 at 21.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/9a11b560-23f6-fed0-f98b-120955064e97.png)
送信先は「SQSキュー」を選択し、先ほど作成したSQSキューを選択して「変更の保存」。
![Screen Shot 2022-08-25 at 21.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/a51a8b48-e0a9-054e-151f-a02743085fcc.png)
エラーが出ました。
SQS側でのアクセス権限が必要になるので、SQSのコンソールに戻ります。
![Screen Shot 2022-08-25 at 21.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/16264f6a-1cff-2838-c9f3-b8445d4b86a3.png)

# 4. SQSのアクセス権限を設定
先ほど作成したSQSキューの詳細設定画面から「アクセスポリシー」→「編集」をクリック。
![Screen Shot 2022-08-25 at 21.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/949fa698-2489-1659-e970-b8bff350a66d.png)
以下のJSONのようにポリシーを書き換えて保存します。
**"Resource"**: 「XXXXXXXXXXXX」の部分をAWSアカウントID、「test-202208」を先ほど作成したLambda関数名に修正
**"Condition"**：「sqs-lambda-test-202208」部分を先ほど作成したS3バケット名に修正
（補足：AWSアカウントIDは、以下の場所で確認できます。）
![Screen Shot 2022-08-25 at 21.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/421cfe1e-dc04-4eb5-7bce-088cc289d95f.png)

```JSON
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__owner_statement",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-northeast-1:XXXXXXXXXXXX:test-202208",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:s3:::sqs-lambda-test-202208"
        }
      }
    }
  ]
}
```
再びS3の画面に戻ると、イベント通知の作成の「変更の保存」ができるようになっているはずです。

# 5. 疎通確認
S3バケットにサンプルファイルをアップロードします。
先ほどサフィックスに「.jpg」を設定したので、「sample.jpg」をアップロードしてみます。
![Screen Shot 2022-08-25 at 21.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/9a6cdf70-5086-07a0-d7f2-15020fccc154.png)
Lambda関数のモニタリング画面を開きます。
![Screen Shot 2022-08-25 at 21.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/1b87a9c2-4ce6-1073-7658-21e7f098e434.png)
イベントの中身を見ると、オブジェクトが確認できました。
S3→SQS→Lambdaの連携成功です🎉
![Screen Shot 2022-08-25 at 21.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/44be0221-431a-77af-73dd-466eba2ab7d3.png)

# おわりに
権限の設定が多少面倒ですが、意外と簡単に連携させることができました。