Как я могу обновить json, возвращенный политикой создания terraform?

#amazon-web-services #terraform

Вопрос:

У меня есть политика, возвращенная одним из ресурсов 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, например, в переменной и т. Д

  1. заменить sts.amazonaws.com с системой:учетная запись службы:куб-система:кластер-автоскейлер
  2. заменить :aud на :sub

не могли бы вы предложить какой-либо/оптимальный способ достижения этой цели с помощью инструментов/функций terraform?

Комментарии:

1. Почему вы не можете создать новую политику?

2. Как уже отмечалось. Лучший способ-просто создать новую политику с нуля.

3. 1. у нас есть 5 кластеров, мы хотим повторно использовать существующие политики на лету 2. существует также общий интерес-каков подход к обновлению данных json в Terraform

Ответ №1:

Я бы согласился с замечаниями, что это лучше всего делать с новой политикой с нуля …
Но мы все еще можем сделать это, используя функции, предоставляемые 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, чтобы ее можно было использовать там, где это необходимо