如何遍历 CloudFormation 模板中的值
Posted
技术标签:
【中文标题】如何遍历 CloudFormation 模板中的值【英文标题】:How to loop through values in a CloudFormation template 【发布时间】:2019-12-03 07:55:09 【问题描述】:我正在尝试在 AWS CloudFormation 模板中传递逗号分隔的参数列表,并根据这些值创建多个 Amazon S3 存储桶。
我有一个要求,我将传递一个逗号分隔的国家/地区名称列表,然后 CloudFormation 模板将构建那么多 S3 存储桶(基于传入参数的国家/地区名称)。
例如,如果我在参数中传递fr,us,gb
,堆栈应创建fr_myprod_bucket
、us_myprod_bucket
、gb_myprod_bucket
。
我知道 CloudFormation 中没有 for 循环,所以不确定如何实现这一点?
【问题讨论】:
您要在不同区域创建这些存储桶吗? 同一地区没有 【参考方案1】:你是对的——AWS CloudFormation 中没有 循环 的概念。
AWS CloudFormation 是 declarative language。它描述了期望的输出,但没有说明如何实现结果。
要执行您描述的逻辑,您需要创建一个AWS Lambda-backed Custom Resource。 CloudFormation 将调用提供的 Lambda 函数,然后该函数可以进行任何所需的 API 调用。
模板仅创建这些存储桶,那么使用 CloudFormation 实际上没有任何好处。只需运行直接执行此操作的程序或脚本即可。
【讨论】:
【参考方案2】:https://palletsprojects.com/p/jinja/ 是向 CloudFormation 模板添加 for 循环的另一个选项。您需要在将 Jinja 模板传递给 CloudFormation 之前对其进行渲染,因为 CloudFormation 本身目前无法处理 Jinja 模板。
% for country in ["fr", "us", "gb"] %
country_myprod_bucket:
Type: AWS::S3::Bucket
% endfor %
Jinja sn-p 将产生的渲染:
fr_myprod_bucket:
Type: AWS::S3::Bucket
us_myprod_bucket:
Type: AWS::S3::Bucket
gb_myprod_bucket:
Type: AWS::S3::Bucket
【讨论】:
【参考方案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
【讨论】:
这需要在您的 AWS 账户中安装 Count 宏。参考:github.com/awslabs/aws-cloudformation-templates/tree/master/aws/…【参考方案4】:另一种方法是使用 CDK,它将 CloudFormation 包装在 Typescript、Python、Java、.NET 或 Golang 中。
【讨论】:
CDK 只让你在编译时进行流控制,而不是在运行时。 @Tom 是的,我应该澄清一下,为了使用 CDK,您必须使用高于 CloudFormation 的级别的 CDK。 “编译”(合成器)可以在你喜欢的时候发生。您可以将 (docs.aws.amazon.com/cdk/v2/guide/use_cfn_template.html) CloudFormation 带入您的 CDK。以上是关于如何遍历 CloudFormation 模板中的值的主要内容,如果未能解决你的问题,请参考以下文章
将多个参数从外部文件传递到 cloudformation 模板并使用带有 ref 的值
如何调试cloudformation模板?策略中的语法错误。 YAML 文件
如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件
如何在我的新 CloudFormation 模板中引用现有角色?