ชุดเครื่องมือพื้นฐานระบบคลาวด์ 101

1. ข้อมูลเบื้องต้นเกี่ยวกับ CFT 101

ea557448aaa1fffc.png

อัปเดตล่าสุด:03-03-2020

Cloud Foundation Toolkit คืออะไร

โดยพื้นฐานแล้ว CFT มีเทมเพลตแนวทางปฏิบัติแนะนำเพื่อเริ่มต้นใช้งาน Google Cloud Platform อย่างรวดเร็ว ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีมีส่วนร่วมในการใช้ Cloud Foundation Toolkit

สิ่งที่คุณต้องมี

  • บัญชี GitHub
  • ติดตั้ง Docker ในเครื่องแล้ว ( ติดตั้ง Mac, ติดตั้ง Windows)
  • ตัวแก้ไขโค้ดสำหรับการแก้ไขโค้ด (เช่น โค้ด Visual Studio)
  • มีความคุ้นเคยกับ Git และ GitHub ในระดับพื้นฐาน
  • ประสบการณ์บางส่วนในการใช้ Terraform และโครงสร้างพื้นฐานเป็นโค้ด
  • สิทธิ์ในการมอบบทบาทผู้สร้างโปรเจ็กต์แก่บัญชีบริการ

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้ดูวิธีมีส่วนร่วมใน Cloud Foundation Toolkit (CFT)

คุณจะ:

  • ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์สำหรับการมีส่วนร่วมใน CFT
  • เพิ่มฟีเจอร์ลงในโมดูล CFT
  • เพิ่มการทดสอบสำหรับฟีเจอร์ที่เพิ่ม
  • ดำเนินการทดสอบการผสานรวมใน CFT
  • ดำเนินการทดสอบ Lint
  • คอมมิตโค้ดไปยัง GitHub และส่งคำขอพุล (PR)

คุณจะดำเนินการตามขั้นตอนด้านบนทั้งหมดได้โดยเพิ่มฟีเจอร์ใหม่ในโมดูล CFT ของ Google Cloud Storage คุณจะเพิ่มป้ายกำกับที่เรียกว่า "silly_label" ซึ่งระบบจะเพิ่มไปยังที่เก็บข้อมูลทั้งหมดที่สร้างขึ้นผ่านโมดูล GCS CFT โดยอัตโนมัติ นอกจากนี้ คุณยังจะได้เขียนการทดสอบเพื่อตรวจสอบความถูกต้องของฟีเจอร์และทำให้การผสานรวมตั้งแต่ต้นจนจบ

2. ตั้งค่าสภาพแวดล้อมสำหรับนักพัฒนาซอฟต์แวร์

คุณใช้ Cloud Shell เพื่อการพัฒนาได้ หากต้องการ หากไม่ต้องการใช้ Cloud Shell เพื่อมีส่วนร่วมใน CFT คุณสามารถตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์บนเครื่องได้

ตั้งค่า Git

GitHub สร้างขึ้นตามระบบควบคุมเวอร์ชันโอเพนซอร์ส (VCS) ที่เรียกว่า Git Git จะรับผิดชอบต่อทุกอย่างที่เกี่ยวข้องกับ GitHub ซึ่งเกิดขึ้นในเครื่องหรือ Cloud Shell

  1. เมื่อใช้ Cloud Shell คุณไม่จำเป็นต้องติดตั้ง Git เนื่องจากมีการติดตั้งไว้ล่วงหน้าแล้ว
$ git --version
# This will display the git version on the Cloud Shell.

หากคุณกำลังตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์บนเครื่อง คุณจะต้องติดตั้ง Git

การตั้งค่าชื่อผู้ใช้และอีเมลใน Git

Git ใช้ชื่อผู้ใช้เพื่อเชื่อมโยงคอมมิตกับข้อมูลประจำตัว ชื่อผู้ใช้ Git ไม่เหมือนกับชื่อผู้ใช้ GitHub ของคุณ

คุณสามารถเปลี่ยนชื่อที่เชื่อมโยงกับคอมมิตของ Git ได้โดยใช้คำสั่งการกำหนดค่า git การเปลี่ยนชื่อที่เชื่อมโยงกับคอมมิตของ Git โดยใช้ git config จะมีผลกับคอมมิตในอนาคตเท่านั้น และจะไม่เปลี่ยนชื่อที่ใช้สำหรับคอมมิตที่ผ่านมา

คุณตั้งค่า Git สำเร็จแล้วและคุณน่าจะแยกแยะ สร้าง และโคลน Branch ได้ เราจะใช้ Git อย่างกว้างขวางใน Codelab นี้

3. ที่เก็บ GCS ของ Fork CFT

แยกที่เก็บ CFT

คุณตั้งค่า Git บนเครื่องภายในหรือ Cloud Shell ได้ในขั้นตอนก่อนหน้า ตอนนี้คุณต้องแยกที่เก็บ CFT ของ Google Cloud Storage เพื่อเริ่มมีส่วนร่วม

Fork คือสำเนาของที่เก็บ การฟอร์แมตที่เก็บช่วยให้คุณทดสอบการเปลี่ยนแปลงได้อย่างอิสระโดยไม่ส่งผลกระทบต่อโปรเจ็กต์ต้นฉบับ

โดยส่วนใหญ่มักใช้ส้อมเพื่อเสนอการเปลี่ยนแปลงให้กับโปรเจ็กต์ของผู้อื่นหรือใช้โปรเจ็กต์ของผู้อื่นเป็นจุดเริ่มต้นสำหรับแนวคิดของคุณเอง

ตัวอย่างเช่น คุณใช้ส้อมเพื่อเสนอการเปลี่ยนแปลงที่เกี่ยวข้องกับการแก้ไขข้อบกพร่องได้ วิธีแก้ไขข้อบกพร่องมีดังนี้

  • แยกที่เก็บ
  • แก้ไขปัญหา
  • ส่งคำขอพุลไปยังเจ้าของโปรเจ็กต์

ขั้นตอนในการปลอมแปลงที่เก็บ CFT มีดังนี้

  1. เปิดเว็บเบราว์เซอร์และไปที่ที่เก็บ terraform-google-modules/terraform-google-cloud-storage เราจะใช้ที่เก็บนี้สําหรับ Codelab ทั้งหมด
  2. คลิกแยกที่มุมขวาบนของหน้า

e3894c6de6a732b4.png

  1. คุณจะเห็นตัวเลือกตำแหน่งที่ต้องการให้แยกหน้าจอ เลือกโปรไฟล์ และที่เก็บจะถูกแยกออก

โคลนส้อมในเครื่อง

แยกที่คุณสร้างเป็นสำเนาของที่เก็บโมดูล GCS คุณจะโคลนที่เก็บนี้ไปยังสภาพแวดล้อมในเครื่องเพื่อเพิ่มฟีเจอร์ใหม่ได้แล้ว

ขั้นตอนการโคลนส้อมมีดังนี้

  1. เปิดเว็บเบราว์เซอร์และไปยังแยกใน terraform-google-modules/terraform-google-cloud-storage
  2. ที่มุมบนขวา คุณจะเห็นปุ่ม "โคลนหรือดาวน์โหลด" ให้คลิกปุ่ม

3bfa87b9f7f01f61.png

  1. หลังจากคลิก "โคลนหรือดาวน์โหลด" ให้คลิกปุ่ม "Notepad" เพื่อคัดลอก URL ของส้อม คุณจะใช้ URL นี้เพื่อโคลนส้อมไปยังสภาพแวดล้อมในเครื่อง

dbf3682d004e0ee0.png

  1. ไปที่เทอร์มินัลใน VSCode หรือเครื่อง แล้วโคลนส้อม
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
  1. เมื่อโคลนส้อมในเครื่องแล้ว คุณควรไปที่ที่เก็บ สร้างสาขาใหม่ออกจากแยก และแก้ไขโค้ดใน Branch ชั่วคราว

ตามหลักแล้ว คุณสามารถตั้งชื่อสาขาดังนี้

  • สำหรับคำขอฟีเจอร์: feature/feature-name
  • สำหรับการอัปเดตภายใน internal/change-name
  • สำหรับการแก้ไขข้อบกพร่อง: bugfix/issue-name

เนื่องจากกำลังเพิ่มฟีเจอร์ใหม่ คุณสามารถโทรหาสาขาชั่วคราว feature/silly_label ได้

$ cd terraform-google-cloud-storage
# This command takes you into the cloned directory on your local machine.

$ git branch
# This command tells your current branch
# When you run this for the first time after you have cloned, your 
# output should say "master", that is your fork.

$ git checkout -b feature/silly_label
# This command creates a new branch on your fork and switches your 
# branch to the newly created branch.

$ git branch
# This command will confirm your current branch to be "feature/silly_label"

ตอนนี้คุณพร้อมที่จะเริ่มทำ Cloud Foundation Toolkit แล้ว

4. สร้างสภาพแวดล้อมการทดสอบ

กระบวนการพัฒนา CFT มาตรฐานจะอิงตามการใช้โปรเจ็กต์ทดสอบแบบแยกสำหรับการทดสอบ ขั้นตอนนี้จะแนะนำขั้นตอนการสร้างโปรเจ็กต์ทดสอบ (ตามการกำหนดค่ามาตรฐาน) ผ่านบัญชีบริการ

0. ติดตั้ง Docker Engine

หากคุณใช้เครื่องเพื่อการพัฒนา คุณต้องติดตั้ง Docker Engine

1. ติดตั้ง Google Cloud SDK

คุณไม่จำเป็นต้องติดตั้ง Google Cloud SDK หากใช้ Cloud Shell ของ GCP

ไปที่ Google Cloud SDK และดาวน์โหลดโปรแกรมติดตั้งแบบอินเทอร์แอกทีฟสำหรับแพลตฟอร์ม

2. กำหนดค่า

หากต้องการสร้างสภาพแวดล้อมการทดสอบ คุณจะต้องมีองค์กร Google Cloud, โฟลเดอร์ทดสอบ และบัญชีสำหรับการเรียกเก็บเงิน ค่าเหล่านี้ต้องตั้งค่าผ่านตัวแปรสภาพแวดล้อม

export TF_VAR_org_id="your_org_id"
export TF_VAR_folder_id="your_folder_id"
export TF_VAR_billing_account="your_billing_account_id"

3 ตั้งค่าบัญชีบริการ

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

3.1 สร้างหรือเลือกโปรเจ็กต์ GCP สำหรับ Seed

ก่อนสร้างบัญชีบริการ คุณต้องเลือกโปรเจ็กต์เพื่อโฮสต์บัญชีดังกล่าว นอกจากนี้ คุณยังสร้างโปรเจ็กต์ใหม่ได้อีกด้วย

gcloud config set core/project YOUR_PROJECT_ID

3.2 เปิดใช้ Google Cloud API

เปิดใช้ Google Cloud API ต่อไปนี้ในโปรเจ็กต์ Seed ของคุณ:

gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable cloudbilling.googleapis.com

3.3 สร้างบัญชีบริการ

สร้างบัญชีบริการใหม่เพื่อจัดการสภาพแวดล้อมการทดสอบ ดังนี้

# Creating a service account for CFT.
gcloud iam service-accounts create cft-onboarding \
  --description="CFT Onboarding Terraform Service Account" \
  --display-name="CFT Onboarding"

# Assign SERVICE_ACCOUNT environment variable for later steps
export SERVICE_ACCOUNT=cft-onboarding@$(gcloud config get-value core/project).iam.gserviceaccount.com

ยืนยันว่าระบบสร้างบัญชีบริการแล้ว โดยทำดังนี้

gcloud iam service-accounts list --filter="EMAIL=${SERVICE_ACCOUNT}"

3.4 มอบบทบาทผู้สร้างโปรเจ็กต์ ผู้ใช้บัญชีสำหรับการเรียกเก็บเงิน และผู้ดูองค์กรให้แก่บัญชีบริการ ดังนี้

gcloud resource-manager folders add-iam-policy-binding ${TF_VAR_folder_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/resourcemanager.projectCreator"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/billing.user"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/resourcemanager.organizationViewer"

ตอนนี้คุณก็มีบัญชีบริการที่สามารถใช้จัดการสภาพแวดล้อมการทดสอบได้แล้ว

4. มอบหมายบทบาทผู้ใช้บัญชีสำหรับการเรียกเก็บเงินในทรัพยากรบัญชีสำหรับการเรียกเก็บเงิน

4.1 ดึงข้อมูลนโยบาย IAM ของบัญชีสำหรับการเรียกเก็บเงิน

ดาวน์โหลดการเชื่อมโยงนโยบาย IAM ที่มีอยู่ในบัญชีสำหรับการเรียกเก็บเงิน

gcloud beta billing accounts get-iam-policy ${TF_VAR_billing_account} | tee policy.yml

4.2 อัปเดตนโยบายเพื่อรวมบัญชีบริการ

อัปเดตไฟล์ policy.yml เพื่อเพิ่มการเชื่อมโยงใหม่สำหรับบัญชีบริการที่มีบทบาท roles/billing.user

bindings:
- members:
  - serviceAccount:cft-onboarding@<YOUR_PROJECT_ID>.iam.gserviceaccount.com
  role: roles/billing.user

4.3 อัปเดตนโยบายบัญชีสำหรับการเรียกเก็บเงิน

ใช้การเปลี่ยนแปลงกับบัญชีสำหรับการเรียกเก็บเงิน

gcloud beta billing accounts set-iam-policy ${TF_VAR_billing_account} policy.yml

5. เตรียมข้อมูลเข้าสู่ระบบ Terraform

คุณต้องดาวน์โหลดคีย์บัญชีบริการลงใน Shell เพื่อสร้างสภาพแวดล้อมการทดสอบ

5.1 คีย์บัญชีบริการ

สร้างและดาวน์โหลดคีย์บัญชีบริการสำหรับ Terraform

gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}

5.2 ตั้งค่าข้อมูลเข้าสู่ระบบ Terraform

ระบุคีย์ให้กับ Terraform โดยใช้ตัวแปรสภาพแวดล้อม SERVICE_ACCOUNT_JSON โดยกำหนดค่าเป็น contents ของคีย์บัญชีบริการ

export SERVICE_ACCOUNT_JSON=$(< cft.json)

6. สร้างโปรเจ็กต์ทดสอบสำหรับการทำให้ Terraform ใช้งานได้

เมื่อเตรียมทุกอย่างเรียบร้อยแล้ว คุณก็สร้างโปรเจ็กต์ทดสอบได้ด้วยคำสั่งเดียว เรียกใช้คำสั่งนี้จากรูทของไดเรกทอรี terraform-google-cloud-storage

make docker_test_prepare

คุณจะเห็นเอาต์พุตด้านล่างเมื่อเรียกใช้ make docker_test_prepare ซึ่งในตอนท้ายคุณจะได้รับรหัส project_id ทดสอบที่สร้างขึ้นเพื่อให้คุณนำไปปรับใช้และทดสอบโมดูล Cloud Storage ด้วยฟีเจอร์ใหม่

macbookpro3:terraform-google-cloud-storage user$ make docker_test_prepare
docker run --rm -it \
                -e SERVICE_ACCOUNT_JSON \
                -e TF_VAR_org_id \
                -e TF_VAR_folder_id \
                -e TF_VAR_billing_account \
                -v /Users/cft/terraform-google-cloud-storage:/workspace \
                gcr.io/cloud-foundation-cicd/cft/developer-tools:0.8.0 \
                /usr/local/bin/execute_with_credentials.sh prepare_environment
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Initializing modules...

Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.google-beta: version = "~> 3.9"
* provider.null: version = "~> 2.1"
* provider.random: version = "~> 2.2"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
module.project.module.project-factory.null_resource.preconditions: Refreshing state... [id=8723188031607443970]
module.project.module.project-factory.null_resource.shared_vpc_subnet_invalid_name[0]: Refreshing state... [id=5109975723938185892]
module.project.module.gsuite_group.data.google_organization.org[0]: Refreshing state...
module.project.module.project-factory.random_id.random_project_id_suffix: Refreshing state... [id=rnk]
module.project.module.project-factory.google_project.main: Refreshing state... [id=<project-id>]
module.project.module.project-factory.google_project_service.project_services[0]: Refreshing state... [id=<project-id>/storage-api.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[1]: Refreshing state... [id=<project-id>/cloudresourcemanager.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[2]: Refreshing state... [id=<project-id>/compute.googleapis.com]
module.project.module.project-factory.data.null_data_source.default_service_account: Refreshing state...
module.project.module.project-factory.google_service_account.default_service_account: Refreshing state... [id=projects/ci-cloud-storage-ae79/serviceAccounts/project-service-account@<project-id>.iam.gserv
iceaccount.com]
module.project.module.project-factory.google_project_service.project_services[3]: Refreshing state... [id=<project-id>/serviceusage.googleapis.com]
module.project.module.project-factory.null_resource.delete_default_compute_service_account[0]: Refreshing state... [id=3576396874950891283]
google_service_account.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_service_account_key.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com/keys/351009a1e011e88049ab2097994d1c627a61
6961]
google_project_iam_member.int_test[1]: Refreshing state... [id=<project-id>/roles/iam.serviceAccountUser/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_project_iam_member.int_test[0]: Refreshing state... [id=<project-id>/roles/storage.admin/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

project_id = <test-project-id>
sa_key = <sensitive>
Found test/setup/make_source.sh. Using it for additional explicit environment configuration.

ตอนนี้คุณได้สร้างโปรเจ็กต์ทดสอบซึ่งอ้างอิงโดย project_id ตามที่คุณเห็นบนเอาต์พุตคอนโซล ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และการทดสอบแล้ว

5. เพิ่มฟีเจอร์ใหม่ลงในโมดูล CFT

ตอนนี้สภาพแวดล้อมการพัฒนาและการทดสอบได้รับการตั้งค่าแล้ว มาเริ่มเพิ่ม "silly_label" กัน ลงในโมดูล CFT ของ google-cloud-storage

ตรวจสอบว่าคุณอยู่ใน terraform-google-cloud-storage และเปิดไฟล์ main.tf ตามที่คุณเห็นด้านล่างในโครงสร้างโฟลเดอร์

17f2d3b9893be853.png

ตั้งแต่ "silly_label" เป็นป้ายกำกับ คุณจะเพิ่มคุณลักษณะในบรรทัดที่ 27 ในตัวแปร "labels" ใน main.tf ดังที่แสดงด้านล่าง

terraform-google-cloud-storage/main.tf

resource "google_storage_bucket" "buckets" {
 <...>
 storage_class = var.storage_class
 // CODELAB:Add silly label in labels variable
 labels        = merge(var.labels, { name = replace("${local.prefix}${lower(element(var.names, count.index))}", ".", "-") }, { "silly" = var.silly_label })
 force_destroy = lookup(
 <...>
}

ในขั้นตอนนี้ ให้เพิ่มตัวแปร silly_label ในตัวแปรตัวแปร เมื่อเห็นในโครงสร้างโฟลเดอร์ด้านบน

คัดลอกและวางโค้ดด้านล่างลงในบรรทัดที่ 29 ในตัวแปร และตรวจสอบว่ามีอักขระบรรทัดใหม่ด้านบนและด้านล่างบล็อกตัวแปรที่คุณเพิ่ม

terraform-google-cloud-storage/variables.tf

variable "names" {
 description = "Bucket name suffixes."
 type        = list(string)
}

// CODELAB: Add "silly_label" variable to variables.tf between "names" and "location"
variable "silly_label" {
 description = "Sample label for bucket."
 type        = string
}

variable "location" {
 description = "Bucket location."
 default     = "EU"
}

6. เพิ่มฟีเจอร์ใหม่ในตัวอย่างที่เก็บข้อมูลของพื้นที่เก็บข้อมูล

คุณเพิ่มฟีเจอร์ใน main.tf ของโมดูลแล้ว และตอนนี้ คุณจะได้ทดสอบฟีเจอร์ที่เพิ่มเข้ามาผ่านตัวอย่าง

ป้ายกำกับ "silly_label" จะต้องเพิ่มลงในตัวอย่าง/multiple-buckets/main.tf

ตัวอย่างนี้จะใช้โดยอุปกรณ์ติดตั้งในขั้นตอนถัดไปเพื่อทำการทดสอบการผสานรวม

คัดลอกและวางบรรทัด silly_label ของตัวแปรด้านล่างไปยังบรรทัดที่ 27 ใน main.tf ที่ terraform-google-cloud-storage/examples/multiple-buckets/ ตามที่เห็นในโครงสร้างโฟลเดอร์

408cb1365b2a0793.png

terraform-google-cloud-storage/examples/multiple-buckets/main.tf

module "cloud_storage" {
 <...>
 // CODELAB: Add "silly_label" as an example to main.tf.
 silly_label        = "awesome"

 <..>
}

7. เขียนการทดสอบ Inspec เพื่อตรวจสอบฟีเจอร์

คุณเพิ่มฟีเจอร์ลงใน main.tf ของโมดูลแล้ว จากนั้นเพิ่มฟีเจอร์ลงในตัวอย่าง Multiple_buckets เพื่อทดสอบผ่านอุปกรณ์ คุณต้องทดสอบฟีเจอร์ผ่านการทดสอบการผสานรวม InSpec ที่เขียนใน Ruby

คุณจะเพิ่มการทดสอบใหม่ในไฟล์ gsutil.rb ซึ่งอยู่ในโครงสร้างโฟลเดอร์ด้านล่าง

b2bfeb203477e0c8.png

คุณเพิ่ม "silly_label" ในที่เก็บข้อมูลทั้งหมดที่กำลังสร้างผ่านโมดูล Multiple_buckets และตอนนี้คุณต้องเขียนการทดสอบเพื่อทดสอบฟีเจอร์ใหม่

ในโค้ดด้านล่าง คุณจะได้รับป้ายกำกับของที่เก็บข้อมูลแต่ละชุดผ่านคำสั่ง gsutil จากนั้นคุณจะตรวจสอบผลลัพธ์ที่แสดงผลจากคำสั่ง

terraform-google-cloud-storage/test/integration/multiple-buckets/controls/gsutil.rb

control "gsutil" do
 <..>

# CODELAB: Copy paste the below test in gsutil.rb to test silly_label feature.

# command to get the labels for bucket_1
describe command("gsutil label get gs://#{attribute("names_list")[0]}") do
   //check if the command gave a valid response
   its(:exit_status) { should eq 0 }
   its(:stderr) { should eq "" }

   //parse the command's output into JSON
   let!(:data) do
     if subject.exit_status == 0
         JSON.parse(subject.stdout)
     else
         {}
     end
   end

   # check if bucket_1 has the new "silly" label with the value "awesome"
   describe "bucket_1" do
   it "has label" do
       data.each do |bucket|
           expect(data["silly"]).to include("awesome")
       end
     end
   end
 end

8. ดำเนินการทดสอบการผสานรวมใน CFT

การทดสอบการผสานรวม

การทดสอบการผสานรวมใช้เพื่อตรวจสอบลักษณะการทำงานของโมดูลรูท โมดูลย่อย และโมดูลตัวอย่าง การเพิ่ม การเปลี่ยนแปลง และการแก้ไขควรมีการทดสอบด้วย

การทดสอบการผสานรวมจะดำเนินการโดยใช้ Kitchen, Kitchen-Terraform และ InSpec เครื่องมือเหล่านี้มีแพ็กเกจอยู่ในอิมเมจ Docker เพื่อความสะดวก

กลยุทธ์ทั่วไปสำหรับการทดสอบเหล่านี้คือการตรวจสอบลักษณะการทำงานของโมดูลตัวอย่างเพื่อให้แน่ใจว่าโมดูลรูท โมดูลย่อย และโมดูลตัวอย่างทำงานอย่างถูกต้องทั้งหมด

ในการเรียกใช้แบบอินเทอร์แอกทีฟ คุณจะเรียกใช้แต่ละขั้นตอนผ่านคำสั่งหลายรายการ

  1. เรียกใช้ make docker_run เพื่อเริ่มต้นการทดสอบคอนเทนเนอร์ Docker ในโหมดอินเทอร์แอกทีฟ

Make เป็นเครื่องมืออัตโนมัติของบิลด์ที่จะสร้างโปรแกรมสั่งการและไลบรารีจากซอร์สโค้ดโดยอัตโนมัติด้วยการอ่านไฟล์ที่เรียกว่า Makefiles ซึ่งระบุวิธีดึงข้อมูลโปรแกรมเป้าหมาย เมื่อคุณทำการเปลี่ยนแปลงไฟล์ ระบบจะอัปเดตคอนเทนเนอร์ Docker โดยอัตโนมัติ

เมื่อเรียกใช้ make docker_run คุณจะสร้างพื้นที่ทำงานในคอนเทนเนอร์ Docker และเปิดใช้งานข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการของคุณ ระบบจะใช้พื้นที่ทำงานในขั้นตอนถัดไปเพื่อทำการทดสอบ

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. เรียกใช้ kitchen_do list เพื่อแสดงรายการอินสแตนซ์ทั้งหมดในพื้นที่ทำงานซึ่งมีการทดสอบการผสานรวม
     You will see the below output in your terminal.
    
[root@<CONTAINER_ID> workspace]# kitchen_do list
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
Instance                  Driver     Provisioner  Verifier   Transport  Last Action  Last Error
multiple-buckets-default  Terraform  Terraform    Terraform  Ssh        Verified     <None>
  1. เรียกใช้ kitchen_do create <EXAMPLE_NAME> เพื่อเริ่มต้นไดเรกทอรีการทำงานสำหรับโมดูลตัวอย่าง

ขั้นตอนนี้จะเริ่มต้น Kitchen แล้วเริ่ม Terraform ในพื้นที่ทำงาน

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

[root@<CONTAINER_ID> workspace]# kitchen_do create multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Creating <multiple-buckets-default>...
       Terraform v0.12.12
       + provider.google v3.10.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from www.terraform.io/downloads.html
$$$$$$ Running command `terraform init -input=false -lock=true -lock-timeout=0s  -upgrade -force-copy -backend=true  -get=true -get-plugins=true -verify-plugins=true` in directory /workspace/test/fi
xtures/multiple_buckets
       Upgrading modules...
       - example in ../../../examples/multiple_buckets
       - example.cloud_storage in ../../..
       
       Initializing the backend...
       
       Initializing provider plugins...
       - Checking for available provider plugins...
       - Downloading plugin for provider "google" (hashicorp/google) 2.18.1...
       - Downloading plugin for provider "random" (hashicorp/random) 2.2.1...
       
       Terraform has been successfully initialized!
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
       Finished creating <multiple-buckets-default> (0m11.01s).
-----> Kitchen is finished. (0m12.62s)
  1. เรียกใช้ kitchen_do converge <EXAMPLE_NAME> เพื่อใช้โมดูลตัวอย่าง

ขั้นตอนนี้จะใช้พื้นที่ทำงาน terraform ที่สร้างขึ้นในขั้นตอนก่อนหน้ากับโปรเจ็กต์ GCP ที่สร้างขึ้นก่อนหน้านี้ใน Codelab

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

[root@<CONTAINER_ID> workspace]# kitchen_do converge multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<YOUR_PROJECT_ID>.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Converging <multiple-buckets-default>...
       Terraform v0.12.20
       + provider.google v3.9.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from https://www.terraform.io/downloads.html
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
$$$$$$ Running command `terraform get -update` in directory /workspace/test/fixtures/multiple_buckets
       - example in ../../../examples/multiple_buckets
       - example.cloud_storage in ../../..
$$$$$$ Running command `terraform validate   ` in directory /workspace/test/fixtures/multiple_buckets
       Success! The configuration is valid.
       
$$$$$$ Running command `terraform apply -lock=true -lock-timeout=0s -input=false -auto-approve=true  -parallelism=10 -refresh=true  ` in directory /workspace/test/fixtures/multiple_buckets
       random_pet.main: Creating...
       random_pet.main: Creation complete after 0s [id=<BUCKET-ID>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Creating...
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Creating...
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Creation complete after 3s [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Creation complete after 3s [id=<BUCKET-ID-02>]
       
       Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
       
       Outputs:
       
       names = {
         "one" = "<BUCKET-ID-01>"
         "two" = "<BUCKET-ID-02>"
       }
       names_list = [
         "<BUCKET-NAME-01>",
         "<BUCKET-NAME-02>",
       ]
       project_id = ci-cloud-storage-ae79
       Finished converging <multiple-buckets-default> (0m7.17s).
-----> Kitchen is finished. (0m8.77s)
  1. เรียกใช้ kitchen_do verify <EXAMPLE_NAME> เพื่อทดสอบโมดูลตัวอย่าง

ขั้นตอนนี้จะทำงานในไฟล์ gsutils.rb ซึ่งมีการทดสอบสำหรับโมดูล Multiple_buckets การทดสอบแต่ละรายการมีคำสั่ง gsutil ซึ่งจะดำเนินการกับโปรเจ็กต์ทดสอบที่คุณสร้างขึ้นก่อนหน้านี้โดยใช้การตั้งค่าข้อมูลเข้าสู่ระบบของบัญชีบริการ

หากคุณพบข้อผิดพลาด คุณจะเห็นสิ่งที่คาดหวังและสิ่งที่ได้รับโดยคำสั่งสำหรับการทดสอบ

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

multiple_buckets local: Verifying

Profile: multiple_buckets
Version: (not specified)
Target:  local://

  ✔  gsutil: gsutil
     ✔  Command: `gsutil ls -p <PROJECT_ID>` exit_status should eq 0
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stderr should eq ""
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stdout should include "multiple-buckets-mzgy-eu-one"
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stdout should include "<BUCKET-ID-01>"
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` stdout should include "Enabled: True"
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` stderr should eq ""
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` stdout should include "Enabled: False"
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` bucket_1 has label
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` stderr should eq ""
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` bucket_2 has label
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq "NEARLINE"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq "SetStorageClass"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq 10
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq false
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq "NEARLINE"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq "SetStorageClass"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq 10
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq false
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` stderr should eq ""


Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
Test Summary: 30 successful, 0 failures, 0 skipped
       Finished verifying <multiple-buckets-default> (0m8.83s).
-----> Kitchen is finished. (0m16.61s)
  1. เรียกใช้ kitchen_do destroy <EXAMPLE_NAME> เพื่อทำลายสถานะโมดูลตัวอย่าง

ขั้นตอนนี้จะทำลายพื้นที่ทำงานที่คุณสร้างขึ้นในขั้นตอนข้างต้น ขั้นตอนนี้จะทำลายที่เก็บข้อมูล GCS ที่สร้างขึ้นในโปรเจ็กต์ รวมถึงป้ายกำกับที่คุณเพิ่มไว้ในโมดูล GCS

คุณดูเอาต์พุตด้านล่างได้ในเทอร์มินัล

[root@<CONTAINER_ID> workspace]# kitchen_do destroy multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [ci-cloud-storage@ci-cloud-storage-54ab.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Destroying <multiple-buckets-default>...
       Terraform v0.12.12
       + provider.google v3.10.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from www.terraform.io/downloads.html
$$$$$$ Running command `terraform init -input=false -lock=true -lock-timeout=0s  -force-copy -backend=true  -get=true -get-plugins=true -verify-plugins=true` in directory /workspace/test/fixtures/mu
ltiple_buckets
       Initializing modules...
       
       Initializing the backend...
       
       Initializing provider plugins...
       
       Terraform has been successfully initialized!
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
$$$$$$ Running command `terraform destroy -auto-approve -lock=true -lock-timeout=0s -input=false  -parallelism=10 -refresh=true  ` in directory /workspace/test/fixtures/multiple_buckets
       random_string.prefix: Refreshing state... [id=mzgy]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Refreshing state... [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Refreshing state... [id=<BUCKET-ID-02>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Destroying... [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Destroying... [id=<BUCKET-ID-02>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Destruction complete after 1s
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Destruction complete after 2s
       random_string.prefix: Destroying... [id=mzgy]
       random_string.prefix: Destruction complete after 0s
       
       Destroy complete! Resources: 3 destroyed.
$$$$$$ Running command `terraform workspace select default` in directory /workspace/test/fixtures/multiple_buckets
       Switched to workspace "default".
$$$$$$ Running command `terraform workspace delete kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
       Deleted workspace "kitchen-terraform-multiple-buckets-default"!
       Finished destroying <multiple-buckets-default> (0m6.49s).
-----> Kitchen is finished. (0m8.10s)

9. การสร้างเอกสารสำหรับอินพุตและเอาต์พุต

ตารางอินพุตและเอาต์พุตใน README ของโมดูลรูท โมดูลย่อย และโมดูลตัวอย่างจะสร้างขึ้นโดยอัตโนมัติตาม variables และ outputs ของโมดูลที่เกี่ยวข้อง ตารางเหล่านี้ต้องรีเฟรชหากมีการเปลี่ยนแปลงอินเทอร์เฟซโมดูล

เรียกใช้:

make generate_docs
# This will generate new Inputs and Outputs tables

10. ดำเนินการทดสอบ Lint ใน CFT

โปรแกรมวิเคราะห์โค้ดคือเครื่องมือที่วิเคราะห์ซอร์สโค้ดเพื่อระบุข้อผิดพลาดในการเขียนโปรแกรม ข้อบกพร่อง ข้อผิดพลาดด้านสไตล์ และโครงสร้างที่น่าสงสัย

ไฟล์จำนวนมากในที่เก็บสามารถแปลงรูปแบบเป็นโค้ดหรือจัดรูปแบบเพื่อรักษามาตรฐานคุณภาพ โปรดใช้การทดสอบ Lint เพื่อให้ได้คุณภาพใน CFT

เรียกใช้:

make docker_test_lint
# This will run all lint tests on your repo

11. การส่งการประชาสัมพันธ์ใน GitHub

ตอนนี้คุณได้เปลี่ยนโค้ดในเครื่องและทดสอบโค้ดผ่านการทดสอบการผสานรวมแล้ว คุณคงจะต้องการเผยแพร่โค้ดนี้ไปยังที่เก็บหลัก

หากต้องการทำให้โค้ดพร้อมใช้งานในที่เก็บหลัก คุณจะต้องทำการเปลี่ยนแปลงโค้ดกับสาขาและพุชไปยังที่เก็บหลัก หากต้องการเพิ่มโค้ดไปยังที่เก็บหลักที่คุณแยกตอนเริ่ม Codelab คุณจะต้องเพิ่มคำขอพุล (PR) ในที่เก็บหลักหลังจากคอมมิตโค้ดไปยังที่เก็บแล้ว

เมื่อคุณประชาสัมพันธ์ ผู้ดูแลระบบที่เก็บจะได้รับแจ้งให้ตรวจสอบการเปลี่ยนแปลงโค้ดที่เสนอ นอกจากนี้ คุณยังเพิ่มผู้ใช้รายอื่นๆ เป็นผู้ตรวจสอบเพื่อรับความคิดเห็นเกี่ยวกับการเปลี่ยนแปลงโค้ดได้ด้วย ฝ่ายประชาสัมพันธ์จะทริกเกอร์ Cloud Build ซึ่งจะทำการทดสอบในที่เก็บ

ผู้ตรวจสอบโค้ดจะแสดงความคิดเห็นเกี่ยวกับโค้ดของคุณและขอให้คุณทำการแก้ไขหากมีสิ่งใดจำเป็นต้องเปลี่ยนแปลงตามแนวทางปฏิบัติแนะนำและเอกสารประกอบ โดยอิงจากการเปลี่ยนแปลงโค้ดของคุณ ผู้ดูแลระบบจะตรวจสอบการเปลี่ยนแปลงโค้ดเพื่อให้แน่ใจว่าโค้ดของคุณสอดคล้องกับที่เก็บ และอาจขอให้คุณทำการเปลี่ยนแปลงบางอย่างอีกครั้งก่อนที่จะรวมโค้ดไว้ในที่เก็บหลัก

ทำตามขั้นตอนต่อไปนี้เพื่อคอมมิตโค้ดไปยังสาขาที่แยกออกและพุชโค้ดไปยัง Branch ที่ฟอร์ก

  1. ขั้นตอนแรกคือการเพิ่มไฟล์ที่มีการเปลี่ยนแปลงลงในที่เก็บในเครื่อง
$ git add main.tf
$ git add README.md
$ git add variables.tf
$ git add examples/multiple-buckets/main.tf
$ git add test/integration/multiple-buckets/controls/gsutil.rb
# The ‘git add' command adds the file in the local repository and 
# stages the file for commit. To unstage a file, use git reset HEAD YOUR-FILE
  1. ไฟล์ของคุณเสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปคุณจะต้องดำเนินการเปลี่ยนแปลง
$ git commit -m "First CFT commit"
# This will commit the staged changes and prepares them to be pushed 
# to a remote repository. To remove this commit and modify the file, 
# use 'git reset --soft HEAD~1' and commit and add the file again.
  1. พุชการเปลี่ยนแปลงที่คอมมิตในที่เก็บในเครื่องไปยัง GitHub เพื่อสร้างคำขอพุล (PR)
$ git push -u origin master
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin

การเปลี่ยนแปลงโค้ดของคุณพร้อมสำหรับการดึงคำขอแล้ว

ทำตามขั้นตอนต่อไปนี้เพื่อประชาสัมพันธ์ไปยังที่เก็บterraform-google-modules/terraform-google-cloud-storage

  1. ไปที่หน้าหลักของที่เก็บในเว็บเบราว์เซอร์
  2. ในเมนู Branch ให้เลือก Fork ที่มีคอมมิต
  3. ทางด้านขวาของ "สาขา" ให้คลิก "การดึงคำขอใหม่"

40087ce52ee5ed35.png

  1. ใช้ "ฐาน" เมนูแบบเลื่อนลงเพื่อเลือกสาขาที่คุณต้องการผสานการเปลี่ยนแปลงเข้าไป ซึ่งโดยปกติจะเป็น "หลัก" เนื่องจากคุณได้คอมมิตการเปลี่ยนแปลงโค้ดกับ Fork แล้ว
  2. ป้อนชื่อและคำอธิบายคำขอดึงเพื่ออธิบายการเปลี่ยนแปลงโค้ด ใช้ข้อความที่กระชับมากที่สุดเท่าที่จะทำได้
  3. ในการสร้างคำขอพุลที่พร้อมตรวจสอบ ให้คลิก "สร้างคำขอพุล"

a9e70a2ec9653cd7.png

  1. คุณจะเห็นทริกเกอร์ Cloud Build ทำงานอยู่ ซึ่งมีการทริกเกอร์เนื่องจาก PR

คุณพุชการเปลี่ยนแปลงโค้ดครั้งแรกไปยังสาขาที่แยกเป็น 2 ส่วนและเพิ่ม CFT PR แรกไปยังสาขาหลักเรียบร้อยแล้ว

12. ขอแสดงความยินดี

ขอแสดงความยินดี คุณเพิ่มฟีเจอร์ในโมดูล CFT เรียบร้อยแล้วและส่งเอกสารประชาสัมพันธ์เพื่อรับการตรวจสอบ

คุณเพิ่มฟีเจอร์ลงในโมดูล CFT, ทดสอบในเครื่องผ่านตัวอย่าง และทำการทดสอบก่อนที่จะยืนยันโค้ดไปยัง GitHub สุดท้าย คุณได้ยื่นการประชาสัมพันธ์ให้ตรวจสอบ และรวมตัวเป็น CFT ในขั้นสุดท้าย

ตอนนี้คุณก็ได้ทราบขั้นตอนสำคัญในการเริ่มต้นใช้งาน Cloud Foundation Toolkit แล้ว