Terraform aws_iam_role_policy 中的 JSON 语法错误

Posted

技术标签:

【中文标题】Terraform aws_iam_role_policy 中的 JSON 语法错误【英文标题】:JSON Syntax error in Terraform aws_iam_role_policy 【发布时间】: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")

【问题讨论】:

模板文件是什么样的?可能有一个额外的空间或大括号/括号未打开。 【参考方案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 语言中。

【讨论】:

以上是关于Terraform aws_iam_role_policy 中的 JSON 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习总结——Terraform 命令详解

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

terraform如何创建数据盘

Terraform 学习总结—— Terraform 常用命令再总结