⚠️
AWS SAMでLambdaをS3トリガー起動する場合、マネジメントコンソールにトリガー表示がされない件の対処法
問題
S3トリガーで起動するLambda関数を定義したところ、Lambdaのコンソール上でS3トリガの表示が出てきませんでした。
ソースコード
AWS SAMでS3バケット定義とS3トリガーで起動するLambdaの定義を書いてあるのが下記template.yaml
です。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-playground-typescript
Sample SAM Template for sam-playground-typescript
Globals:
Function:
Timeout: 3
Resources:
MyS3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: my-unique-s3-bucket-name-aaaaaaaaaaaaaa
HelloWorldFunction:
Type: AWS::Serverless::Function
Name: s3-trigger-function
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs18.x
Architectures:
- x86_64
Events:
S3Trigger:
Type: S3
Properties:
Bucket: !Ref MyS3Bucket
Events: s3:ObjectCreated:Put
Metadata:
BuildMethod: esbuild
BuildProperties:
Minify: true
Target: "es2020"
Sourcemap: true
EntryPoints:
- app.ts
どういうことか
Lambdaを呼び出す側に設定するリソースポリシーを、明示的にtemplate.yaml
に定義する必要があります。
にてissueが上がっていたようです。
S3トリガーでLambdaを起動する設定を記載する場合、リソースポリシーを明示的に書いていなくても、SAMは内部的にリソースポリシーを設定してくれているようです。実際に明示的なリソースポリシーの定義がなくとも、S3にファイルをアップロードしたところ、そのトリガーで起動されたLambda関数の実行を確認できました。
対処法
template.yaml
にリソースポリシーを明示的に追加します。
template.yaml
# Lambda関数のPermissionを明示的に追加
MyFunctionInvokePermission:
Type: 'AWS::Lambda::Permission'
Properties:
FunctionName: !GetAtt HelloWorldFunction.Arn
Action: 'lambda:InvokeFunction'
Principal: 's3.amazonaws.com'
SourceAccount: !Ref 'AWS::AccountId'
SourceArn: !GetAtt MyS3Bucket.Arn
デプロイ後、マネジメントコンソール上でS3トリガの表示が確認できました。
Discussion