How to Configure Terraform for NIPA Object Storage
วิธีการตั้งค่า Terraform กับ NIPA Object Storage ด้วย Backend "s3"
การตั้งค่า Terraform เพื่อใช้งานกับ NIPA Object Storage โดยใช้ backend ประเภท "s3" สามารถทำได้ตามขั้นตอนดังนี้
1. ติดตั้ง Terraform
ดาวน์โหลด Terraform เวอร์ชันล่าสุดจาก เว็บไซต์ Terraform
ติดตั้ง Terraform ตามคำแนะนำที่เหมาะสมกับระบบปฏิบัติการของคุณ
2. สร้าง Bucket ใน NIPA Object Storage
เข้าสู่ระบบ NIPA Cloud Space
ทดสอบเชื่อม Bucket ด้วยโปรแกรม Cyberduck (UI) หรือ ด้วย s3cmd (CLI)
3. สร้างไฟล์ main.tf
main.tf
สร้างไฟล์ main.tf
เพื่อกำหนดการตั้งค่า backend และ resource ที่ต้องการ โดยตัวอย่างการตั้งค่า backend สำหรับ NIPA Object Storage มีดังนี้:
terraform {
# เพิ่มส่วนนี้เข้ามาเพื่อเชื่อมต่อกับ S3 NIPA
backend "s3" {
bucket = "ชื่อ-bucket"
key = "path/ของ/terraform.tfstate" e.g.
region = "NCP-TH"
endpoint = "https://s3-bkk.nipa.cloud"
# เพื่อความปลอดภัยไม่เก็บ Access Key และ Secret Key ไว้ในไฟล์ .tf โดยตรง
access_key = "access-key-ของคุณ"
secret_key = "secret-key-ของคุณ"
# --- ค่าสำคัญสำหรับ S3-Compatible Storage ---
skip_credentials_validation = true
skip_metadata_api_check = true
skip_region_validation = true
force_path_style = true
skip_requesting_account_id = true
skip_s3_checksum = true
} //backend
} //terraform
# provider ที่ต้องการจะใช้
provider "openstack" {
...
}
# resource ที่ต้องการสร้าง
resource "openstack_networking_port_v2" "create_myport" {
...
}
คำอธิบาย:
bucket
: ชื่อ bucket ที่สร้างไว้ใน NIPA Object Storagekey
: ไฟล์ที่ใช้เก็บสถานะ (state) ของ Terraform ใน Bucketregion
: ชื่อ region (สามารถกำหนดเป็นค่าใดก็ได้ เช่นdefault
)endpoint
: URL สำหรับเชื่อมต่อกับ NIPA Object Storageaccess_key
และsecret_key
: Credentials สำหรับการเข้าถึง Object Storage หรือ Sub-Users ของ nipa cloud space คำอธิบาย: การกำหนดค่า S3-Compatible Storage มีวัตถุประสงค์เพื่อปรับการทำงานของ S3 backend ให้สามารถใช้งานร่วมกับ Object Storage ที่ไม่ใช่ของ AWS ได้ โดยปกติแล้ว S3 backend ถูกออกแบบมาเพื่อใช้งานกับ AWS โดยเฉพาะ จึงมีขั้นตอนการตรวจสอบหลายอย่างที่เฉพาะเจาะจงสำหรับ AWS เท่านั้น อย่างไรก็ตาม เมื่อใช้งานกับผู้ให้บริการรายอื่น เช่น Nipa Cloud จำเป็นต้องใช้ flag เหล่านี้เพื่อแจ้งให้ Terraform ข้ามการตรวจสอบเฉพาะของ AWS เหล่านี้ไปskip_credentials_validation = true
บอก Terraform ว่า "ไม่ต้องพยายามนำ Access Key นี้ไปตรวจสอบกับระบบยืนยันตัวตนของ AWS (STS)"skip_metadata_api_check = true
บอกว่า "ไม่ต้องเช็คหา Metadata service ของเครื่อง EC2" เพราะเราไม่ได้รันอยู่บน AWSskip_region_validation = true
บอกว่า "ไม่ต้องตรวจสอบว่า Region ที่ระบุ (เช่น NCP-TH) เป็น Region ที่ถูกต้องของ AWS หรือไม่"force_path_style = true
บังคับให้ Terraform เข้าถึง Bucket แบบendpoint/bucket
แทนที่จะเป็นbucket.endpoint
ซึ่งเป็นวิธีที่ S3-compatible storage ส่วนใหญ่ใช้skip_requesting_account_id = true
บอกว่า "ไม่ต้องถามหา AWS Account ID" เพราะผู้ให้บริการรายอื่นไม่มีสิ่งนี้skip_s3_checksum = true
บอกให้ข้ามการตรวจสอบความสมบูรณ์ของไฟล์ ซึ่งมีประโยชน์เมื่อ ETag ที่ผู้ให้บริการส่งกลับมาไม่ตรงกับมาตรฐานของ AWS
5. รันคำสั่ง Terraform
Initialize Terraform: คำสั่งนี้จะทำการตั้งค่า backend และดาวน์โหลด provider ที่จำเป็น
terraform init
ตรวจสอบแผนการทำงาน: ใช้เพื่อตรวจสอบว่า Terraform จะทำอะไรบ้าง
terraform plan
Apply การตั้งค่า: ใช้เพื่อดำเนินการสร้าง resource ตามที่กำหนดไว้ในไฟล์
main.tf
terraform apply
know issue
ปัญหา Error: XAmzContentSHA256Mismatch
(Version terraform มีผล)
XAmzContentSHA256Mismatch
(Version terraform มีผล)https://github.com/hashicorp/terraform/issues/36704 หนึ่งในข้อผิดพลาดที่ผู้ใช้ Terraform กับ S3-compatible storage มักจะเจอคือ XAmzContentSHA256Mismatch ซึ่งเกิดจากความไม่เข้ากันของวิธีการคำนวณ "ลายเซ็นดิจิทัล" (Checksum) ระหว่าง Terraform และ S3 provider
ในอดีต การแก้ปัญหานี้มักจะต้อง Downgrade Terraform ไปใช้เวอร์ชันเก่า แต่สำหรับ Terraform v1.12.2 ขึ้นไป มีวิธีแก้ปัญหาที่ทันสมัยและดีกว่า นั่นคือการตั้งค่า Environment Variable เพื่อให้ Terraform ยืดหยุ่นในการตรวจสอบ Checksum มากขึ้น ตั้งค่า Environment Variable ต่อไปนี้ใน Shell ของคุณก่อนรันคำสั่ง terraform init
export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
Was this helpful?