【问题标题】:Unable to create an S3 PutObjectEvent for Lambda funtion using SAM Template无法使用 SAM 模板为 Lambda 函数创建 S3 PutObject 事件
【发布时间】:2020-12-21 12:11:01
【问题描述】:

我是 SAM 模板的新手。我的 SAM 模板有以下 sn-p,我曾经在其中将存储桶名称的名称作为参数从这个 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', 'ID 为 [S3PutObjectEvent] 的事件无效。S3 事件必须引用同一模板中的 S3 存储桶。')] ('MyLambda', 'ID 为 [S3PutObjectEvent] 的事件无效。S3事件必须引用同一模板中的 S3 存储桶。')

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

有什么办法解决吗?这对我来说确实是个关键问题。感谢您对此的帮助。谢谢

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudformation aws-sam


    【解决方案1】:

    Bucket 创建由 Lambda 代码自己完成

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

    尝试在您的 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
    

    【讨论】:

    • 问题是我的存储桶必须是动态的,基于不同的环境,比如开发、测试 QA。例如,对于 dev,例如 mybucket-dev 或对于 a,例如 mybucket-qa...如何在您的新方法中使用相同的参数(在 sam 模板之外)?
    • 通过提供存储桶名称,将为使用您的 Cloudformation 模板创建的每个堆栈创建一个唯一的存储桶名称...但是更新答案以解决此问题
    • 谢谢,它现在对我有用。真的很感激:)
    猜你喜欢
    • 2021-11-17
    • 2020-07-20
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2019-09-01
    • 2017-10-01
    相关资源
    最近更新 更多