如何在"Resource"部分中转义包含 ${aws:username} 的 HCL 字符串?



如何在"资源"部分中转义包含${aws:username}的HCL字符串?

我目前使用 Terraform 版本 0.9.9 通过以下方式在 main.tf 文件中创建 AWS 策略:

resource "aws_iam_group_policy" "AllowIndividualUserToSeeTheirAccountInformation" {
name  = "AllowIndividualUserToSeeTheirAccountInformation"
group = "${aws_iam_group.pr_faas_developers.id}"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile"
],
"Effect": "Allow",
"Resource":
[
"arn:aws:iam::XXXXXXXXX:user/${aws:username}"
]
}
]
}
EOF
}

这样做时,Terraform 尝试插值${aws:username}并且 terraform 将失败,如下所示

terraform.exe plan
Failed to load root config module: Error loading D:amazonaws-root-mastermain.t
f: Error reading config for aws_iam_group_policy[AllowIndividualUserToSeeTheirAc
countInformation]: parse error at 17:51: expected "}" but found ":"

当我转义资源字符串时,如下所示:

"Resource":
[
"arn:aws:iam::XXXXXXXXX:user/\$\{aws\:username\}"
]

"terraform plan""terraform apply"将正常工作,但AWS显示策略中的结果是:

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile"
],
"Effect": "Allow",
"Resource":
[
"arn:aws:iam::XXXXXXXXX:user/\$\{aws:username\}"
]
}
]
}

这与预期结果不同:

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:ChangePassword",
"iam:CreateLoginProfile",
"iam:DeleteLoginProfile",
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:GetLoginProfile",
"iam:UpdateLoginProfile"
],
"Effect": "Allow",
"Resource":
[
"arn:aws:iam::XXXXXXXXX:user/${aws:username}"
]
}
]
}

是否有任何解决方案可以在地形 main.tf 文件中转义"arn:aws:iam::XXXXXXXXX:user/${aws:username}"以获得所需的结果?

你可以用双美元$$来修复它

指:

地形插值

您可以使用双美元符号来转义插值:$${foo} 将呈现为文字 ${foo}。

https://github.com/hashicorp/terraform/issues/2965

最近遇到类似的字符串文字问题,请将响应复制到此处以帮助更多人。

请注意,这仍然适用于 Terraform 0.12。

"在引用和 heredoc 字符串表达式中,Terraform 都支持以${%{开头的模板序列。">

"要从字面上包含这些序列而不开始模板序列,请将主角加倍:$${%%{。">

请查看文档以获取更多详细信息。

https://registry.terraform.io/providers/hashicorp/aws/2.69.0/docs/data-sources/iam_policy_document#context-variable-interpolation

IAM 策略文档格式允许将上下文变量内插为语句中的各种字符串。本机 IAM 策略文档格式使用 ${...}-样式语法,与 Terraform 的插值语法冲突,因此此数据源改为使用 &{...} 语法进行插值,这些语法应由 AWS 而不是 Terraform 处理。

所以你可以做

resources = [
"arn:aws:s3:::${var.s3_bucket_name}/home/&{aws:username}",
"arn:aws:s3:::${var.s3_bucket_name}/home/&{aws:username}/*",
]

有 2 种解决方案:

  1. 在 shell 脚本中使用前面的额外$对该变量进行转义。例如,PROJECT=$${project}
  2. 将该变量添加为project = "$project"在 terraform 脚本中的文件变量列表下,它将${project}替换为$project,并且脚本仍然有效。

最新更新