无法使用 SAM 模板为 Lambda 函数创建 S3 PutObject 事件

Unable to create an S3 PutObjectEvent for Lambda funtion using SAM Template

我是 SAM 模板的新手。我有以下 SAM 模板片段,我曾在其中将存储桶名称的名称作为此 SAM YAML 文件外部的参数传递:-

SAM 模板:-

MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./functions/test/dist/
      Handler: index.lambdaHandler
      Runtime: nodejs12.x
      Events:
        S3PutObjectEvent:
          Type: S3
          Properties:
            Bucket: !Ref S3BucketName
            Events: s3:ObjectCreated:*

Parameter.YAML:-

DeploymentEnvironment:
  default:
     S3BucketName: my-awesome-s3-bucket

现在,我不使用 SAM 模板或基础架构即代码 (IaC) 创建任何 S3 存储桶。存储桶创建由 Lambda 代码本身完成,因此我的 SAM 模板中没有 S3 对象类型声明。

当我执行这个命令时,sam validate 来验证 SAM 模板然后我得到这个错误:-

/template.yaml' 是无效的 SAM 模板。 错误:[InvalidResourceException('MyLambda', 'Event with id [S3PutObjectEvent] is invalid. S3 events must reference an S3 bucket in the same template.')] ('MyLambda', 'Event with id [S3PutObjectEvent] is invalid. S3 events must reference an S3 bucket in the same template.')

我真的很需要你的帮助来实现这个目标,因为我努力解决了这个问题。我看了各种论坛,不确定我们是否可以从 SAM 模板外部传递存储桶名称。

有什么解决办法吗?这对我来说真的很关键。感谢您对此的帮助。谢谢

Bucket creation is done by Lambda code itself

我建议不要使用这种模式,因为如果 Bucket 不存在,您的 Lambda even 源将不会被创建。

尝试在您的 SAM 模板中创建存储桶,并将存储桶名称作为环境变量传递给您的函数。

您可以选择使用参数在存储桶名称(寻址注释)上设置不同的环境名称。

Parameters:
  Env:
    Type: String
    AllowedValues:
      - dev
      - qa
      - prod
    Default: dev
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
      Properties:
        BucketName: !Sub 'My-unique-bucket-name-${Env}'
  MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./functions/test/dist/
      Handler: index.lambdaHandler
      Runtime: nodejs12.x
      Environment:
        Variables:
          BUCKET_NAME: !Ref MyBucket  # passed to Lambda as environment variable
      Events:
        S3PutObjectEvent:
          Type: S3
          Properties:
            Bucket: !Ref MyBucket
            Events: s3:ObjectCreated:*

并在您的函数中获取存储桶名称

const bucket = process.env.BUCKET_NAME