微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板正文包含无效的 JSON:无效字符

如何解决模板正文包含无效的 JSON:无效字符

我有一个创建 SNS 主题订阅的 CloudFormation 模板

{
    "AWstemplateFormatVersion": "2010-09-09","Resources" : {
      "EmailSNSTopic": {
        "Type" : "AWS::SNS::Topic","Properties" : {
          "displayName" : "${display_name}"
        }
      },"MySubscription": {
        "Type": "AWS::SNS::Subscription","Properties": {
          "TopicArn" : { "Ref" : "EmailSNSTopic" },"${details}"
        }
      }
    },"Outputs" : {
        "ARN" : {
          "Description" : "Email SNS Topic ARN","Value" : { "Ref" : "EmailSNSTopic" }
        }
      }
}

我正在尝试通过 terrform 调用

但是我一直收到这个错误 Error: "template_body" contains an invalid JSON: invalid character '{' looking for beginning of object key string

我的 terraform 配置如下所示。

provider "aws" {
  region = "eu-west-2"
}

data "template_file" "sns_stack" {
  template = file("${path.module}/templates/email-sns-stack.json.tpl")
  vars = {
    display_name  = var.display_name
    details = join(",",formatlist("{ \"Endpoint\": \"%s\",\"Protocol\": \"%s\"  }",var.email_list,var.protocol))
  }
}

resource "aws_cloudformation_stack" "sns_topic" {
  name          = var.stack_name
  template_body = data.template_file.sns_stack.rendered
  tags = merge(
    map("Name",var.stack_name)
  )
}

我的variables.tf看起来像这样

  default     = "Admin"
}
variable "email_list" {
  default = [
    "foo@foo.com","bar@bar.com"
  ]
}

variable "protocol" {
  default     = "email"
}
variable "stack_name" {
  default     = "sns-test"
}

我希望 ${details} 应该吐出我的端点和协议,但它没有。

我做错了什么?

解决方法

您想要实现的目标相当复杂,但可行。您可以使用以下模板执行此操作:

{
    "AWSTemplateFormatVersion": "2010-09-09","Resources" :  ${jsonencode(
        merge({for idx,email_address in email_list: 
        "EmailSubs${idx}" => {
          Type = "AWS::SNS::Subscription"
          Properties = {
                "Endpoint" = email_address
                "Protocol" = protocol
                "TopicArn" = { "Ref" = "EmailSNSTopic" }      
          }      
      }},{
        "EmailSNSTopic" = {
        "Type" = "AWS::SNS::Topic","Properties" = {
          "DisplayName" = "${display_name}"
        }
      }}
      
      ))},"Outputs" : {
        "ARN" : {
          "Description" : "Email SNS Topic ARN","Value" : { "Ref" : "EmailSNSTopic" }
        }
      }      
        
}

和TF代码:

locals {

  template_body = templatefile("./email-sns-stack2.json.tpl",{
    display_name  = var.display_name
    email_list = var.email_list
    protocol = var.protocol
   })

}

resource "aws_cloudformation_stack" "sns_topic" {
  name          = var.stack_name
  template_body = local.template_body
  tags = merge(
    map("Name",var.stack_name)
  )
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。