如何解决模板正文包含无效的 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 举报,一经查实,本站将立刻删除。