【问题标题】:Importing s3 Bucket in Cloudformation template在 Cloudformation 模板中导入 s3 存储桶
【发布时间】:2021-05-06 02:35:44
【问题描述】:

在 Cloudformation 模板中,我定义了两个 S3 存储桶。

 Bucket1:
  Type: AWS::S3::Bucket
  Properties:
   ...
 Bucket2:
  Type: AWS::S3::Bucket
  Properties:
   ...

Outputs:
 Bucket1:
  Description: S3 Bucket
  Value: !Ref Bucket1
  Export:
   Name: !Sub "${AWS::StackName}:Bucket1"
 Bucket2:
  Description: S3 Bucket
  Value: !Ref Bucket2
  Export:
   Name: !Sub "${AWS::StackName}:Bucket2"

我在两个不同的 cloudformation 模板中使用这些导出的存储桶。

模板 1

Parameters:
 LoaderCodeBucket:
  Type: String

Resources:
 MyLambdaFunction:
  Type: AWS::Lambda::Function
  Properties:
   Code:
    S3Bucket:
     Fn::ImportValue:
      !Sub "${LoaderCodeBucket}:Bucket1"

模板 2

Parameters:
 ProcessorCodeBucket:
  Type: String

Resources:
 MyOtherLambdaFunction:
  Type: AWS::Lambda::Function
  Properties:
   Code:
    S3Bucket:
     Fn::ImportValue:
      !Sub "${ProcessorCodeBucket}:Bucket2"

模板 1 通过 aws cloudformation validate-template --template-body ... 而模板 2 由于

而失败

模板错误:Fn::ImportValue 中的属性不能依赖于任何资源、导入的值或 Fn::GetAZs。

唯一的区别是模板 2 中的 lambda 函数用于同样在模板 2 中定义的 aws 分析应用程序。

我确定是 S3 存储桶引起了问题,因为当我删除那段代码时,它通过了验证检查。

我一直在使用这个网站来尝试调试这个问题,但似乎没有一个问题能回答这个特定的问题。

这是在同一地区/同一帐户中。

我的问题是: 为什么当模板 1 通过且没有错误时,这段特定的代码(模板 2)会抛出模板错误?

【问题讨论】:

  • ProcessorCodeBucket 在哪里被分配?差异可能在于ProcessorCodeBucket 的填充方式与LoaderCodeBucket 的填充方式
  • 分配方式是什么意思?存储桶是从外部存储库中填充的,该存储库会上传外部存储库中代码的 zip 文件。两个存储桶都是从同一个外部存储库中填充的。

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


【解决方案1】:

这是一个工作示例。

模板 1:

AWSTemplateFormatVersion: "2010-09-09"
Description: "Test"
Resources:
  MyBucketOne:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: bucket-one-12341234
  MyBucketTwo:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: bucket-two-12341234
Outputs:
  MyBucketOneOutput:
    Description: "Bucket Name of BucketOne"
    Value: !Ref MyBucketOne
    Export:
      Name: !Sub "${AWS::StackName}-BucketOne"
  MyBucketTwoOutput:
    Description: "Bucket Name of BucketTwo"
    Value: !Ref MyBucketTwo
    Export:
      Name: !Sub "${AWS::StackName}-BucketTwo"

模板2:我们可以将其导入为!ImportValue my-s3-BucketOne

AWSTemplateFormatVersion: "2010-09-09"
Description: "Test"
Resources:
  MyLambda:
    Type: "AWS::Lambda::Function"
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      FunctionName: "test-s3-import"
      Code:
        S3Bucket: !ImportValue my-s3-BucketOne
        S3Key: "index.zip"
      Description: "Test Lambda"
      MemorySize: 128
      Timeout: 60
      Role: test-role-arn

如果你确实想使用 from 参数,它将是Fn::ImportValue: !Sub ${BucketExportNamePrefix}-BucketOne

AWSTemplateFormatVersion: "2010-09-09"
Description: "Test"
Parameters:
  BucketExportNamePrefix:
    Type: String
    Default: "my-s3"

Resources:
  MyLambda:
    Type: "AWS::Lambda::Function"
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      FunctionName: "test-s3-import"
      Code:
        S3Bucket:
          Fn::ImportValue: !Sub ${BucketExportNamePrefix}-BucketOne
        S3Key: "index.zip"
      Description: "Test Lambda"
      MemorySize: 128
      Timeout: 60
      Role: test-role-arn

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2023-04-11
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多