S3 イベント通知で Lambda が呼び出されないときは、オートメーションランブックで原因を特定しよう!
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
Amazon S3 のイベント通知を設定したのに、Lambda 関数が一向に呼び出されない…そんな経験はありませんか?
設定ミス?権限不足?それとも別の原因?
原因を特定するには、S3 の通知設定や Lambda のリソースポリシーを一つひとつ確認する必要があり、意外と手間がかかります。
AWS が提供する Systems Manager Automation ランブック「AWSSupport-TroubleshootLambdaS3Event」 を使うと、S3 イベント通知のトラブルシューティングを効率化できます。
実際に使ってみたのでランブックの概要や実際の使用方法についてご紹介します!
ランブックの概要
「AWSSupport-TroubleshootLambdaS3Event」は Amazon S3 イベント通知の構成設定の検証を行うランブックです。
Amazon S3 イベント通知を設定した AWS Lambda 関数をトリガーできなかった原因を特定するのに役立ちます。
必要な権限が不足している場合は、出力として必要権限を付与を行う AWS CLI コマンドを生成してくれます。
処理の概要
ランブックで実施している処理の概要を簡単にまとめてみました。
- S3 バケットと Lambda 関数が存在するかを確認します。
- S3 バケットの通知設定を取得し、Lambda 関数への設定とフィルタールールの確認を行います。
- Lambda 関数 のリソースポリシーを取得し、S3 バケットからのイベント通知を受け取る権限があるかを確認します。
- 分析結果を統合し、対処方法の AWS CLI コマンドを含む最終的なレポートを生成します。
入力パラメータ
パラメーター | 必須 | 説明 | 備考 |
---|---|---|---|
AutomationAssumeRole | Systems Manager Automation がユーザーに代わってアクションを実行する IAM ロール名 | 指定なしの場合は実行者の権限を使用 | |
LambdaFunctionArn | ○ | Lambda 関数の ARN(Amazon Resource Name) | |
S3BucketName | ○ | S3 バケット名 |
やってみた
S3 バケットと Lambda 関数を作成し、S3 イベント通知を設定します。
S3 サービスに Lambda 関数の呼び出しを許可するリソースベースのポリシー設定が行われていない状態でランブックを実行してみます。
IAM ロールの設定(任意)
本ランブックでは Systems Manager Automation がユーザーに代わってアクションを実行できるよう、任意で IAM ロールの指定が可能です。
今回は最小限の権限とした専用のロールを作成し、AutomationAssumeRole パラメータに指定しました。
ロール名:SSM-TroubleshootLambdaS3Event-Role
- インラインポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:GetFunction",
"s3:ListBucket",
"s3:GetBucketNotification",
"lambda:GetPolicy"
],
"Resource": "*"
}
]
}
- 信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ランブック実行
下記 URL よりドキュメントを開きます。
次のパラメータを指定して「Execute」をクリックします。
- AutomationAssumeRole:SSM-TroubleshootLambdaS3Event-Role
- LambdaFunctionArn:Lambda 関数の ARN
- S3BucketName:S3 バケット名
実行結果
出力結果には次のような内容が表示されました。
- リソースベースポリシーが不足していることを示すメッセージ
- リソースに適した AWS CLI コマンド
{"Payload":"
+-+-+ AWSSupport-TroubleshootS3Lambda Runbook Report +-+-+
The runbook was executed against following resources:
* Amazon S3 Bucket: XXXXXXXXXX
* AWS Lambda Function: XXXXXXXXXX
Please read each report below and take any action if necessary.
-------------------------------------------------------
S3 Event Notification Configuration Analysis Result
-------------------------------------------------------
Event notification configuration found for the AWS Lambda function XXXXXXXXXX as follows:
Configuration ID: s3
---------------
* Events: [\"s3:ObjectCreated:Put\", \"s3:ObjectCreated:Post\"]
* Filter Rules: [{\"Name\": \"Prefix\", \"Value\": \"\"}, {\"Name\": \"Suffix\", \"Value\": \"\"}]
--> No special characters or wildcard character ('*') found in filter rules.
-------------------------------------------------------
Lambda Function Resource Policy Analysis Result
-------------------------------------------------------
!!! Action Required !!!
The provided AWS Lambda function 'XXXXXXXXXX' does not have resource policy configured for the Amazon S3 bucket XXXXXXXXXX. Please configure one by following the tutorial below.
- Tutorial: Using an Amazon S3 trigger to invoke a Lambda function
https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
Alternatively, you can configure resource policy by executing the following AWS CLI command.
\```
aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:XXXXXXXXXX:function:XXXXXXXXXX --action lambda:InvokeFunction --statement-id XXXXXXXXXX --principal s3.amazonaws.com --source-arn arn:aws:s3:::XXXXXXXXXX --source-account XXXXXXXXXX
\```
"}
まとめ
AWS CLI などで S3 のイベント通知を設定する場合は、Lambda 側のリソースベースポリシーを手動で追加する必要があり、設定を忘れることが多いです。
「AWSSupport-TroubleshootLambdaS3Event」を活用すると効率的にトラブルシューティングができます。
本記事が参考になれば幸いです。
参考