【问题标题】:How do I pass a list of strings as a parameter in CloudFormation?如何在 CloudFormation 中将字符串列表作为参数传递?
【发布时间】:2019-02-05 07:33:18
【问题描述】:

我有一个嵌套的 CloudFormation 模板,它接受来自其根模板的许多参数来配置它。目前我只传递简单的字符串参数,但现在我需要将 S3 存储桶 ARN 列表传递到子模板。

ChildLambdaStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      AwsRegion: !Ref AwsRegion
      Environment: !Ref Environment
      Product: !Ref Product
      S3Buckets: "arn:aws:s3:::bucket1,arn:aws:s3:::bucket2"
    TemplateURL: "https://s3.amazonaws.com/child-template.yml"

然后在子模板中我有这个

AWSTemplateFormatVersion: "2010-09-09"
Description: "Child Lambda"

Parameters:
  AwsRegion:
    Type: String
  Environment:
    Type: String
  Product:
    Type: String
  S3Buckets:
    Type: String

Resources:
  DeployerPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - s3:PutObject
              - s3:GetObject
              - s3:DeleteObject
              - s3:CreateBucket
              - s3:DeleteBucket
              - s3:ListBucket
              - s3:PutBucketNotification
            Resource:
              - Fn::Split:
                - ","
                - !Ref S3Buckets

我的想法是,我输入的 S3 存储桶 ARN 列表会像这样在子模板中展开

Resource:
  - arn:aws:s3:::bucket1
  - arn:aws:s3:::bucket2

但是当我运行模板时,它只是出错了

Syntax errors in policy. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument)

我尝试了其他变体,例如使用 CommaDelimitedList 参数类型,但没有一个可行。有没有一种简单的方法可以将字符串列表作为参数传递?

【问题讨论】:

    标签: amazon-web-services cloud yaml amazon-cloudformation


    【解决方案1】:

    正如@MaiKaY 指出的那样,@Liam Mayfair 代码中的缺陷是Fn::Split 前面有-,这导致列表包含单个元素,即列表。固定代码看起来像

    ...
                Resource:
                  Fn::Split:
                    - ","
                    - !Ref S3Buckets
    

    一般来说,您必须确保在使用Fn::Split 时使用String 而不是CommaDelimitedList 的参数类型,因为它不会拆分CommaDelimitedList

    • 如果您将CommaDelimitedListFn::Split 一起使用,您将收到错误Template error: every Fn::Split object requires two parameters, (1) a string delimiter and (2) a string to be split or a function that returns a string to be split
    • 如果您使用 CommaDelimitedList 而不使用 Fn::Split,您将收到错误 Syntax errors in policy

    【讨论】:

      【解决方案2】:

      因为!Split的返回值是A list of string values.,所以我会这样做:

      [...]
          Resource: !Split [",", !Ref S3Buckets]
      [...]
      

      【讨论】:

      • 这与 OP 所做的有什么不同吗?它是内联的,但除此之外它使用相同的参数调用相同的函数,对吧?
      • 不一样。 OP 在Fn::Split 前面添加了一个额外的-,这意味着它传递了一个带有字符串的列表值的列表。
      猜你喜欢
      • 2020-12-12
      • 2021-09-10
      • 2021-05-09
      • 2015-06-02
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      相关资源
      最近更新 更多