การใช้ลูปกับ `for_each` และ `count`
เรียนรู้การจัดเตรียมทรัพยากรหรือโมดูลหลายอินสแตนซ์โดยใช้ `count` และ `for_each` เพื่อจัดการคอลเลกชันและแผนผังข้อมูลอย่างมีประสิทธิภาพ
การใช้ลูปกับ `for_each` และ `count` เป็นบทเรียน DevOps Bootcamp ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DevOps Bootcamp และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
บทนำสู่การวนซ้ำ
เมื่อจัดการโครงสร้างพื้นฐานด้วย Terraform คุณมักจำเป็นต้องสร้างทรัพยากรที่คล้ายกันหลายรายการ ลองนึกภาพว่าต้องสร้างเว็บเซิร์ฟเวอร์ 10 เครื่องหรืออินสแตนซ์ฐานข้อมูล 5 รายการ การเขียนบล็อกโค้ดเดิมซ้ำ ๆ จะทั้งน่าเบื่อและมีโอกาสเกิดข้อผิดพลาด
บทเรียนนี้จะแนะนำความสามารถอันทรงพลังของ Terraform สองอย่าง ได้แก่ count และ for_each ซึ่งช่วยให้คุณจัดเตรียมทรัพยากรหลายรายการได้อย่างมีประสิทธิภาพ พร้อมรักษาการกำหนดค่าให้กระชับและขยายได้
เหตุใดจึงใช้ `count` และ `for_each`
การใช้การวนซ้ำอย่าง count และ for_each มีประโยชน์อย่างมาก:
- ลดการทำซ้ำ: เขียนโค้ดโครงสร้างพื้นฐานเพียงครั้งเดียวแล้วนำกลับมาใช้ใหม่
- อ่านง่ายขึ้น: การกำหนดค่าของคุณจะสะอาดและเข้าใจได้ง่ายขึ้น
- รองรับการขยาย: ปรับจำนวนทรัพยากรได้ง่ายโดยเปลี่ยนค่าเดียวหรือชุดข้อมูลเดียว
- สอดคล้องกัน: ทำให้มั่นใจว่าทรัพยากรที่คล้ายกันทั้งหมดได้รับการกำหนดค่าเหมือนกัน
`count` สำหรับการทำซ้ำอย่างง่าย
อาร์กิวเมนต์เมทาของ count เหมาะอย่างยิ่งเมื่อคุณต้องสร้างอินสแตนซ์ของทรัพยากรหรือโมดูลที่ แทบจะเหมือนกันทุกประการ หลายรายการ คุณระบุค่าเป็นจำนวนเต็ม แล้ว Terraform จะสร้างอินสแตนซ์ตามจำนวนนั้น
อินสแตนซ์แต่ละรายการที่สร้างด้วย count จะมีดัชนีเริ่มจาก 0 ถึง count - 1 คุณสามารถเข้าถึงดัชนีนี้ได้ด้วย count.index
ตัวอย่าง: อินสแตนซ์ EC2 หลายรายการด้วย `count`
มาจัดเตรียมอินสแตนซ์ AWS EC2 ที่เหมือนกันสามรายการกัน สังเกตการใช้ count.index เพื่อกำหนดชื่อที่ไม่ซ้ำกันให้แต่ละเซิร์ฟเวอร์
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
count = 3
ami = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
instance_type = "t2.micro"
tags = {
Name = "WebServer-${count.index}"
}
}ทำความเข้าใจ `count.index`
ในตัวอย่างก่อนหน้า ${count.index} จะถูกแปลงเป็น 0, 1 และ 2 โดยอัตโนมัติสำหรับแต่ละอินสแตนซ์ วิธีนี้ช่วยให้คุณสร้างตัวระบุที่ไม่ซ้ำกันหรือปรับคุณสมบัติของแต่ละอินสแตนซ์ได้
หากไม่มี count.index เซิร์ฟเวอร์ทั้งสามเครื่องจะมีแท็ก 'Name' เหมือนกันทุกประการ ซึ่งอาจทำให้เกิดความสับสนหรือปัญหาใน AWS
ทำความรู้จักกับ `for_each`
แม้ count จะเหมาะสำหรับการทำซ้ำอย่างง่าย แต่ for_each มีความยืดหยุ่นมากกว่า โดยจะวนซ้ำผ่าน ชุดสตริง หรือ แผนที่สตริง และสร้างหนึ่งอินสแตนซ์สำหรับแต่ละองค์ประกอบ
for_each เหมาะอย่างยิ่งเมื่อคุณต้องจัดการทรัพยากรที่มีการกำหนดค่าแตกต่างกัน หรือเมื่อจำนวนทรัพยากรถูกกำหนดโดยชุดข้อมูลที่ไม่ใช่ตัวเลข เช่น รายการชื่อสภาพแวดล้อม หรือแผนที่การตั้งค่าผู้ใช้
ตัวอย่าง: `for_each` กับชุดข้อมูล
ในที่นี้ เราสร้างบักเก็ต S3 สามรายการ โดยแต่ละรายการตั้งชื่อตามองค์ประกอบในชุดข้อมูล for_each เราใช้ each.value เพื่อเข้าถึงรายการปัจจุบันในการวนซ้ำ
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "app_buckets" {
for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
bucket = each.value
acl = "private"
tags = {
Environment = split("-", each.value)[0]
}
}ตัวอย่าง: `for_each` กับแผนที่
การใช้แผนที่ช่วยให้คุณกำหนดการกำหนดค่าที่ซับซ้อนและไม่ซ้ำกันสำหรับแต่ละทรัพยากรได้ ในที่นี้ เราสร้างบักเก็ต S3 ที่มีการตั้งค่าการกำหนดเวอร์ชันแตกต่างกันตามคีย์สภาพแวดล้อม
คุณสามารถเข้าถึงคีย์ด้วย each.key และเข้าถึงค่าด้วย each.value
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "configured_bucket" {
for_each = {
production = { name = "prod-data-bucket", versioning = true }
development = { name = "dev-logs-bucket", versioning = false }
}
bucket = each.value.name
acl = "private"
versioning {
enabled = each.value.versioning
}
tags = {
Environment = each.key
}
}`count` เทียบกับ `for_each`: เลือกใช้อย่างเหมาะสม
ควรใช้แบบใดเมื่อใด
- ใช้
count: สำหรับการวนซ้ำตามตัวเลขอย่างง่าย เพื่อสร้างทรัพยากรที่เหมือนกันในจำนวนที่กำหนด โดยให้ปริมาณเป็นสิ่งสำคัญหลัก เหมาะเมื่อคุณต้องการเพียงดัชนีเพื่อแยกความแตกต่าง - ใช้
for_each: สำหรับการวนซ้ำผ่านชุดข้อมูลที่ซับซ้อน เช่น ชุดข้อมูลหรือแผนที่ เมื่อทรัพยากรต้องมีตัวระบุหรือคุณสมบัติเฉพาะที่ได้มาจากองค์ประกอบของชุดข้อมูล โดยทั่วไปควรเลือกใช้เมื่อแต่ละอินสแตนซ์มีตัวระบุเชิงตรรกะที่ชัดเจนและไม่ซ้ำกัน
ตรวจสอบอย่างรวดเร็ว: การวนซ้ำ
ลองพิจารณาสถานการณ์ที่คุณต้องสร้างบักเก็ต S3 สำหรับแต่ละทีมในองค์กร และแต่ละบักเก็ตต้องมีนโยบายการเก็บรักษาเฉพาะที่ทีมดังกล่าวกำหนด
สรุป: การสร้างทรัพยากรอย่างมีประสิทธิภาพ
ทำได้ดีมาก คุณได้เรียนรู้วิธีใช้ count และ for_each เพื่อทำให้การกำหนดค่า Terraform ของคุณมีความยืดหยุ่นและมีประสิทธิภาพมากขึ้น
countใช้สำหรับการทำซ้ำทรัพยากรที่เหมือนกันตามจำนวนตัวเลขอย่างง่าย โดยใช้count.indexเพื่อแยกความแตกต่างfor_eachใช้สำหรับการวนซ้ำผ่านชุดข้อมูลหรือแผนที่ เพื่อสร้างทรัพยากรที่แตกต่างกันและมีคุณสมบัติเฉพาะ โดยใช้each.keyและeach.value
โครงสร้างเหล่านี้เป็นพื้นฐานสำคัญสำหรับการจัดการโครงสร้างพื้นฐานเป็นโค้ดที่ขยายและบำรุงรักษาได้
คำถามที่พบบ่อย
บทเรียน “การใช้ลูปกับ `for_each` และ `count`” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การใช้ลูปกับ `for_each` และ `count`” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DevOps Bootcamp ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การใช้ลูปกับ `for_each` และ `count`”
เรียนรู้การจัดเตรียมทรัพยากรหรือโมดูลหลายอินสแตนซ์โดยใช้ `count` และ `for_each` เพื่อจัดการคอลเลกชันและแผนผังข้อมูลอย่างมีประสิทธิภาพ คุณปฏิบัติ DevOps Bootcamp ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DevOps Bootcamp หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน DevOps Bootcamp บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การใช้ลูปกับ `for_each` และ `count`” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน DevOps Bootcamp นี้ได้ไหม
ได้ บทเรียน DevOps Bootcamp ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ลูปกับ `for_each` และ `count`
- ฟังก์ชันในตัวของ Terraform
- นิพจน์เงื่อนไขและ Splat
- บล็อกไดนามิกสำหรับการตั้งค่าซ้อนกัน