0
0

More than 1 year has passed since last update.

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

Posted at

はじめに

S3のイベントをSQSキューに入れて、Lambdaに渡すまでの操作をまとめました。
Screen Shot 2022-08-25 at 22.06.41.png

やること

  • Lambda関数の作成 → SQS権限設定
  • SQSキューの作成 → Lambdaトリガー設定
  • S3バケットの作成 → イベント通知設定

1. Lambda関数の作成

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

関数名:test-202208(任意のもの)
ランタイム:Python3.9

その他はデフォルト設定のまま「関数の作成」
Screen Shot 2022-08-25 at 20.29.21.png
SQSの権限を設定したいので、「設定」→「アクセス権限」→「ロール名」をクリック
Screen Shot 2022-08-25 at 20.33.57.png

IAMコンソールの画面が開きます。
右上の「許可を追加」→「ポリシーをアタッチ」をクリック
Screen Shot 2022-08-25 at 20.36.48.png
「SQS」とフィルター検索をかけて、「AmazonSQSFullAccess」を選択→「ポリシーをアタッチ」(用途に応じて最小権限を選択するのがベストプラクティスです)
Screen Shot 2022-08-25 at 20.39.00.png

lambda_function.py に以下のコードを書いて「Deploy」します。

# 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
キューの名前(任意のもの)を入力して、その他はデフォルト設定のまま「キューを作成」
Screen Shot 2022-08-25 at 20.17.07.png
作成したキューにLambda関数のトリガーを設定していきます。
「Lambdaトリガー」→「Lambda関数トリガーを設定」をクリック。

先ほど作成したLambda関数を選択して「保存」。
Screen Shot 2022-08-25 at 23.17.16.png
アクセス権限も設定する必要がありますが、先にS3バケットを作成します。

3. S3バケットの作成

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

その他の設定はデフォルトのまま作成。
Screen Shot 2022-08-25 at 20.10.54.png
イベント通知の設定をしていきます。
先ほど作成したバケットの「プロパティ」→「イベント通知」→「イベント通知を作成」をクリック。
Screen Shot 2022-08-25 at 20.59.27.png
イベント名を入力し、任意でプレフィックス・サフィックスを設定します。
(今回は試しに「.jpg」がアップロードされた場合のみイベントが発火するよう設定します)
Screen Shot 2022-08-25 at 21.19.52.png
イベントタイプは「PUT」にチェック。
Screen Shot 2022-08-25 at 21.21.51.png
送信先は「SQSキュー」を選択し、先ほど作成したSQSキューを選択して「変更の保存」。
Screen Shot 2022-08-25 at 21.22.28.png
エラーが出ました。
SQS側でのアクセス権限が必要になるので、SQSのコンソールに戻ります。
Screen Shot 2022-08-25 at 21.24.01.png

4. SQSのアクセス権限を設定

先ほど作成したSQSキューの詳細設定画面から「アクセスポリシー」→「編集」をクリック。
Screen Shot 2022-08-25 at 21.30.55.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

{
  "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
Lambda関数のモニタリング画面を開きます。
Screen Shot 2022-08-25 at 21.44.27.png
イベントの中身を見ると、オブジェクトが確認できました。
S3→SQS→Lambdaの連携成功です🎉
Screen Shot 2022-08-25 at 21.48.04.png

おわりに

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0