【问题标题】:JSON Syntax error in Terraform aws_iam_role_policyTerraform aws_iam_role_policy 中的 JSON 语法错误
【发布时间】:2020-03-27 15:05:23
【问题描述】:

因此,使用 Terraform,我正在创建一个 IAM 策略并将其附加到一个角色。我目前正在跑步:

Terraform v0.12.16
provider.aws v2.40.0
provider.template v2.1.2

执行代码时,我可以毫无问题地初始化 terraform。运行 terraform plan 时,出现以下错误:

Error: "policy" contains an invalid JSON: invalid character '}' looking for beginning of value

  on ec2-iam.tf line 8, in resource "aws_iam_role_policy" "s3_ec2_policy":
   8: resource "aws_iam_role_policy" "s3_ec2_policy" {

我遇到了这个错误。任何意见将是有益的。以下是我的代码:

 data "template_file" "s3_web_policy" {
  template = file("scripts/iam/web-ec2-policy.json")
  vars = {
    s3_bucket_arn = "arn:aws:s3:::${var.my_app_s3_bucket}/*"
  }
}

resource "aws_iam_role_policy" "s3_ec2_policy" {
  name = "s3_ec2_policy"
  role = aws_iam_role.s3_ec2_role.id

  policy = data.template_file.s3_web_policy.rendered
}

resource "aws_iam_role" "s3_ec2_role" {
  name = "s3_ec2_role"

  assume_role_policy = file("scripts/iam/web-ec2-assume-role.json")
}

【问题讨论】:

  • 模板文件是什么样的?可能有一个额外的空间或大括号/括号未打开。

标签: amazon-web-services terraform terraform-provider-aws terraform-template-file


【解决方案1】:

从字符串模板生成 JSON 时经常会遇到语法错误,因为模板语言不知道 JSON 语法,所以你作为模板作者必须注意确保括号都正确嵌套,没有遗漏或额外的逗号等。

您通常可以通过使用Terraform's jsonencode function 生成 JSON 来避免此类问题:

resource "aws_iam_role_policy" "s3_ec2_policy" {
  name = "s3_ec2_policy"
  role = aws_iam_role.s3_ec2_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      # etc, etc
    ]
  })
}

如果策略定义似乎太大而无法将内联包含在您的 resource 块中,您仍然可以根据需要将其分解到单独的模板文件中:

resource "aws_iam_role_policy" "s3_ec2_policy" {
  name = "s3_ec2_policy"
  role = aws_iam_role.s3_ec2_role.id

  policy = templatefile("${path.module}/scripts/iam/web-ec2-policy.json.tmpl", {
    s3_bucket_arn = "arn:aws:s3:::${var.my_app_s3_bucket}/*"
  })
}

...但是在模板内部,而不是使用单独的模板插值,只需将整个模板编写为对 jsonencode 的单个调用,如下所示:

${jsonencode({
  Version = "2012-10-17"
  Statement = [
    {
      # ...
      Resource = s3_bucket_arn
      # ...
    },
    # etc, etc
  ]
})}

请注意,template_file 数据源适用于 Terraform 0.11 及更早版本,而在 Terraform 0.12 中只是为了向后兼容。您应该改用 the templatefile function,它的用途相同,但直接集成到 Terraform 语言中。

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 2022-10-15
    • 1970-01-01
    • 2018-02-12
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多