⚠️

AWS SAMでLambdaをS3トリガー起動する場合、マネジメントコンソールにトリガー表示がされない件の対処法

2023/09/17に公開

問題

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に定義する必要があります。

https://github.com/aws/serverless-application-model/issues/300
にて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