0

我有一个调用 Lambda 函数来发送电子邮件的 Terraform step_function 脚本。我想将电子邮件的正文作为这样的变量发送:

  data "template_file" "start_es_email" {
    template = "${file("email_template/start_es.html")}"
  }

  data "template_file" "start_template" {
    template = "${file("step_function/start_stepfunction.json")}"

    vars = {
      aws_region            = "${var.aws_region}",
      ses_sender            = "${var.ses_sender}"
      ses_destination_email = "${var.ses_destination_emails}"
      ses_body_html         = "${data.template_file.start_es_email.rendered}"
    }
  }

这是 start_es.html 文件的内容,它只是一个简单的 HTML 内容:

<html>
<body>
<h1>ElasticSearch cluster started and ready</h1>
<p>
The ElasticSearch cluster has started and ready to use
</p>
</body>
</html>

这是状态函数资源:

resource "aws_sfn_state_machine" "start_cluster" {
  name     = "start-es-sfn-${var.environment}"
  role_arn = "${aws_iam_role.step_function_iam_role.arn}"

  definition = "${data.template_file.start_template.rendered}"
}

这就是我在状态函数 json 文件中的内容:

"SendSuccessEmail": {
      "Type": "Task",
      "Resource": "${lambda_notification}",
      "Parameters": {
        "SES_SENDER": "${ses_sender}",
        "SES_DESTINATION_EMAIL": "${ses_destination_email}",
        "SUBJECT": "${ses_subject}",
        "BODY_HTML": "${ses_body_html}"
      },
      "End": true
    },

现在当调用 terraform apply 我得到这个错误:

错误:InvalidDefinition:无效状态机定义:'INVALID_JSON_DESCRIPTION:非法未引用字符((CTRL-CHAR,代码 10)):必须使用反斜杠转义才能包含在字符串值中

我试图在一行中制作 html 内容:

<html><body><h1>ElasticSearch cluster started and ready</h1><p>The ElasticSearch cluster has started and ready to use</p></body></html>

它工作正常,但这样读取和维护文件并不是很好。

有办法解决吗?

谢谢你。

4

2 回答 2

0

如果您使用的是 Terraform v0.12 或能够升级到它,您可以使用以下功能避免此问题jsonencode

resource "aws_sfn_state_machine" "start_cluster" {
  name     = "start-es-sfn-${var.environment}"
  role_arn = aws_iam_role.step_function_iam_role.arn

  definition = jsonencode({
    "SendSuccessEmail": {
      "Type": "Task",
      "Resource": lambda_notification,
      "Parameters": {
        "SES_SENDER": var.ses_sender,
        "SES_DESTINATION_EMAIL": var.ses_destination_emails,
        "SUBJECT": var.ses_subject,
        "BODY_HTML": data.template_file.start_es_email.rendered,
      },
      "End": true,
    },
  })
}

通过使用jsonencode,您可以让 Terraform 担心 JSON 编码。它将看到该data.template_file.start_es_email.rendered值中有换行符,并将自动将它们转义为\n. 除非有特定原因需要精确控制数据的格式,否则我建议始终jsonencode在 Terraform 中使用生成 JSON,而不是使用字符串模板。

尽管 Terraform 0.11确实有一个jsonencode函数,但它是一个更加简单的实现,不会针对这种特殊情况产生正确的结果。

于 2019-08-21T15:02:50.987 回答
0

根据您提供的信息,渲染的模板似乎具有需要转义的非法字符。控制字符10是换行符。所以每个新行都需要用反斜杠转义。您是否在 notepad++ 或类似的 Windows 应用程序中创建了该 html 文件?我会尝试在 VSCode 或 Linux 编辑器(如 vim 或 nano)中创建它。

作为替代方案,您可以尝试在每行文本的末尾使用不带刻度的 '\\n' 或 '\n' 来转义换行符。我以前没有遇到过这种情况,所以我不确定让 Terraform 合作的正确方法。JSON 的 Terraform 编组有时可能很困难。

我可以告诉你的是为什么你会得到一个 CC10,当你把所有信息放在一行上时它就可以工作。

于 2019-08-21T13:40:36.133 回答