amazon-web-services - 如何通过 CloudFormation YAML 将堆栈导出的现有 S3 存储桶导入另一个堆栈

标签 amazon-web-services amazon-s3 aws-lambda yaml aws-cloudformation

像下面的 CloudformationYAML 一样有效。我最终得到了一个 lambda 函数,只要 S3 存储桶上出现新对象,就会触发该函数。

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref myS3BucketName
      AccessControl: Private
      VersioningConfiguration:
        Status: Enabled

LambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: main.handler
      CodeUri:
        Bucket: !Ref CodeBucketName
        Key: !Ref CodeKey
      Role: !GetAtt
        - LambdaRole
        - Arn
      Runtime: nodejs12.x
      Timeout: !Ref LambdaTimeOut
      MemorySize: !Ref LambdaMemory
      FunctionName: !Sub '${Environment}-${FunctionName}'
      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !Ref myS3BucketResource
            Events: 
              - 's3:ObjectCreated:Put'

但是,我需要做的是让 lambda 函数使用现有的 S3 存储桶,该存储桶是由另一个堆栈创建的。请注意,在上面,S3 存储桶是由创建 lambda 的同一个 CF 模板创建的。

我似乎不能只引用 S3Event 的 Bucket 属性中的 S3 存储桶名称,如下所示:

      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !Ref myS3BucketName
            Events: 
              - 's3:ObjectCreated:Put'

所以我认为这是因为它需要是一个资源而不是一个字符串,至少基于上面可以工作的 CF 模板。

我读到了有关 Fn::ImportValue 的内容,用于导入由另一个堆栈导出的内容 - 这就是我需要使用的 S3 存储桶的情况。但我不知道如何在 CF 模板上指定它。

例如,在下面尝试过,但它不起作用。没有 Type: AWS::S3::Bucket 行。

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket
    Properties:
      Bucket:
        Fn::ImportValue: !Sub "${exportedS3Bucket}"

任何线索将不胜感激。如果有一种方法可以指定 Bucket 而无需通过导入路由,那么这确实是最好的。

谢谢!

最佳答案

However, what I need to do is to have the lambda function use an already existing S3 bucket, which was created by another stack.

假设您可以控制 S3 存储桶 存储桶堆栈,您可以 export它在其他堆栈中可见,以便它们可以 imported给他们。您已经正确指出了这一点

由于您尚未提供导出其输出的存储桶堆栈的代码,因此我必须根据示例来回答我的问题。在示例中,请注意 exportedBucket 名称的使用。

桶堆栈:

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket

Outputs:
  Name: 
    Value: !Ref myS3BucketResource
    Export:
      Name: exportedBucket  # <---- export bucket

lambda stack 它将使用存储桶堆栈中的存储桶:

LambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: main.handler
      CodeUri:
        Bucket: !Ref CodeBucketName
        Key: !Ref CodeKey
      Role: !GetAtt
        - LambdaRole
        - Arn
      Runtime: nodejs12.x
      Timeout: !Ref LambdaTimeOut
      MemorySize: !Ref LambdaMemory
      FunctionName: !Sub '${Environment}-${FunctionName}'
      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !ImportValue exportedBucket  # <---- import bucket
            Events: 
              - 's3:ObjectCreated:Put'

关于amazon-web-services - 如何通过 CloudFormation YAML 将堆栈导出的现有 S3 存储桶导入另一个堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62056443/

相关文章:

amazon-web-services - 使用链接和 AWS-Lambda 启动 AWS 实例

amazon-web-services - Traefik + 让我们在 AWS Lightsail 上加密

amazon-web-services - 创建 Amazon EC2 (AWS) 实例需要很长时间吗?

android - 适用于 iOS/Android 的 AWS 移动开发工具包中内置网络的安全性如何?

amazon-web-services - SSL 证书错误 : [SSL: CERTIFICATE_VERIFY_FAILED] when using aws client in windows 10

amazon-web-services - 如何在 AWS 上使用无服务器框架拥有可选资源

python - 使用正则表达式的 Amazon S3 查询

amazon-s3 - Cloudfront - 无法使用于返回 403 的对象失效

javascript - 从 AWS S3 存储桶上的 html 文件弹出窗口 postMessage()

amazon-web-services - 无法将条件语句与 s3 存储桶策略中的操作和资源匹配