Î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.