โมดูล Terraform ของ Google IAM
นี่คือชุดของโมดูลย่อยที่ทำให้การจัดการบทบาท IAM หลายบทบาทสำหรับทรัพยากรบน Google Cloud Platform โดยไม่ทำลายได้ง่ายขึ้น:
- IAM รีจิสทรีอาร์ติแฟกต์
- การกำหนดค่าการตรวจสอบ
- BigQuery IAM
- บัญชีสำหรับการเรียกเก็บเงิน IAM
- IAM บริการคลาวด์รัน
- IAM บทบาทที่กำหนดเอง
- IAM โซน DNS
- โฟลเดอร์ IAM
- IAM คีย์การเข้ารหัสลับ KMS
- KMS_คีย์ริง IAM
- องค์กร IAM
- โครงการ IAM
- การสมัครสมาชิก Pubsub IAM
- หัวข้อ Pubsub IAM
- ผู้จัดการความลับ IAM
- บัญชีบริการ IAM
- ที่เก็บข้อมูล IAM
- ซับเน็ต IAM
- แท็กคีย์ IAM
- ค่าแท็ก IAM
- ผู้จัดการแหล่งที่มาที่ปลอดภัย
ความเข้ากันได้
โมดูลนี้มีไว้สำหรับใช้กับ Terraform 1.3+ และทดสอบโดยใช้ Terraform 1.3+ หากคุณพบความไม่เข้ากันในการใช้ Terraform >=1.3 โปรดเปิดปัญหา
กำลังอัปเกรด
คำแนะนำต่อไปนี้มีไว้เพื่อช่วยในการอัพเกรด:
- 4.0 -> 5.0
- 3.0 -> 4.0
- 2.0 -> 3.0
การใช้งาน
ตัวอย่างแบบเต็มอยู่ในโฟลเดอร์ตัวอย่าง แต่การใช้งานพื้นฐานสำหรับการจัดการบทบาทในสองโปรเจ็กต์มีดังต่อไปนี้:
module "projects_iam_bindings" {
source = " terraform-google-modules/iam/google//modules/projects_iam "
version = " ~> 8.0 "
projects = [ " project-123456 " , " project-9876543 " ]
bindings = {
" roles/storage.admin " = [
" group:[email protected] " ,
" user:[email protected] " ,
]
" roles/compute.networkAdmin " = [
" group:[email protected] " ,
" user:[email protected] " ,
]
" roles/compute.imageUser " = [
" user:[email protected] " ,
]
}
}
โมดูลนี้ยังมีโหมด ที่เชื่อถือได้ ซึ่งจะลบบทบาททั้งหมดที่ไม่ได้รับมอบหมายผ่าน Terraform นี่คือตัวอย่างของการใช้โหมดที่เชื่อถือได้เพื่อจัดการการเข้าถึงบัคเก็ตของพื้นที่เก็บข้อมูล:
module "storage_buckets_iam_bindings" {
source = " terraform-google-modules/iam/google//modules/storage_buckets_iam "
version = " ~> 8.0 "
storage_buckets = [ " my-storage-bucket " ]
mode = " authoritative "
bindings = {
" roles/storage.legacyBucketReader " = [
" user:[email protected] " ,
" group:[email protected] " ,
]
" roles/storage.legacyBucketWriter " = [
" user:[email protected] " ,
" group:[email protected] " ,
]
}
}
โหมดเสริมและเผด็จการ
ตัวแปร mode
ควบคุมพฤติกรรมของโมดูลย่อย โดยค่าเริ่มต้นจะถูกตั้งค่าเป็น "เพิ่มเติม" ตัวเลือกที่เป็นไปได้คือ:
- เพิ่มเติม: เพิ่มสมาชิกในบทบาท สมาชิกเก่าจะไม่ถูกลบออกจากบทบาทนี้
- เผด็จการ: ตั้งค่าสมาชิกของบทบาท (รวมถึงการลบรายการที่ไม่ได้อยู่ในรายการ) บทบาทที่ไม่อยู่ในรายการจะไม่ได้รับผลกระทบ
ในโหมดที่เชื่อถือได้ โมดูลย่อยจะควบคุมการเชื่อมโยง IAM ที่แสดงอยู่ในโมดูลอย่างสมบูรณ์ ซึ่งหมายความว่าสมาชิกใดๆ ที่เพิ่มเข้าไปในบทบาทภายนอกโมดูลจะถูกลบออกในครั้งถัดไปที่ Terraform ทำงาน อย่างไรก็ตาม บทบาทที่ไม่อยู่ในรายการจะไม่ได้รับผลกระทบ
ในโหมดเพิ่มเติม โมดูลย่อยจะปล่อยให้การเชื่อมโยงที่มีอยู่ไม่ได้รับผลกระทบ แต่สมาชิกใดๆ ที่อยู่ในโมดูลจะถูกเพิ่มเข้ากับชุดการเชื่อมโยง IAM ที่มีอยู่แทน อย่างไรก็ตาม สมาชิกที่ระบุในโมดูล จะ ถูกควบคุมโดยโมดูลอย่างสมบูรณ์ ซึ่งหมายความว่าหากคุณเพิ่มการเชื่อมโยงผ่านโมดูลและลบออกในภายหลัง โมดูลจะจัดการการลบการเชื่อมโยงบทบาทได้อย่างถูกต้อง
คำเตือน
การอ้างอิงค่า/คุณลักษณะจากแหล่งข้อมูลอื่น
แต่ละโมดูลย่อยจะดำเนินการกับตัวแปรบางตัวก่อนทำการเปลี่ยนแปลงใดๆ กับการผูก IAM ใน GCP เนื่องจากข้อจำกัดของ for_each
(ข้อมูลเพิ่มเติม) ซึ่งใช้กันอย่างแพร่หลายในโมดูลย่อย มีข้อจำกัดบางประการเกี่ยวกับประเภทของค่าไดนามิกที่คุณสามารถระบุให้กับโมดูลย่อยได้:
- เอนทิตีแบบไดนามิก (เช่น
projects
) ได้รับอนุญาตสำหรับ 1 เอนทิตีเท่านั้น - หากคุณผ่าน 2 เอนทิตีขึ้นไป (เช่น
projects
) การกำหนดค่า จะต้อง คงที่ ซึ่งหมายความว่าจะไม่สามารถใช้ฟิลด์ทรัพยากรอื่นใดเพื่อรับชื่อเอนทิตีได้ (ซึ่งรวมถึงการรับแฮชที่สร้างแบบสุ่มผ่าน random_id
ทรัพยากร). - ชื่อบทบาทไม่สามารถเป็นแบบไดนามิกได้
- สมาชิกอาจมีไดนามิกในโหมด
authoritative
เท่านั้น
การเชื่อมโยง IAM
คุณสามารถเลือกประเภททรัพยากรต่อไปนี้เพื่อใช้การเชื่อมโยง IAM:
- โครงการ (ตัวแปร
projects
) - องค์กร( ตัวแปร
organizations
) - โฟลเดอร์ (ตัวแปร
folders
) - บัญชีบริการ (ตัวแปร
service_accounts
) - เครือข่ายย่อย (ตัวแปร
subnets
) - ที่เก็บข้อมูล (ตัวแปร
storage_buckets
) - หัวข้อ Pubsub (ตัวแปร
pubsub_topics
) - การสมัครสมาชิก Pubsub (ตัวแปร
pubsub_subscriptions
) - ห่วงกุญแจ Kms (ตัวแปร
kms_key_rings
) - Kms Crypto Keys (ตัวแปร
kms_crypto_keys
) - ความลับของผู้จัดการความลับ ( ตัวแปร
secrets
) - โซน DNS (ตัวแปร
managed_zones
) - Secure Source Manager (
entity_ids
และตัวแปร location
)
ตั้งค่าตัวแปรที่ระบุในการเรียกโมดูลเพื่อเลือกทรัพยากรที่จะได้รับผลกระทบ อย่าลืมตั้งค่าตัวแปร mode
และให้สิทธิ์เพียงพอในการจัดการทรัพยากรที่เลือกด้วย โปรดทราบว่าตัวแปร bindings
ยอมรับแมปว่าง {}
ที่ส่งผ่านเป็นอาร์กิวเมนต์ในกรณีที่ทรัพยากรไม่มีการผูก IAM ที่จะใช้
ความต้องการ
ปลั๊กอิน Terraform
- เทอร์ราฟอร์ม >= 0.13.0
- Terraform-ผู้ให้บริการ-Google 2.5
- Terraform-ผู้ให้บริการ-Google-เบต้า 2.5
สิทธิ์
เพื่อดำเนินการโมดูลย่อย คุณต้องมีบัญชีบริการที่มีบทบาทที่เหมาะสมในการจัดการ IAM สำหรับทรัพยากรที่เกี่ยวข้อง บทบาทที่เหมาะสมจะแตกต่างกันไปขึ้นอยู่กับทรัพยากรที่คุณกำหนดเป้าหมาย ดังนี้:
- องค์กร:
- ผู้ดูแลระบบองค์กร: สิทธิ์เข้าถึงเพื่อจัดการทรัพยากรทั้งหมดที่เป็นขององค์กร และไม่รวมถึงสิทธิ์ในการเรียกเก็บเงินหรือการบริหารบทบาทขององค์กร
- กำหนดเอง: เพิ่มสิทธิ์ resourcesmanager.organizations.getIamPolicy และ resourcesmanager.organizations.setIamPolicy
- โครงการ:
- เจ้าของ: การเข้าถึงแบบเต็มและการอนุญาตทั้งหมดสำหรับทรัพยากรทั้งหมดของโครงการ
- ผู้ดูแลระบบ IAM ของโปรเจ็กต์: อนุญาตให้ผู้ใช้จัดการนโยบาย IAM บนโปรเจ็กต์
- กำหนดเอง: เพิ่มสิทธิ์ resourcesmanager.projects.getIamPolicy และ resourcesmanager.projects.setIamPolicy
- โฟลเดอร์:
- ผู้ดูแลระบบโฟลเดอร์: การอนุญาตโฟลเดอร์ที่มีอยู่ทั้งหมด
- ผู้ดูแลระบบ IAM โฟลเดอร์: อนุญาตให้ผู้ใช้จัดการนโยบาย IAM บนโฟลเดอร์
- กำหนดเอง: เพิ่มสิทธิ์ resourcesmanager.folders.getIamPolicy และ resourcesmanager.folders.setIamPolicy (ต้องเพิ่มในองค์กร)
- บัญชีบริการ:
- ผู้ดูแลบัญชีบริการ: สร้างและจัดการบัญชีบริการ
- กำหนดเอง: เพิ่มสิทธิ์ resourcesmanager.organizations.getIamPolicy และ resourcesmanager.organizations.setIamPolicy
- เครือข่ายย่อย:
- ผู้ดูแลระบบประมวลผลโครงการ: ควบคุมทรัพยากร Compute Engine โดยสมบูรณ์
- ผู้ดูแลระบบเครือข่ายประมวลผลโปรเจ็กต์: ควบคุมทรัพยากรเครือข่าย Compute Engine โดยสมบูรณ์
- โปรเจ็กต์ที่กำหนดเอง: เพิ่มสิทธิ์ compute.subnetworks.getIamPolicy และ compute.subnetworks.setIamPolicy
- ที่เก็บข้อมูล:
- ผู้ดูแลระบบพื้นที่เก็บข้อมูล: ควบคุมทรัพยากร GCS โดยสมบูรณ์
- เจ้าของบัคเก็ตดั้งเดิมของพื้นที่เก็บข้อมูล: สิทธิ์การอ่านและเขียนในบัคเก็ตที่มีอยู่พร้อมรายการ/การสร้าง/การลบออบเจ็กต์
- กำหนดเอง: เพิ่มสิทธิ์ storage.buckets.getIamPolicy และ storage.buckets.setIamPolicy
- หัวข้อ Pubsub:
- ผู้ดูแลระบบ Pub/Sub: สร้างและจัดการบัญชีบริการ
- กำหนดเอง: เพิ่มสิทธิ์ pubsub.topics.getIamPolicy และ pubsub.topics.setIamPolicy
- การสมัครสมาชิก Pubsub:
- บทบาทผู้ดูแลระบบ Pub/Sub: สร้างและจัดการบัญชีบริการ
- บทบาทที่กำหนดเอง: เพิ่มสิทธิ์ pubsub.subscriptions.getIamPolicy และ pubsub.subscriptions.setIamPolicy
- พวงกุญแจ Kms:
- เจ้าของ: เข้าถึงทรัพยากรทั้งหมดโดยสมบูรณ์
- ผู้ดูแลระบบ Cloud KMS: เปิดใช้งานการจัดการทรัพยากร crypto
- กำหนดเอง: เพิ่มสิทธิ์ cloudkms.keyRings.getIamPolicy และ cloudkms.keyRings.getIamPolicy
- รหัสเข้ารหัส Kms:
- เจ้าของ: เข้าถึงทรัพยากรทั้งหมดโดยสมบูรณ์
- ผู้ดูแลระบบ Cloud KMS: เปิดใช้งานการจัดการทรัพยากร crypto
- กำหนดเอง: เพิ่มสิทธิ์ cloudkms.cryptoKeys.getIamPolicy และ cloudkms.cryptoKeys.setIamPolicy
- ผู้จัดการความลับ:
- ผู้ดูแลระบบ Secret Manager: สิทธิ์การเข้าถึงแบบเต็มเพื่อจัดการ Secret Manager
- กำหนดเอง: เพิ่มสิทธิ์ secretmanager.secrets.getIamPolicy และ secretmanager.secrets.setIamPolicy
- โซน DNS:
- ผู้ดูแลระบบ DNS: สิทธิ์การเข้าถึงแบบเต็มเพื่อจัดการโซน DNS
- กำหนดเอง: เพิ่มสิทธิ์ dns.managedZones.setIamPolicy, dns.managedZones.list และ dns.managedZones.getIamPolicy
ติดตั้ง
เทอร์ราฟอร์ม
ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชัน Terraform ที่ถูกต้อง >= 1.3
ปลั๊กอิน Terraform
ตรวจสอบให้แน่ใจว่าคุณมีปลั๊กอินที่คอมไพล์แล้วใน $HOME/.terraform.d/plugins/
- ผู้ให้บริการ Terraform-Google >= 5.37
- terraform-provider-google-beta >= 5.37
ดูหน้าปลั๊กอินแต่ละหน้าสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการคอมไพล์และใช้งาน