Terraform AWS IAM Role " inline_policy.0.使用${file xyz}和



请见下文。首先,只有假设角色策略,它才有效。如果我删除内联策略,它将全部验证。当它被放在里面时,(看起来是这样的。)它不成立。我正在使用Terragrunt,但我相信这是一个terrraform错误。

resource "aws_iam_role" "test_role" {
name   = "my_test_role"
assume_role_policy = jsonencode("${file("..//Policies//policy_assume_role.json")}")
inline_policy {
name = "inline_s3_policy"
policy = jsonencode("${file("..//Policies//policy_s3_bucket.json")}")
}
}

然后是policy_s3_bucket。Json是这样的

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::company-terragrunt-terraform-state-123456789-us-east-1"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::company-terragrunt-terraform-state-123456789-us-east-1/*"]
}
]
}

我得到- " " inline_policy.0。"包含一个无效的JSON策略"…但是JSON是有效的。我配置的用户可以访问这些桶。此外,假设角色策略在没有s3内联的情况下也可以工作。假设角色策略json看起来是相同的格式,我以相同的方式拉它。

在您的配置中,您似乎将file函数的结果传递给jsonencode函数。

file函数的结果总是一个字符串,表示文件的utf -8编码的内容,所以如果你的文件包含已经编码的JSON,那么它将返回一个包含JSON的字符串。

如果你传递一个字符串给jsonencode,那么它将产生一个JSON格式的字符串,而IAM策略需要一个JSON对象,因此API将返回一个错误,如图所示。

更具体地说,您当前的配置将把policy设置为如下内容(为了简洁而截断):

"{n  "Version": "2012-10-17"mn  "Statement": ..."

如果你知道你的外部文件已经包含有效的JSON,那么你可以将file的结果直接分配给policy参数,像这样:

resource "aws_iam_role" "test_role" {
name               = "my_test_role"
assume_role_policy = file("${path.module}/../Policies/policy_assume_role.json")
inline_policy {
name   = "inline_s3_policy"
policy = file("${path.module}/../Policies/policy_s3_bucket.json")
}
}

如果你想让Terraform解析JSON并重新编码——这意味着Terraform将首先检查JSON内容是否在本地有效,并始终以一致的缩小形式生成它,你可以选择先将file结果传递给jsondecode,然后将该结果传递给jsonencode,从而"往返";通过Terraform语言类型系统,再次返回JSON:

resource "aws_iam_role" "test_role" {
name               = "my_test_role"
assume_role_policy = jsonencode(jsondecode(file("${path.module}/../Policies/policy_assume_role.json")))
inline_policy {
name   = "inline_s3_policy"
policy = jsonencode(jsondecode(file("${path.module}/../Policies/policy_s3_bucket.json")))
}
}

然而,这将是一个相当不寻常的方法,所以如果你采用它,那么我建议包括一个注释来解释为什么你这样做,以便将来的读者可以理解为什么包含这个看似冗余的转换。

最新更新