Score:0

Terraform: จะสร้างบล็อกของนโยบาย JSON แบบไดนามิกได้อย่างไร

ธง cn

ฉันมีแหล่งข้อมูลต่อไปนี้:

ทรัพยากร "aws_iam_user_policy" "ses_send_policy" {
  นับ = var.enabled ? 1 : 0
  name_prefix = var.user_policy_name_prefix
  ผู้ใช้ = aws_iam_user.ses_smtp_user[0].name

  นโยบาย = <<EOF
{
    "เวอร์ชัน": "2012-10-17",
    "คำแถลง": [
        {
            "เอฟเฟกต์": "อนุญาต",
            "หนังบู๊": [
                "เซส:ส่งอีเมล",
                "เซส:SendRawEmail"
            ]
            "ทรัพยากร": "*",
            "เงื่อนไข": {
                "StringEquals": {
                    "ses:FromAddress": [
                        "${var.user_email_address}"
                    ]
                }
            }
        }
    ]
}
อฟ
}

ฉันต้องการถามวิธีทำให้บล็อก "เงื่อนไข" ในนโยบายเป็นตัวเลือกและขึ้นอยู่กับตัวแปรประเภทบูล ฉันอยากจะมีมันก็ต่อเมื่อ var.condition = จริง.

Score:0
ธง ph

ใน เอกสารสำหรับ 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 เงื่อนไข แอตทริบิวต์หรือวัตถุว่างขึ้นอยู่กับค่าเงื่อนไข การรวมวัตถุว่างเข้ากับวัตถุจะไม่เปลี่ยนแปลงอะไรเกี่ยวกับผลลัพธ์ ดังนั้นในกรณีนี้ เงื่อนไขจะควบคุมว่าอาร์กิวเมนต์ที่สองจะสนับสนุนแอตทริบิวต์ใดๆ เลยหรือไม่

Jacek avatar
cn flag
คำอธิบายที่ดี ขอบคุณ
Jacek avatar
cn flag
คำถามข้อหนึ่ง โค้ดใช้งานได้ แต่นโยบายกลับลำดับ ทำไมถึงเป็นเช่นนั้น
ph flag
ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดย "returned order" แต่บางทีคุณอาจสังเกตเห็นว่า `jsonencode` จะจัดเรียงแอตทริบิวต์ของวัตถุตามชื่อเสมอ เนื่องจากวัตถุในนั้นเป็นคอลเล็กชันของแอตทริบิวต์ _unordered_ ดังนั้น `jsonencode` จึงมี เพื่อตัดสินใจสั่งซื้อบางอย่างเอง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา