如何遍历CloudFormation模板中的值

时间:2019-07-25 05:53:16

标签: amazon-web-services amazon-s3 amazon-cloudformation

我试图在AWS CloudFormation模板中传递逗号分隔的参数列表,并基于这些值创建多个Amazon S3存储桶。

我有一个要求,我要通过逗号分隔的国家/地区名称列表,然后CloudFormation模板将构建许多S3存储桶(基于传入参数的国家/地区名称)。

例如,如果我在参数中传递fr,us,gb,则堆栈应创建fr_myprod_bucketus_myprod_bucketgb_myprod_bucket

我知道CloudFormation中没有for循环,所以不确定我如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

使用Count macro

Count宏为CloudFormation资源提供了模板范围的Count属性。它使您可以指定多个相同类型的资源,而无需剪切和粘贴。

因此,以下内容:

AWSTemplateFormatVersion: "2010-09-09"
Transform: Count
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      Tags:
        - Key: TestKey
          Value: my bucket %d
    Count: 3

相当于:

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  Bucket1:
    Type: AWS::S3::Bucket
    Properties:
      Tags:
        - Key: TestKey
          Value: my bucket 1
  Bucket2:
    Type: AWS::S3::Bucket
    Properties:
      Tags:
        - Key: TestKey
          Value: my bucket 2
  Bucket3:
    Type: AWS::S3::Bucket
    Properties:
      Tags:
        - Key: TestKey
          Value: my bucket 3

答案 1 :(得分:2)

https://palletsprojects.com/p/jinja/是用于将for循环添加到CloudFormation模板的另一个选项。您需要先将Jinja模板呈现给它,然后再传递给CloudFormation,因为CloudFormation本身当前无法处理Jinja模板。

  {% for country in ["fr", "us", "gb"] %}
  {{country}}_myprod_bucket:
    Type: AWS::S3::Bucket
  {% endfor %}

Jinja代码段将产生的渲染结果:

  fr_myprod_bucket:
    Type: AWS::S3::Bucket

  us_myprod_bucket:
    Type: AWS::S3::Bucket

  gb_myprod_bucket:
    Type: AWS::S3::Bucket

答案 2 :(得分:1)

您是正确的-AWS CloudFormation中没有 loop 的概念。

AWS CloudFormation是declarative language。它描述了所需的输出,但没有说明应如何实现结果。

要执行您所描述的逻辑,您将需要创建一个AWS Lambda-backed Custom Resource。 CloudFormation将调用提供的Lambda函数,然后可以进行任何所需的API调用。

模板仅用于创建这些存储桶,因此使用CloudFormation实际上没有任何好处。只需运行直接执行此操作的程序或脚本即可。