如何使用 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"
    }
  }
}