arrow_back

使用 Terraform 自動部署基礎架構

登录 加入
访问 700 多个实验和课程

使用 Terraform 自動部署基礎架構

实验 1 小时 universal_currency_alt 5 积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

總覽

Terraform 能讓您以安全且可預測的方式建立、變更與改良基礎架構。Terraform 是開放原始碼工具,能將 API 編碼為陳述式設定檔。這類設定檔可以分享給團隊成員,也能視為程式碼處理,並進行編輯、審查和版本管理。

在這個實驗室中,您將建立 Terraform 設定與模組來自動部署 Google Cloud 基礎架構。具體來說,您將部署自動模式網路,以及該網路的防火牆規則和兩個 VM 執行個體,如這張圖表所示:

目標

在這個實驗室中,您將瞭解如何執行下列工作:

  • 建立自動模式網路設定
  • 建立防火牆規則設定
  • 建立 VM 執行個體模組
  • 建立及部署設定
  • 驗證設定的部署作業

設定

每個實驗室都會提供新的 Google Cloud 專案和一組資源,讓您在時限內免費使用。

  1. 按一下「Start Lab」按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:

    • 「Open Google Cloud console」按鈕
    • 剩餘時間
    • 必須在這個研究室中使用的臨時憑證
    • 完成這個實驗室所需的其他資訊 (如有)
  2. 點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」

    接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。

    提示:您可以在不同的視窗中並排開啟分頁。

    注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」
  3. 如有必要,請將下方的 Username 貼到「登入」對話方塊。

    {{{user_0.username | "Username"}}}

    您也可以在「Lab Details」窗格找到 Username

  4. 點選「下一步」

  5. 複製下方的 Password,並貼到「歡迎使用」對話方塊。

    {{{user_0.password | "Password"}}}

    您也可以在「Lab Details」窗格找到 Password

  6. 點選「下一步」

    重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
  7. 按過後續的所有頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Google Cloud 控制台稍後會在這個分頁開啟。

注意:如要查看列出 Google Cloud 產品和服務的選單,請點選左上角的「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。

工作 1:設定 Terraform 和 Cloud Shell

在這項工作中,您將設定 Cloud Shell 環境,以便使用 Terraform。

安裝 Terraform

Terraform 現已整合至 Cloud Shell,請確認目前安裝版本。

  1. 在 Cloud 控制台,點選「啟用 Cloud Shell」圖示
  2. 如果出現提示訊息,請點選「繼續」
  3. 執行下列指令,確認 Terraform 是否安裝成功:
terraform --version

輸出內容應如下所示:

Terraform v1.5.7

注意事項:如果收到 Terraform 版本過舊的警告訊息,請不必擔心,本實驗室的操作說明適用於 Terraform v1.5.7 以上版本。如要下載 Terraform 的最新版本,請前往 Terraform 網站。在所有支援平台與架構上,Terraform 是以二進位檔套件發布;Cloud Shell 則是使用 Linux 64 位元。

  1. 執行下列指令來建立 Terraform 設定目錄:
mkdir tfinfra
  1. 在 Cloud Shell 中點選「開啟編輯器」圖示

注意事項:如果系統顯示「第三方 Cookie 已停用,因此無法載入程式碼編輯器」,請點選「在新視窗中開啟」,程式碼編輯器將在新分頁中開啟。返回原始分頁並點選「開啟終端機」,然後切換回「程式碼編輯器」分頁。在這個分頁中,您需要定期切換回 Cloud Shell 終端機。

  1. 在程式碼編輯器的左側窗格中,展開 tfinfra 資料夾。

初始化 Terraform

Terraform 會使用外掛程式型架構,來支援可用的多個基礎架構和服務供應商。每個「供應商」均為自己專屬的封裝二進位檔,與 Terraform 本身分開發布。請將 Google 設為供應商來初始化 Terraform。

  1. 如要在 tfinfra 資料夾中建立新檔案,請對該資料夾按一下滑鼠右鍵,然後點選「New File」
  2. 將新檔案命名為 provider.tf 後開啟檔案。
  3. 將下列程式碼複製並貼到 provider.tf 中:
provider "google" {}
  1. 依序點選「File」>「Save」來儲存 provider.tf

  2. 執行下列指令來初始化 Terraform:

cd tfinfra terraform init

現在可以在 Cloud Shell 使用 Terraform 了。

工作 2:建立 mynetwork 及其資源

在這項工作中,您將建立自動模式網路 mynetwork,以及其防火牆規則和兩個 VM 執行個體 (mynet_vm_1mynet_vm_2)。

設定 mynetwork

建立新設定並定義 mynetwork

  1. 如要在 tfinfra 中建立新檔案,請對該資料夾按一下滑鼠右鍵,然後點選「New File」
  2. 將新檔案命名為 mynetwork.tf 後開啟檔案。
  3. 複製下列程式碼集並貼到 mynetwork.tf 中:
# Create the mynetwork network resource [RESOURCE_TYPE] "mynetwork" { name = [RESOURCE_NAME] # RESOURCE properties go here }

在設定 Google Cloud 資源時,這個基礎範本是很好的起點:name 欄位可用來命名資源;type 欄位則是用來指定要建立的 Google Cloud 資源。您也可以定義屬性,但對部分資源來說,屬性並非必要資訊。

  1. mynetwork.tf 中,將 [RESOURCE_TYPE] 替換為 "google_compute_network" (須保留引號)。

注意事項google_compute_network 資源為虛擬私有雲網路。如需可用資源相關資訊,請參閱 Google Cloud 供應商說明文件;如要進一步瞭解這項資源,請參閱 Terraform 說明文件

  1. mynetwork.tf 中,將 [RESOURCE_NAME] 替換為 "mynetwork" (須保留引號)。
  2. mynetwork.tf 中新增下列屬性:
auto_create_subnetworks = "true"

根據定義,自動模式網路會在每個區域自動建立子網路,因此您需要將 auto_create_subnetworks 設為 true

  1. 確認 mynetwork.tf 檔案是否如下所示:
# Create the mynetwork network resource "google_compute_network" "mynetwork" { name = "mynetwork" # RESOURCE properties go here auto_create_subnetworks = "true" }
  1. 依序點選「File」>「Save」來儲存 mynetwork.tf

設定防火牆規則

定義防火牆規則,以允許 HTTP、SSH、遠端桌面協定和 ICMP 流量通過 mynetwork。

  1. 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 }
  1. mynetwork.tf 中,將 [RESOURCE_TYPE] 替換為 "google_compute_firewall" (須保留引號)。

注意事項google_compute_firewall 資源為防火牆規則,如要進一步瞭解這項資源,請參閱 Terraform 說明文件

  1. mynetwork.tf 中,將 [RESOURCE_NAME] 替換為 "mynetwork-allow-http-ssh-rdp-icmp" (須保留引號)。
  2. mynetwork.tf 中新增下列屬性:
network = google_compute_network.mynetwork.self_link

注意事項:這項防火牆規則依附於網路上,因此您須使用 google_compute_network.mynetwork.self_link 參照,指示 Terraform 按相依順序解析這些資源,在這個案例中,系統會先建立網路,再建立防火牆規則。

  1. mynetwork.tf 中新增下列屬性:
allow { protocol = "tcp" ports = ["22", "80", "3389"] } allow { protocol = "icmp" } source_ranges = ["0.0.0.0/0"]

allow 規則清單會指定允許的通訊協定和通訊埠。

  1. 確認 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"] }
  1. 依序點選「File」>「Save」來儲存 mynetwork.tf

設定 VM 執行個體

建立 VM 執行個體模組來定義 WM 執行個體。模組是指資料夾中可重複使用的設定。在這個實驗室中,您將使用建立好的模組定義兩個 VM 執行個體。

  1. 如要在 tfinfra 中建立新檔案,請選取 tfinfra 資料夾,然後依序點選「File」>「New Folder」
  2. 將新資料夾命名為 instance
  3. 如要在 instance 中建立新檔案,請對該資料夾按一下滑鼠右鍵,然後點選「New File」
  4. 將新檔案命名為 main.tf 後開啟檔案。

您會在 Cloud Shell 中看到下列資料夾架構:

  1. 複製下列程式碼集並貼到 main.tf 中:
resource [RESOURCE_TYPE] "vm_instance" { name = [RESOURCE_NAME] # RESOURCE properties go here }
  1. main.tf 中,將 [RESOURCE_TYPE] 替換為 "google_compute_instance" (須保留引號)。

注意事項google_compute_instance 資源為 Compute Engine 執行個體。如要進一步瞭解這項資源,請參閱 Terraform 說明文件

  1. main.tf 中,將 [RESOURCE_NAME] 替換為 "${var.instance_name}" (須保留引號)。

您會使用此模組定義兩個 VM 執行個體,因此須將執行個體名稱定義為輸入變數。這項操作可讓您透過 mynetwork.tf 控制變數名稱。如要進一步瞭解輸入變數,請參閱 Terraform:「定義輸入變數指南」

  1. main.tf 中新增下列屬性:
zone = "${var.instance_zone}" machine_type = "${var.instance_type}"

這些屬性會將執行個體的可用區和機型定義為輸入變數。

  1. main.tf 中新增下列屬性:
boot_disk { initialize_params { image = "debian-cloud/debian-11" } }

這項屬性會定義開機磁碟,以使用 Debian 11 OS 映像檔。兩個 VM 執行個體會使用相同的映像檔,因此您可以在模組中採用硬式編碼的方式寫入此屬性。

  1. 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 說明文件

  1. 確認 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 } } }
  1. 依序點選「File」>「Save」來儲存 main.tf。
  2. 如要在 instance 中建立新檔案,請對該資料夾按一下滑鼠右鍵,然後點選「New File」
  3. 將新檔案命名為 variables.tf 後開啟檔案。
  4. variables.tf 中定義 4 個輸入變數。
variable "instance_name" {} variable "instance_zone" {} variable "instance_type" { default = "e2-micro" } variable "instance_network" {}

instance_type 提供預設值,即可將變數設為選填。instance_nameinstance_zoneinstance_network 為必填區段,您需要在 mynetwork.tf 進行定義。

  1. 依序點選「File」>「Save」來儲存 variables.tf。
  2. 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 模組資料庫中的現有模組,而不必自行編寫。

  1. 依序點選「File」>「Save」來儲存 mynetwork.tf

  2. 確認 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 設定了。

  1. 如要將 Terraform 設定檔重新編寫為標準格式,請執行下列指令:
terraform fmt

輸出內容應如下所示:

mynetwork.tf

注意事項:如果收到錯誤訊息,請返回先前步驟,確認設定是否與實驗室操作說明相符。如無法解決設定中的問題,請下載並參考下列已完成的設定:

  1. 執行下列指令來初始化 Terraform:
terraform init

輸出內容應如下所示:

Initializing modules... - mynet-vm-2 in instance - mynet-vm-2 in instance ... Terraform has been successfully initialized!

注意事項:如果發生錯誤,請回到先前的步驟,確認資料夾/檔案的結構是否正確無誤。如無法解決設定中的問題,請點選上方連結,下載並參考已完成的設定。待問題解決後,再重新執行先前的指令。

  1. 如要建立執行計畫,請執行下列指令:
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 執行個體
  1. 如要套用所需變更,請執行下列指令:
terraform apply
  1. 如要確認已安排的操作,請輸入:
yes

輸出內容應如下所示:

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

點選「Check my progress」來確認目標已達成。 建立 mynetwork 及其資源

注意事項:如果您在執行過程中收到錯誤訊息,請返回先前步驟,確認資料夾/檔案結構是否正確無誤。如無法解決設定中的問題,請點選上方連結,下載並參考已完成的設定。待問題解決後,再重新執行先前的指令。

工作 3:驗證部署作業

在 Google Cloud 控制台,驗證先前建立的資源。

在 Cloud 控制台驗證網路

  1. 前往 Google Cloud 控制台的「導覽選單」,依序點選「虛擬私有雲網路」>「虛擬私有雲網路」
  2. 查看 mynetwork 虛擬私有雲網路及各區域的子網路。
  3. 從「導覽選單」依序點選「虛擬私有雲網路」>「防火牆」
  4. 依「網路」將防火牆規則排序
  5. 查看 mynetworkmynetwork-allow-http-ssh-rdp-icmp 防火牆規則。

在 Cloud 控制台中驗證 VM 執行個體

  1. 從「導覽選單」 依序點選「Compute Engine」>「VM 執行個體」
  2. 查看 mynet-vm-1mynet-vm-2 執行個體。
  3. 記下 mynet-vm-2 的內部 IP 位址。
  4. mynet-vm-1 的資料列,點選「SSH」啟動終端機並連線。
  5. 為測試連至 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 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。