Puncte:0

Terraform: Cum se generează dinamic un bloc al unei politici JSON?

drapel cn

Am urmatoarea resursa:

resursa „aws_iam_user_policy” „ses_send_policy” {
  count = var.enabled ? 1: 0
  name_prefix = var.user_policy_name_prefix
  user = aws_iam_user.ses_smtp_user[0].name

  politica = <<EOF
{
    „Versiune”: „2012-10-17”,
    "Afirmație": [
        {
            „Efect”: „Permite”,
            "Acțiune": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            „Resurse”: „*”,
            "Condiție": {
                „StringEquals”: ​​{
                    "ses:FromAddress": [
                        „${var.user_email_address}”
                    ]
                }
            }
        }
    ]
}
EOF
}

Aș dori să întreb cum să fac blocul „Condiție” din politică opțional și bazat pe o variabilă de tip bool? Vreau să-l am doar dacă var.condition = adevarat.

Puncte:0
drapel ph

În documentatia pentru aws_iam_user_policy la momentul acestui răspuns, exemplul principal de utilizare arată setarea politică ca aceasta:

  # Funcția „jsonencode” a Terraform convertește a
  # Rezultatul expresiei Terraform la sintaxa JSON validă.
  politica = jsonencode({
    Versiune = "2012-10-17"
    Declarație = [
      {
        Acțiune = [
          "ec2:Descrie*",
        ]
        Efect = „Permite”
        Resursa = "*"
      },
    ]
  })

Observați că recomandă utilizarea cel jsonencode funcţie pentru a produce întreaga valoare, în loc să încercați să construiți JSON din părți prin concatenarea șablonului, deoarece aceasta asigură că rezultatul va fi întotdeauna sintaxa JSON validă.

Aceasta de asemenea are avantajul că poți folosi orice expresii trebuie să luați decizii dinamice cu privire la structura datelor.În cazul dvs. aveți deja o referință dinamică la adresa de e-mail a utilizatorului dintr-o variabilă, așa că să începem prin a traduce ceea ce aveți într-un formular mai asemănător cu exemplul din documentație:

  politica = jsonencode({
    Versiune = 2012-10-17"
    Declarație = [
      {
        Efect = „Permite”
        Acțiune = [
          "ses:SendEmail",
          "ses:SendRawEmail",
        ]
        Resursa = "*"
        Condiție = {
          StringEquals = {
            "ses:FromAddress" = [
              var.user_email_address,
            ]
          }
        }
      }
    ]
  })

Observați că valoarea este acum scrisă în sintaxa expresiei Terraform, mai degrabă decât în ​​sintaxa JSON. Terraform va construi în sine sintaxa JSON validă ca parte a evaluării jsonencode apel de funcție.

Noua dvs. cerință este să omiteți Condiție în întregime în anumite cazuri. Pentru a descrie această cerință ca o expresie Terraform necesită îmbinarea obiectului care descrie părțile care sunt întotdeauna prezente (Efect, Acțiune, și Resursă) cu o altă expresie care descrie părțile opționale.

De exemplu:

  politica = jsonencode({
    Versiune = 2012-10-17"
    Declarație = [
      combina(
        {
          Efect = „Permite”
          Acțiune = [
            "ses:SendEmail",
            "ses:SendRawEmail",
          ]
          Resursa = "*"
        },
        coalesce(var.condition ? {
          Condiție = {
            StringEquals = {
              "ses:FromAddress" = [
                var.user_email_address,
              ]
            }
          }
        } : nul, {}),
      )
    ]
  })

Ceea ce am schimbat aici este puțin subtil și poate greu de văzut cu tot restul conținutului care nu s-a schimbat, așa că iată o versiune redusă cu unele dintre elementele anterioare înlocuite cu comentarii doar pentru a face noul conținut mai proeminent :

  politica = jsonencode({
    Versiune = 2012-10-17"
    Declarație = [
      combina(
        {
          # (atribute comune aici)
        },
        coalesce(var.condition ? {
          # (atribute condiționate aici)
        } : nul, {}),
      )
    ]
  })

The combina funcţie preia mai multe obiecte și returnează un singur obiect care conține elementele din toate luate împreună. În acest caz, al doilea argument la combina este o expresie mai complexă care produce fie un obiect cu a Condiție atribut sau un obiect gol în funcție de valoarea condiției. Fuzionarea unui obiect gol într-un obiect nu schimbă nimic în ceea ce privește rezultatul, și astfel, în acest caz, condiția controlează dacă al doilea argument va contribui cu vreun atribut.

Jacek avatar
drapel cn
Excelenta explicatie, multumesc.
Jacek avatar
drapel cn
O întrebare, codul funcționează, dar politica este în ordine inversă, de ce?
drapel ph
Nu sunt sigur ce vrei să spui prin „ordine inversă”, dar poate ai observat că `jsonencode` va sorta întotdeauna atributele obiectului după numele lor, deoarece un obiect din este o colecție _neordonată_ de atribute și, prin urmare, `jsonencode` are să decidă o ordine în sine.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.