微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Cloudformation 模板中导入 s3 Bucket

如何解决在 Cloudformation 模板中导入 s3 Bucket

在 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 Bucket 导致了问题,因为当我删除那部分代码时,它通过了验证检查。

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

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

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

解决方法

这是一个工作示例。

模板 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。