如何使用 Terraform 循环创建模板
How to create a template using terraform loop
我想通过基于列表变量 (email_addresses) 的循环来使用 terraform template_file 创建 CFT。
以下是我要生成的变量和模板。
variables:-
emails_addresses = ["sample-1@gmail.com", "sample-2@gmail.com"]
sns_arn = "arn:aws:sns:us-east-1:xxxxxx:xxxx"
protocol = "email"
期待模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"sample-1": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Endpoint": "sample-1@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxx:xxxxx"
}
},
"sample-2": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Endpoint": "sample-2@gmil.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxx:xxxx"
}
}
}
}
CFT 中的资源名称可以是一些随机字符串,但如果有多个 plans/apply。
由于 json,这个有点棘手。此外,我会使用 templatefile 而不是 template_file
,因为您可以将列表传递给它。
variable "emails_addresses" {
default = ["sample-1@gmail.com", "sample-2@gmail.com"]
}
variable "sns_arn" {
default = "arn:aws:sns:us-east-1:xxxxxx:xxxx"
}
variable "protocol" {
default = "email"
}
output "test" {
value = templatefile("./email-sns-stack.json.tpl", {
emails_addresses = var.emails_addresses,
sns_arn = var.sns_arn,
protocol = var.protocol
})
}
其中 email-sns-stack.json.tpl
是:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": ${jsonencode(
{for email_address in emails_addresses:
split("@",email_address)[0] => {
Type = "AWS::SNS::Subscription"
Properties = {
"Endpoint" = email_address
"Protocol" = protocol
"TopicArn" = sns_arn
}
}})}
}
为了便于阅读,经过漂亮 json 格式化后的输出:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"sample-1": {
"Properties": {
"Endpoint": "sample-1@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxxxx:xxxx"
},
"Type": "AWS::SNS::Subscription"
},
"sample-2": {
"Properties": {
"Endpoint": "sample-2@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxxxx:xxxx"
},
"Type": "AWS::SNS::Subscription"
}
}
}
我想通过基于列表变量 (email_addresses) 的循环来使用 terraform template_file 创建 CFT。 以下是我要生成的变量和模板。
variables:-
emails_addresses = ["sample-1@gmail.com", "sample-2@gmail.com"]
sns_arn = "arn:aws:sns:us-east-1:xxxxxx:xxxx"
protocol = "email"
期待模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"sample-1": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Endpoint": "sample-1@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxx:xxxxx"
}
},
"sample-2": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Endpoint": "sample-2@gmil.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxx:xxxx"
}
}
}
}
CFT 中的资源名称可以是一些随机字符串,但如果有多个 plans/apply。
由于 json,这个有点棘手。此外,我会使用 templatefile 而不是 template_file
,因为您可以将列表传递给它。
variable "emails_addresses" {
default = ["sample-1@gmail.com", "sample-2@gmail.com"]
}
variable "sns_arn" {
default = "arn:aws:sns:us-east-1:xxxxxx:xxxx"
}
variable "protocol" {
default = "email"
}
output "test" {
value = templatefile("./email-sns-stack.json.tpl", {
emails_addresses = var.emails_addresses,
sns_arn = var.sns_arn,
protocol = var.protocol
})
}
其中 email-sns-stack.json.tpl
是:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": ${jsonencode(
{for email_address in emails_addresses:
split("@",email_address)[0] => {
Type = "AWS::SNS::Subscription"
Properties = {
"Endpoint" = email_address
"Protocol" = protocol
"TopicArn" = sns_arn
}
}})}
}
为了便于阅读,经过漂亮 json 格式化后的输出:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"sample-1": {
"Properties": {
"Endpoint": "sample-1@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxxxx:xxxx"
},
"Type": "AWS::SNS::Subscription"
},
"sample-2": {
"Properties": {
"Endpoint": "sample-2@gmail.com",
"Protocol": "email",
"TopicArn": "arn:aws:sns:us-east-1:xxxxxx:xxxx"
},
"Type": "AWS::SNS::Subscription"
}
}
}