總覽
Terraform 能讓您以安全且可預測的方式建立、變更與改良基礎架構。Terraform 是開放原始碼工具,能將 API 編碼為陳述式設定檔。這類設定檔可以分享給團隊成員,也能視為程式碼處理,並進行編輯、審查和版本管理。
在這個實驗室中,您將建立 Terraform 設定與模組來自動部署 Google Cloud 基礎架構。具體來說,您將部署自動模式網路,以及該網路的防火牆規則和兩個 VM 執行個體,如這張圖表所示:
目標
在這個實驗室中,您將瞭解如何執行下列工作:
建立自動模式網路設定
建立防火牆規則設定
建立 VM 執行個體模組
建立及部署設定
驗證設定的部署作業
設定
每個實驗室都會提供新的 Google Cloud 專案和一組資源,讓您在時限內免費使用。
按一下「Start Lab」 按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」 窗格會顯示下列項目:
「Open Google Cloud console」 按鈕
剩餘時間
必須在這個研究室中使用的臨時憑證
完成這個實驗室所需的其他資訊 (如有)
點選「Open Google Cloud console」 ;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」 。
接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」 頁面。
提示 :您可以在不同的視窗中並排開啟分頁。
注意 :如果頁面中顯示「選擇帳戶」 對話方塊,請點選「使用其他帳戶」 。
如有必要,請將下方的 Username 貼到「登入」 對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」 窗格找到 Username 。
點選「下一步」 。
複製下方的 Password ,並貼到「歡迎使用」 對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」 窗格找到 Password 。
點選「下一步」 。
重要事項 :請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意 :如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
按過後續的所有頁面:
接受條款及細則。
由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意: 如要查看列出 Google Cloud 產品和服務的選單,請點選左上角的「導覽選單」 ,或在「搜尋」 欄位輸入服務或產品名稱。
工作 1:設定 Terraform 和 Cloud Shell
在這項工作中,您將設定 Cloud Shell 環境,以便使用 Terraform。
安裝 Terraform
Terraform 現已整合至 Cloud Shell,請確認目前安裝版本。
在 Cloud 控制台,點選「啟用 Cloud Shell」 圖示 。
如果出現提示訊息,請點選「繼續」 。
執行下列指令,確認 Terraform 是否安裝成功:
terraform --version
輸出內容應如下所示:
Terraform v1.5.7
注意事項 :如果收到 Terraform 版本過舊的警告訊息,請不必擔心,本實驗室的操作說明適用於 Terraform v1.5.7 以上版本。如要下載 Terraform 的最新版本,請前往 Terraform 網站 。在所有支援平台與架構上,Terraform 是以二進位檔套件發布;Cloud Shell 則是使用 Linux 64 位元。
執行下列指令來建立 Terraform 設定目錄:
mkdir tfinfra
在 Cloud Shell 中點選「開啟編輯器」圖示 。
注意事項 :如果系統顯示「第三方 Cookie 已停用,因此無法載入程式碼編輯器」 ,請點選「在新視窗中開啟」 ,程式碼編輯器將在新分頁中開啟。返回原始分頁並點選「開啟終端機」 ,然後切換回「程式碼編輯器」分頁。在這個分頁中,您需要定期切換回 Cloud Shell 終端機。
在程式碼編輯器的左側窗格中,展開 tfinfra 資料夾。
初始化 Terraform
Terraform 會使用外掛程式型架構,來支援可用的多個基礎架構和服務供應商。每個「供應商」均為自己專屬的封裝二進位檔,與 Terraform 本身分開發布。請將 Google 設為供應商來初始化 Terraform。
如要在 tfinfra 資料夾中建立新檔案,請對該資料夾按一下滑鼠右鍵
,然後點選「New File」 。
將新檔案命名為 provider.tf 後開啟檔案。
將下列程式碼複製並貼到 provider.tf
中:
provider "google" {}
依序點選「File」>「Save」 來儲存 provider.tf 。
執行下列指令來初始化 Terraform:
cd tfinfra
terraform init
現在可以在 Cloud Shell 使用 Terraform 了。
工作 2:建立 mynetwork 及其資源
在這項工作中,您將建立自動模式網路 mynetwork ,以及其防火牆規則和兩個 VM 執行個體 (mynet_vm_1 和 mynet_vm_2 )。
設定 mynetwork
建立新設定並定義 mynetwork 。
如要在 tfinfra 中建立新檔案,請對該資料夾按一下滑鼠右鍵
,然後點選「New File」 。
將新檔案命名為 mynetwork.tf 後開啟檔案。
複製下列程式碼集並貼到 mynetwork.tf
中:
# Create the mynetwork network
resource [RESOURCE_TYPE] "mynetwork" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
在設定 Google Cloud 資源時,這個基礎範本是很好的起點:name 欄位可用來命名資源;type 欄位則是用來指定要建立的 Google Cloud 資源。您也可以定義屬性,但對部分資源來說,屬性並非必要資訊。
在 mynetwork.tf
中,將 [RESOURCE_TYPE]
替換為 "google_compute_network"
(須保留引號)。
注意事項 :google_compute_network 資源為虛擬私有雲網路。如需可用資源相關資訊,請參閱 Google Cloud 供應商說明文件 ;如要進一步瞭解這項資源,請參閱 Terraform 說明文件 。
在 mynetwork.tf
中,將 [RESOURCE_NAME]
替換為 "mynetwork"
(須保留引號)。
在 mynetwork.tf
中新增下列屬性:
auto_create_subnetworks = "true"
根據定義,自動模式網路會在每個區域自動建立子網路,因此您需要將 auto_create_subnetworks 設為 true 。
確認 mynetwork.tf 檔案是否如下所示:
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
依序點選「File」 >「Save」 來儲存 mynetwork.tf
。
設定防火牆規則
定義防火牆規則,以允許 HTTP、SSH、遠端桌面協定和 ICMP 流量通過 mynetwork。
在 mynetwork.tf
中新增下列程式碼集:
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource [RESOURCE_TYPE] "mynetwork-allow-http-ssh-rdp-icmp" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
在 mynetwork.tf
中,將 [RESOURCE_TYPE]
替換為 "google_compute_firewall"
(須保留引號)。
注意事項 :google_compute_firewall 資源為防火牆規則,如要進一步瞭解這項資源,請參閱 Terraform 說明文件 。
在 mynetwork.tf
中,將 [RESOURCE_NAME]
替換為 "mynetwork-allow-http-ssh-rdp-icmp"
(須保留引號)。
在 mynetwork.tf
中新增下列屬性:
network = google_compute_network.mynetwork.self_link
注意事項 :這項防火牆規則依附於網路上,因此您須使用 google_compute_network.mynetwork.self_link 參照,指示 Terraform 按相依順序解析這些資源,在這個案例中,系統會先建立網路,再建立防火牆規則。
在 mynetwork.tf
中新增下列屬性:
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
allow 規則清單會指定允許的通訊協定和通訊埠。
確認 mynetwork.tf
檔案是否如下所示:
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
依序點選「File」 >「Save」 來儲存 mynetwork.tf 。
設定 VM 執行個體
建立 VM 執行個體模組來定義 WM 執行個體。模組是指資料夾中可重複使用的設定。在這個實驗室中,您將使用建立好的模組定義兩個 VM 執行個體。
如要在 tfinfra 中建立新檔案,請選取 tfinfra 資料夾,然後依序點選「File」 >「New Folder」 。
將新資料夾命名為 instance 。
如要在 instance 中建立新檔案,請對該資料夾按一下滑鼠右鍵
,然後點選「New File」 。
將新檔案命名為 main.tf 後開啟檔案。
您會在 Cloud Shell 中看到下列資料夾架構:
複製下列程式碼集並貼到 main.tf 中:
resource [RESOURCE_TYPE] "vm_instance" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
在 main.tf
中,將 [RESOURCE_TYPE]
替換為 "google_compute_instance"
(須保留引號)。
注意事項 :google_compute_instance 資源為 Compute Engine 執行個體。如要進一步瞭解這項資源,請參閱 Terraform 說明文件 。
在 main.tf
中,將 [RESOURCE_NAME]
替換為 "${var.instance_name}"
(須保留引號)。
您會使用此模組定義兩個 VM 執行個體,因此須將執行個體名稱定義為輸入變數。這項操作可讓您透過 mynetwork.tf 控制變數名稱。如要進一步瞭解輸入變數,請參閱 Terraform:「定義輸入變數指南」 。
在 main.tf
中新增下列屬性:
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
這些屬性會將執行個體的可用區和機型定義為輸入變數。
在 main.tf
中新增下列屬性:
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
這項屬性會定義開機磁碟,以使用 Debian 11 OS 映像檔。兩個 VM 執行個體會使用相同的映像檔,因此您可以在模組中採用硬式編碼的方式寫入此屬性。
在 main.tf
中新增下列屬性:
network_interface {
network = "${var.instance_network}"
access_config {
# Allocate a one-to-one NAT IP to the instance
}
}
這項屬性會將網路名稱提供為輸入變數,藉此定義網路介面和存取設定。將存取設定留空會產生臨時外部 IP 位址 (此區段在本實驗室中為必填)。如要建立只有一個內部 IP 位址的執行個體,請移除「access_config」區段。詳情請參閱 Terraform 說明文件 。
確認 main.tf
包含括號 {}
部分是否如下所示:
resource "google_compute_instance" "vm_instance" {
name = "${var.instance_name}"
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "${var.instance_network}"
access_config {
# Allocate a one-to-one NAT IP to the instance
}
}
}
依序點選「File」 >「Save」 來儲存 main.tf。
如要在 instance 中建立新檔案,請對該資料夾按一下滑鼠右鍵
,然後點選「New File」 。
將新檔案命名為 variables.tf 後開啟檔案。
在 variables.tf
中定義 4 個輸入變數。
variable "instance_name" {}
variable "instance_zone" {}
variable "instance_type" {
default = "e2-micro"
}
variable "instance_network" {}
為 instance_type 提供預設值,即可將變數設為選填。instance_name 、instance_zone 和 instance_network 為必填區段,您需要在 mynetwork.tf
進行定義。
依序點選「File」 >「Save」 來儲存 variables.tf。
在 mynetwork.tf
新增下列 VM 執行個體:
# Create the mynet-vm-1 instance
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# Create the mynet-vm-2" instance
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
這些資源會使用 instance 資料夾中的模組,並提供名稱、可用區和網路做為輸入內容。這些執行個體依附於虛擬私有雲網路上,因此您須使用 google_compute_network.mynetwork.self_link 參照,指示 Terraform 按相依順序解析這些資源,在這個案例中,系統會先建立網路,再建立執行個體。
注意事項 :編寫 Terraform 模組的好處在於,模組可在許多不同的設定中重複使用。您也可以使用 Terraform 模組資料庫 中的現有模組,而不必自行編寫。
依序點選「File」 >「Save」 來儲存 mynetwork.tf
。
確認 mynetwork.tf
包含括號 {}
部分是否如下所示:
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
# Create the mynet-vm-1 instance
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# Create the mynet-vm-2" instance
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
建立 mynetwork 及其資源
現在可以套用 mynetwork 設定了。
如要將 Terraform 設定檔重新編寫為標準格式,請執行下列指令:
terraform fmt
輸出內容應如下所示:
mynetwork.tf
注意事項 :如果收到錯誤訊息,請返回先前步驟,確認設定是否與實驗室操作說明相符。如無法解決設定中的問題,請下載並參考下列已完成的設定:
執行下列指令來初始化 Terraform:
terraform init
輸出內容應如下所示:
Initializing modules...
- mynet-vm-2 in instance
- mynet-vm-2 in instance
...
Terraform has been successfully initialized!
注意事項: 如果發生錯誤,請回到先前的步驟,確認資料夾/檔案的結構是否正確無誤。如無法解決設定中的問題,請點選上方連結,下載並參考已完成的設定。待問題解決後,再重新執行先前的指令。
如要建立執行計畫,請執行下列指令:
terraform plan
輸出內容應如下所示:
...
Plan: 4 to add, 0 to change, 0 to destroy.
...
Terraform 確定了需新增下列 4 項資源:
名稱
說明
mynetwork
虛擬私有雲網路
mynetwork-allow-http-ssh-rdp-icmp
允許 HTTP、SSH、RDP 和 ICMP 的防火牆規則
mynet-vm-2
中的 VM 執行個體
mynet-vm-2
中的 VM 執行個體
如要套用所需變更,請執行下列指令:
terraform apply
如要確認已安排的操作,請輸入:
yes
輸出內容應如下所示:
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
點選「Check my progress」 來確認目標已達成。
建立 mynetwork 及其資源
注意事項 :如果您在執行過程中收到錯誤訊息,請返回先前步驟,確認資料夾/檔案結構是否正確無誤。如無法解決設定中的問題,請點選上方連結,下載並參考已完成的設定。待問題解決後,再重新執行先前的指令。
工作 3:驗證部署作業
在 Google Cloud 控制台,驗證先前建立的資源。
在 Cloud 控制台驗證網路
前往 Google Cloud 控制台的「導覽選單」 ,依序點選「虛擬私有雲網路」 >「虛擬私有雲網路」 。
查看 mynetwork 虛擬私有雲網路及各區域的子網路。
從「導覽選單」 依序點選「虛擬私有雲網路」 >「防火牆」 。
依「網路」將防火牆規則排序 。
查看 mynetwork 的 mynetwork-allow-http-ssh-rdp-icmp 防火牆規則。
在 Cloud 控制台中驗證 VM 執行個體
從「導覽選單」 依序點選「Compute Engine」 >「VM 執行個體」 。
查看 mynet-vm-1 和 mynet-vm-2 執行個體。
記下 mynet-vm-2 的內部 IP 位址。
在 mynet-vm-1 的資料列,點選「SSH」 啟動終端機並連線。
為測試連至 mynet-vm-2 內部 IP 位址的連線能力,請在 SSH 終端機執行下列指令 (將 mynet-vm-2 的內部 IP 位址替換為稍早記下的值):
ping -c 3 <在這裡輸入 mynet-vm-2 的內部 IP>
注意事項: 兩個 VM 執行個體位於同一個網路,而且防火牆規則允許 ICMP 流量,因此應能順利連線!
工作 4:回顧
在這個實驗室中,您建立了 Terraform 設定與模組來自動部署 Google Cloud 基礎架構。當設定有所變動,Terraform 可以建立遞增的執行計畫,讓您逐步建立整體化設定。
執行個體模組允許您為多個資源重複使用相同的資源設定,同時提供屬性做為輸入變數。您所建立的設定與模組,均可做為未來部署作業的基礎。
關閉研究室
如果您已完成研究室,請按一下「End Lab」(關閉研究室) 。Google Cloud Skills Boost 會移除您使用的資源,並清除所用帳戶。
您可以針對研究室的使用體驗評分。請選取合適的星級評等並提供意見,然後按一下「Submit」(提交) 。
星級評等代表您的滿意程度:
1 星 = 非常不滿意
2 星 = 不滿意
3 星 = 普通
4 星 = 滿意
5 星 = 非常滿意
如果不想提供意見回饋,您可以直接關閉對話方塊。
如有任何想法、建議或指教,請透過「Support」(支援) 分頁提交。
Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。