我有一个由 terraform 资源之一返回的策略:
data.aws_iam_policy_document.cluster_assume_role_policy.json
json对象如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::12345678900000:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/879BUOGVDDFGHFGVB85HJNVIFDHPJKPMC"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.eu-west-1.amazonaws.com/id/879BUOGVDDFGHFGVB85HJNVIFDHPJKPMC:aud": "sts.amazonaws.com"
}
}
}
]
}
我需要替换此 json 中的几个子字符串,并能够将其用作另一个 terraform 资源中的引用,例如变量等
- 将 sts.amazonaws.com 替换为 system:serviceaccount:kube-system:cluster-autoscaler
- 将 :aud 替换为 :sub
您能否建议通过 terraform 工具/功能实现此目标的任何/最佳方法?
最佳答案
我同意最好从头开始制定新政策的评论......
但我们仍然可以使用 terraform 提供的功能来做到这一点:
(jsondecode、jsonencode 和替换)
这是一个例子:
provider "aws" {
region = "us-east-1"
}
data "aws_iam_policy_document" "test" {
statement {
sid = ""
actions = ["sts:AssumeRoleWithWebIdentity"]
condition {
test = "StringEquals"
variable = "s3:prefix"
values = ["sts.amazonaws.com"]
}
}
}
output "replace" {
value = jsondecode(
replace(
jsonencode(data.aws_iam_policy_document.test.json),
"sts.amazonaws.com",
"system:serviceaccount"
)
)
}
所以那里有一些功能......
- 使用
jsonencode
我们从策略 json 中获取一个字符串 - 通过
replace
,我们会进行所需的替换,您可以多次调用以进行所需的替换。 - 通过
jsondecode
,我们将字符串转换回 json,以便可以在需要的地方使用
关于amazon-web-services - 如何更新 terraform 创建的策略返回的 json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69858112/