我试图在AWS CloudFormation模板中传递逗号分隔的参数列表,并基于这些值创建多个Amazon S3存储桶。
我有一个要求,我要通过逗号分隔的国家/地区名称列表,然后CloudFormation模板将构建许多S3存储桶(基于传入参数的国家/地区名称)。
例如,如果我在参数中传递fr,us,gb
,则堆栈应创建fr_myprod_bucket
,us_myprod_bucket
,gb_myprod_bucket
。
我知道CloudFormation中没有for循环,所以不确定我如何实现这一目标?
答案 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实际上没有任何好处。只需运行直接执行此操作的程序或脚本即可。