🗂

Lambda実行失敗時の送信先にS3を指定する

2025/02/16に公開

Lambda実行に失敗した場合、ペイロードデータをS3に保存することができます。
https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-lambda-s3-failed-event-destination-stream-event-sources/

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#s3-destination-security

設定をしようとしたら少しハマったのでメモを残しておきます。
情報は2025/02/14時点のものです。

送信先にはS3バケットのパスは指定できない

S3バケットのARNを指定は出来ますが、バケットのパスまでは指定できません。
つまり my-lambda-failure-logsというバケットがあった場合、 my-lambda-failure-logs/service-a のような指定ができないということです。

パスまで指定して保存しようとすると、
The function execution role does not have permissions to call ListBucket on S3 というエラーがでます。

ドキュメントの権限情報が間違っている

注:2025/02/14時点

ドキュメントを見ると、以下の権限が書かれています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::*/*",
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}

しかし正確には以下の権限が必要です。(ListBucketの権限が間違っている)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::*",
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        },
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*/*",
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}

送信先をS3にした場合、「必要なアクセス許可を追加」を有効化しても実行ロールへ必要な権限が付与されない

注:2025/02/14時点

「必要なアクセス許可を追加」を有効化した場合、送信先タイプとして "SNSトピック"、"SQSキュー"、"Lambda関数" などを指定した場合には、実行ロールへ必要な権限が付与されるが、
送信先タイプに "S3バケット" を指定した場合には、現時点では対応していない。(サポートに確認済み)

Discussion