繁体   English   中英

在 Cloudformation 模板中导入 s3 存储桶

[英]Importing s3 Bucket in Cloudformation template

在 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 function 用于同样在模板 2 中定义的 aws 分析应用程序。

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

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

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

我的问题是:为什么当模板 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 Parameter,它将是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM