ใน เอกสารสำหรับ aws_iam_user_policy
ในช่วงเวลาของคำตอบนี้ ตัวอย่างการใช้งานหลักจะแสดงการตั้งค่า นโยบาย
แบบนี้:
# ฟังก์ชัน "jsonencode" ของ Terraform แปลงไฟล์
# ผลลัพธ์ของนิพจน์ Terraform เป็นไวยากรณ์ JSON ที่ถูกต้อง
นโยบาย = jsonencode ({
รุ่น = "2012-10-17"
คำชี้แจง = [
{
การกระทำ = [
"ec2:อธิบาย*",
]
ผล = "อนุญาต"
แหล่งข้อมูล = "*"
},
]
})
สังเกตว่าแนะนำให้ใช้ เดอะ jsonencode
การทำงาน เพื่อสร้างค่าทั้งหมด แทนที่จะพยายามสร้าง JSON จากส่วนต่าง ๆ ผ่านการต่อแม่แบบ เนื่องจากจะทำให้มั่นใจได้ว่าผลลัพธ์จะเป็นไวยากรณ์ JSON ที่ถูกต้องเสมอ
มัน อีกด้วย มีคุณประโยชน์ที่จะนำไปใช้ใดๆ การแสดงออก คุณต้องทำการตัดสินใจแบบไดนามิกเกี่ยวกับโครงสร้างข้อมูลในกรณีของคุณ คุณมีการอ้างอิงแบบไดนามิกไปยังที่อยู่อีเมลของผู้ใช้จากตัวแปร ดังนั้นเรามาเริ่มด้วยการแปลสิ่งที่คุณมีอยู่ให้อยู่ในฟอร์มมากขึ้น ดังตัวอย่างในเอกสารประกอบ:
นโยบาย = jsonencode ({
เวอร์ชัน = 2012-10-17"
คำชี้แจง = [
{
ผล = "อนุญาต"
การกระทำ = [
"เซส:ส่งอีเมล",
"เซส:SendRawEmail",
]
แหล่งข้อมูล = "*"
เงื่อนไข = {
StringEquals = {
"ses:FromAddress" = [
var.user_email_address
]
}
}
}
]
})
ขอให้สังเกตว่าตอนนี้ค่าถูกเขียนในรูปแบบไวยากรณ์นิพจน์ของ Terraform แทนที่จะเป็นไวยากรณ์ JSON Terraform จะสร้างไวยากรณ์ JSON ที่ถูกต้องเองโดยเป็นส่วนหนึ่งของการประเมิน jsonencode
การเรียกใช้ฟังก์ชัน
ข้อกำหนดใหม่ของคุณคือการละเว้น เงื่อนไข
โดยสิ้นเชิงในบางกรณี เพื่ออธิบายข้อกำหนดดังกล่าวเป็นนิพจน์ Terraform จำเป็นต้องรวมวัตถุซึ่งอธิบายส่วนที่มีอยู่เสมอ (ผล
, หนังบู๊
, และ ทรัพยากร
) ด้วยนิพจน์อื่นที่อธิบายส่วนที่เป็นทางเลือก
ตัวอย่างเช่น:
นโยบาย = jsonencode ({
เวอร์ชัน = 2012-10-17"
คำชี้แจง = [
ผสาน(
{
ผล = "อนุญาต"
การกระทำ = [
"เซส:ส่งอีเมล",
"เซส:SendRawEmail",
]
แหล่งข้อมูล = "*"
},
รวมกัน (var.condition ? {
เงื่อนไข = {
StringEquals = {
"ses:FromAddress" = [
var.user_email_address
]
}
}
} : โมฆะ, {}),
)
]
})
สิ่งที่ฉันเปลี่ยนแปลงที่นี่ค่อนข้างละเอียดอ่อนและอาจมองเห็นได้ยากในเนื้อหาอื่นๆ ที่ไม่ได้เปลี่ยนแปลง ดังนั้นนี่คือเวอร์ชันที่ลดลงโดยองค์ประกอบก่อนหน้าบางส่วนถูกแทนที่ด้วยความคิดเห็นเพื่อทำให้เนื้อหาใหม่โดดเด่นยิ่งขึ้น :
นโยบาย = jsonencode ({
เวอร์ชัน = 2012-10-17"
คำชี้แจง = [
ผสาน(
{
# (แอตทริบิวต์ทั่วไปที่นี่)
},
รวมกัน (var.condition ? {
# (แอตทริบิวต์เงื่อนไขที่นี่)
} : โมฆะ, {}),
)
]
})
เดอะ ผสาน
การทำงาน รับหลายวัตถุและส่งกลับวัตถุเดียวที่มีองค์ประกอบจากทั้งหมดที่นำมารวมกัน ในกรณีนี้ ข้อโต้แย้งที่สองคือ ผสาน
เป็นนิพจน์ที่ซับซ้อนกว่าซึ่งสร้างวัตถุที่มี a เงื่อนไข
แอตทริบิวต์หรือวัตถุว่างขึ้นอยู่กับค่าเงื่อนไข การรวมวัตถุว่างเข้ากับวัตถุจะไม่เปลี่ยนแปลงอะไรเกี่ยวกับผลลัพธ์ ดังนั้นในกรณีนี้ เงื่อนไขจะควบคุมว่าอาร์กิวเมนต์ที่สองจะสนับสนุนแอตทริบิวต์ใดๆ เลยหรือไม่