はじめに
S3のイベントをSQSキューに入れて、Lambdaに渡すまでの操作をまとめました。
やること
- Lambda関数の作成 → SQS権限設定
- SQSキューの作成 → Lambdaトリガー設定
- S3バケットの作成 → イベント通知設定
1. Lambda関数の作成
まずはLambda関数を作成します。
関数名:test-202208(任意のもの)
ランタイム:Python3.9
その他はデフォルト設定のまま「関数の作成」
SQSの権限を設定したいので、「設定」→「アクセス権限」→「ロール名」をクリック
IAMコンソールの画面が開きます。
右上の「許可を追加」→「ポリシーをアタッチ」をクリック
「SQS」とフィルター検索をかけて、「AmazonSQSFullAccess」を選択→「ポリシーをアタッチ」(用途に応じて最小権限を選択するのがベストプラクティスです)
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キューの作成
「キューを作成」をクリック
キューの名前(任意のもの)を入力して、その他はデフォルト設定のまま「キューを作成」
作成したキューにLambda関数のトリガーを設定していきます。
「Lambdaトリガー」→「Lambda関数トリガーを設定」をクリック。
先ほど作成したLambda関数を選択して「保存」。
アクセス権限も設定する必要がありますが、先にS3バケットを作成します。
3. S3バケットの作成
バケット名:sqs-lambda-test-202208 ※バケット名はグローバルで一意のもの
リージョン:ap-northeast-1(東京)
その他の設定はデフォルトのまま作成。
イベント通知の設定をしていきます。
先ほど作成したバケットの「プロパティ」→「イベント通知」→「イベント通知を作成」をクリック。
イベント名を入力し、任意でプレフィックス・サフィックスを設定します。
(今回は試しに「.jpg」がアップロードされた場合のみイベントが発火するよう設定します)
イベントタイプは「PUT」にチェック。
送信先は「SQSキュー」を選択し、先ほど作成したSQSキューを選択して「変更の保存」。
エラーが出ました。
SQS側でのアクセス権限が必要になるので、SQSのコンソールに戻ります。
4. SQSのアクセス権限を設定
先ほど作成したSQSキューの詳細設定画面から「アクセスポリシー」→「編集」をクリック。
以下のJSONのようにポリシーを書き換えて保存します。
"Resource": 「XXXXXXXXXXXX」の部分をAWSアカウントID、「test-202208」を先ほど作成したLambda関数名に修正
"Condition":「sqs-lambda-test-202208」部分を先ほど作成したS3バケット名に修正
(補足:AWSアカウントIDは、以下の場所で確認できます。)
{
"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」をアップロードしてみます。
Lambda関数のモニタリング画面を開きます。
イベントの中身を見ると、オブジェクトが確認できました。
S3→SQS→Lambdaの連携成功です🎉
おわりに
権限の設定が多少面倒ですが、意外と簡単に連携させることができました。