如何在"资源"部分中转义包含${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 种解决方案:
- 在 shell 脚本中使用前面的额外
$
对该变量进行转义。例如,PROJECT=$${project}
- 将该变量添加为
project = "$project"
在 terraform 脚本中的文件变量列表下,它将${project}
替换为$project
,并且脚本仍然有效。