检查点
Creating Resources in terraform
/ 30
Change Infrastructure
/ 20
Destructive Changes
/ 20
Create Resource Dependencies
/ 20
Create bucket dependent instance
/ 10
使用基礎架構即程式碼工具 Terraform
本研究室是我們與合作夥伴 Hashicorp 攜手開發而成。如果您在帳戶個人資料中選擇接收產品最新消息、公告和優惠資訊,您的個人資訊即有可能提供給本研究室的贊助者 Hashicorp。
GSP750
總覽
Terraform 是 HashiCorp 提供的基礎架構即程式碼工具,能夠讓您以安全且可重複的方式建構、變更及管理基礎架構。作業人員和基礎架構團隊可透過 Terraform 管理環境,並在過程中使用名為 HashiCorp Configuration Language (HCL) 的設定語言,以人類可讀的方式自動進行部署作業。
採取基礎架構即程式碼的做法時,您會透過一或多個檔案管理基礎架構,而非在使用者介面中手動設定資源。在此,資源指的是特定環境中基礎架構的任一環節,例如虛擬機器、安全性群組、網路介面等。整體來說,Terraform 可讓作業人員使用 HCL,針對絕大多數供應商的服務 (AWS、Google Cloud、GitHub、Docker 等) 建立包含所需資源定義的檔案,並在執行套用動作時自動處理這些資源的建立作業。
簡易的部署工作流程基本上包含以下步驟:
- 劃定範圍:確認必須為特定專案建立哪些資源。
- 建立:根據範圍內的參數以 HCL 建立設定檔。
-
初始化:在包含設定檔的專案目錄中執行
terraform init
,為專案下載正確的供應商外掛程式。 -
規劃及套用:執行
terraform plan
確認建立程序,然後執行terraform apply
建立實際資源和狀態檔案,這個檔案會將設定檔日後的異動內容與部署環境中實際存在的內容進行比較。
目標
在本研究室中,您將瞭解如何執行下列工作:
- 透過 Terraform 建構、變更及刪除基礎架構
- 透過 Terraform 建立資源依附性
- 透過 Terraform 佈建基礎架構
設定和需求
點選「Start Lab」按鈕前的須知事項
請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。
您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。
如要完成這個研究室活動,請先確認:
- 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
- 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
如何開始研究室及登入 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 控制台稍後會在這個分頁開啟。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
- 點按 Google Cloud 控制台上方的「啟用 Cloud Shell」圖示 。
連線完成即代表已通過驗證,且專案已設為您的 PROJECT_ID。輸出內容中有一行宣告本工作階段 PROJECT_ID 的文字:
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
-
點按「授權」。
-
輸出畫面應如下所示:
輸出內容:
- (選用) 您可以使用下列指令來列出專案 ID:
輸出內容:
輸出內容範例:
gcloud
的完整說明,請前往 Google Cloud 並參閱「gcloud CLI overview guide」(gcloud CLI 總覽指南)。
工作 1:建構基礎架構
Cloud Shell 已預先安裝 Terraform,因此您可以直接開始建立基礎架構。
首先,請建立名為 main.tf
的範例設定檔。Terraform 會將名稱結尾為 .tf
或 .tf.json
的檔案視為設定檔,並在執行時載入這些檔案。
- 建立
main.tf
檔案:
-
在 Cloud Shell 的工具列中按一下「開啟編輯器」按鈕。如要在 Cloud Shell 與程式碼編輯器之間切換,請視需要按一下「開啟編輯器」或「開啟終端機」圖示。您也可以點按「在新視窗中開啟」按鈕,讓編輯器在另一個分頁中保持開啟。
-
在編輯器中,將以下內容新增至
main.tf
檔案。
terraform {}
區塊。Terraform 區塊
terraform {}
區塊為必要項目,可讓 Terraform 知道要從 Terraform Registry 下載哪個供應商外掛程式。在上方的設定中,google
供應商外掛程式的來源是定義為 hashicorp/google
,即 registry.terraform.io/hashicorp/google
的簡寫。
您也可以為 required_providers
區塊中定義的每個供應商外掛程式指派版本。version
引數雖為選用性質,但建議您使用。這個引數的用途是限制供應商外掛程式的版本 (可以是特定版本或一組特定的版本),避免下載可能包含破壞性變更的新供應商外掛程式。如未指定版本,Terraform 會在初始化時自動下載最新的供應商外掛程式。
詳情請參閱 HashiCorp Terraform 網站中的「Provider Requirements」(供應商外掛程式要求) 一文。
供應商外掛程式
provider
區塊是用來設定指定的供應商外掛程式,在這個範例中為 google
。供應商外掛程式負責建立及管理資源。如果 Terraform 設定會管理不同供應商外掛程式的資源,則可以有多個供應商外掛程式區塊。
初始化
建立新設定或透過版本管控提取現有設定後,您要執行的第一項指令是 terraform init
。這項指令會初始化各種本機設定,以及後續指令將使用的資料。
- 請在與
main.tf
檔案相同的目錄中執行terraform init
指令,初始化新的 Terraform 設定:
建立資源
- 執行
terraform apply
指令來立即套用設定:
輸出內容包含資源 "google_compute_network" "vpc_network"
,旁邊加上 +
,表示 Terraform 將建立這項資源。底下則為系統將設定的屬性。如果顯示的值為 (known after apply)
,表示要等資源建立完畢後才會知道值。
如果計畫建立成功,Terraform 會先暫停,等通過核准後才會繼續執行相關作業。如果計畫中的任何項目似乎有誤或有危險,可以放心取消作業,無須擔心基礎架構會變更。
如果 terraform apply
執行失敗並傳回錯誤,請查看錯誤訊息並修正發生的錯誤。
- 計畫看起來可接受,因此請在出現確認提示時,輸入
yes
來繼續操作。
Terraform 會等候網路建立成功,因此計畫需要幾分鐘的時間才會執行完畢:
這樣就大功告成了!您可以前往 Cloud 控制台查看已佈建的網路。
- 透過控制台的「導覽選單」前往「虛擬私有雲網路」。您會看到
terraform-network
已佈建完成。
- 在 Cloud Shell 中,執行
terraform show
指令來檢查目前的狀態:
您可以參照這些值來設定其他資源或輸出內容,具體做法將在本研究室的後續部分說明。
點選「Check my progress」,確認目標已達成。
工作 2:變更基礎架構
在上一節中,您透過 Terraform 建立了基本的基礎架構:虛擬私有雲網路。在本節中,您將修改設定並瞭解 Terraform 如何處理變更內容。
基礎架構會持續演進,而 Terraform 可協助管理及導入這類異動。當您變更 Terraform 設定時,Terraform 會建構執行計畫,僅修改達到目標狀態所需的內容。
藉由使用 Terraform 變更基礎架構,您不僅能管控設定的版本,還能對狀態進行版本管控,以便掌握基礎架構的演進過程。
新增資源
如要新增資源,您可以將資源新增至 Terraform 設定,然後執行 terraform apply
來加以佈建。
- 在編輯器中,將運算執行個體資源新增至
main.tf
:
這項資源包含幾個其他引數。名稱和機器類型為簡易字串,但 boot_disk
和 network_interface
是較複雜的區塊。您可以在 google_compute_instance 說明文件中查看所有可用的選項。
在這個範例中,運算執行個體將使用 Debian 作業系統,並會連線至您先前建立的虛擬私有雲網路。請注意,這項設定是使用 google_compute_network.vpc_network.name
參照網路的名稱屬性,其中 google_compute_network.vpc_network
是 ID (與定義網路的區塊所包含的值一致),name
則是該資源的屬性。
access_config
區塊可確保執行個體能夠透過網際網路存取,即使沒有任何引數也一樣。
- 執行
terraform apply
來建立運算執行個體:
- 在出現確認提示時,再次回應
yes
。
這是一項很簡易的變更:您在設定中新增了名為「vm_instance」的「google_compute_instance」資源,然後 Terraform 在 Google Cloud 中建立了該資源。
變更資源
除了建立資源,Terraform 也可對資源進行變更。
- 為「vm_instance」新增
tags
引數,使其看起來如下所示:
- 再次執行
terraform apply
來更新執行個體:
- 前置字串
~
表示 Terraform 會就地更新資源。您可以回應yes
來直接套用這項變更,Terraform 隨即會將標記新增至執行個體。
點選「Check my progress」,確認目標已達成。
毀壞性變更
毀壞性變更是指供應商外掛程式必須取代現有資源 (而非更新資源) 的變更。之所以會發生這類變更,通常是因為雲端供應商的服務不支援以設定所述的方式更新資源。
舉例來說,變更執行個體的磁碟映像檔就是一種毀壞性變更。
- 編輯設定檔中
vm_instance
資源的boot_disk
區塊,並將其變更為以下內容:
- 接著再次執行
terraform apply
,看看 Terraform 會如何將這項變更套用至現有資源:
前置字串 -/+
表示 Terraform 會刪除並重新建立資源,而非進行就地更新。雖然某些屬性可以就地更新 (這類屬性會包含前置字串 ~
),但如要變更執行個體的開機磁碟映像檔,就必須重新建立映像檔。Terraform 和 Google Cloud 供應商外掛程式會為您處理相關細節,而您可以透過執行計畫清楚瞭解 Terraform 將採取的動作。
此外,執行計畫會顯示執行個體之所以遭到取代,是因為磁碟映像檔有所變更。您可以運用這項資訊調整變更內容,避免在不該刪除/建立更新時執行這些作業。
- 在繼續執行相關作業之前,Terraform 會再次顯示執行計畫核准提示。請回應
yes
來執行規劃的步驟。
如執行計畫所示,Terraform 會先刪除現有執行個體,然後再建立新的執行個體來取而代之。您可以再次使用 terraform show
,查看與這個執行個體相關聯的新值。
刪除基礎架構
您已瞭解如何建構及變更基礎架構。接著須學習如何徹底刪除 Terraform 代管的基礎架構,才能繼續建立多項資源和顯示資源依附性。
在實際工作環境中,您幾乎不需要刪除基礎架構。不過,如果您使用 Terraform 建立並啟動多個環境 (例如開發、測試和暫存環境),就常常會用到「刪除基礎架構」這個動作。
您可以使用 terraform destroy
指令刪除資源。這項指令與 terraform apply
類似,只不過會假設所有資源都已從設定中移除。
- 請嘗試執行
terraform destroy
指令,然後回應yes
來執行這項計畫並刪除基礎架構:
前置字串 -
表示執行個體和網路將遭到刪除。和執行套用動作時一樣,Terraform 會顯示執行計畫,待您核准後才會進行變更。
此外,如同 terraform apply
,Terraform 會決定刪除順序。Google Cloud 中不允許刪除仍包含資源的虛擬私有雲網路,因此 Terraform 會等執行個體刪除完畢後再刪除網路。執行多項作業時,Terraform 會建立依附性圖表來決定正確的作業順序。若是涉及多項資源這種較複雜的情況,Terraform 只有在安全狀態才會平行執行多項作業。
點選「Check my progress」,確認目標已達成。
工作 3:建立資源依附性
在本節中,您將進一步瞭解資源依附性,以及如何使用資源參數,將某項資源的相關資訊提供給其他資源。
實際的基礎架構包含各種資源和資源類型。Terraform 設定可含有多項資源和多種資源類型,且這些類型甚至可能涵蓋多個供應商外掛程式。
在本節中,您將透過一個簡易範例,瞭解如何設定多項資源,以及如何使用資源屬性設定其他資源。
- 請重新建立網路和執行個體,並在出現提示時回應
yes
,系統隨即會建立這些資源:
指派靜態 IP 位址
- 在
main.tf
檔案中,為 VM 執行個體指派靜態 IP 來新增設定內容:
這應該和先前新增 VM 執行個體資源的範例感覺類似,只不過這次您建立的是「google_compute_address」資源類型。這種資源類型會為專案分配預留的 IP 位址。
- 接著執行
terraform plan
:
您可以查看執行 terraform plan
後將會建立的內容:
與 terraform apply
不同的是,plan
指令只會顯示變更內容,而且絕對不會直接套用變更。請注意,您目前所做的變更就只有新增靜態 IP。接下來,您必須將該 IP 位址附加至您的執行個體。
- 依以下方式更新執行個體的
network_interface
設定:
access_config
區塊包含多個選用引數,而在這個範例中,請將 nat_ip
設為靜態 IP 位址。Terraform 讀取這項設定時會執行以下動作:
- 確認已在更新
vm_instance
前建立vm_static_ip
- 將
vm_static_ip
的屬性儲存在狀態中 - 將
nat_ip
設為vm_static_ip.address
屬性的值
- 再次執行 terraform plan,但這次要儲存計畫:
只要以這個方式儲存計畫,即可確保日後能夠套用完全相同的計畫。如果您嘗試套用由計畫建立的檔案,Terraform 會先確認變更內容是否完全一致,然後再套用計畫。
在這個範例中,Terraform 會建立新的 google_compute_address
,並更新現有 VM 來使用該項目。
- 執行
terraform apply "static_ip"
,看看 Terraform 如何進行規劃來套用這項變更:
如上所示,Terraform 在修改 VM 執行個體之前建立了靜態 IP。由於有內插運算式將 IP 位址傳遞至執行個體的網路介面設定,因此 Terraform 能夠推論依附性,並且知道必須先建立靜態 IP 再更新執行個體。
點選「Check my progress」,確認目標已達成。
隱含和明確依附性
藉由研究內插運算式中使用的資源屬性,Terraform 可自動推論資源之間的依附關係。上方範例由於參照 google_compute_address.vm_static_ip.address
,因此會針對名為 vm_static_ip
的 google_compute_address
建立「隱含依附性」。
Terraform 會使用這項依附性資訊,決定建立及更新不同資源的正確順序。在上方範例中,Terraform 知道必須在更新 vm_instance
之前建立 vm_static_ip
,這樣才能使用這個靜態 IP。
Terraform 主要是透過內插運算式推論出隱含依附性,藉此掌握資源的依附關係,而我們也建議您盡可能使用內插運算式。
Terraform 有時「無法」掌握某些資源的依附性。您可以將 depends_on
引數新增至任何資源,並為其提供要建立明確依附性的資源清單。
舉例來說,假如在執行個體上執行的應用程式預期使用特定 Cloud Storage 值區,但這項依附性是設定在應用程式程式碼中,這樣 Terraform 就無從得知這項資訊。在這種情況下,您可以使用 depends_on
明確宣告依附性。
- 在
main.tf
中新增以下內容,藉此新增 Cloud Storage 值區,以及對該值區有明確依附性的執行個體:
UNIQUE-BUCKET-NAME
替換為不重複的有效值區名稱。一般來說,如要建立不重複的值區名稱,使用自己的名字和日期是個不錯的方式。
您可能會想知道如何決定這些資源在設定中的順序。實際上,資源在 Terraform 設定檔中定義的順序不會影響 Terraform 套用變更的方式。因此,請以對您和團隊最具意義的方式整理設定檔。
- 執行 terraform plan 和 terraform apply,看看這些變更的實際效果:
點選「Check my progress」,確認目標已達成。
- 在繼續操作之前,請先從設定中移除這些新資源,然後再次執行
terraform apply
來刪除資源。本研究室的後續部分不會用到這個值區或第二個執行個體。
工作 4:佈建基礎架構
您目前啟動的運算執行個體是以所提供的 Google 映像檔為基礎,但尚未安裝任何額外軟體,也未套用任何設定。
Google Cloud 可讓客戶管理自己的自訂作業系統映像檔,確保透過 Terraform 佈建的執行個體已經過預先設定,符合自身需求。Packer 是處理這項作業的絕佳工具,並且包含適用於 Google Cloud 的建構工具。
Terraform 會使用佈建工具上傳檔案、執行殼層指令碼,或是安裝及觸發設定管理工具等其他軟體。
定義佈建工具
- 如要定義佈建工具,請將設定中用於定義第一個
vm_instance
的資源區塊修改為以下內容:
這樣會在 resource
區塊中新增 provisioner
區塊。您可以新增多個 provisioner
區塊來定義多個佈建步驟。Terraform 支援許多佈建工具,但在這個範例中,您要使用 local-exec
佈建工具。
local-exec
佈建工具會在執行 Terraform 的機器本機上執行指令,而非在 VM 執行個體本身上執行。由於您使用的佈建工具是 local-exec,而不是其他的佈建工具,因此暫時不必煩惱如何指定連線資訊。
這個字串內插範例也比先前的範例還要複雜。每個 VM 執行個體都可能有多個網路介面,因此如同大部分的程式設計語言,請從 0 開始計數,使用 network_interface[0]
參照第一個介面。每個網路介面也可能包含多個 access_config 區塊,因此您同樣要指定第一個區塊。
- 執行
terraform apply
:
現階段的輸出內容一開始可能會令人困惑。
Terraform 沒有任何要執行的動作,而如果您進行檢查,就會發現本機機器上並沒有 ip_address.txt
檔案。
Terraform 處理佈建工具的方式與其他引數不同。佈建工具只會在資源建立時執行,但新增佈建工具並不會導致系統強制刪除並重新建立該資源。
- 使用
terraform taint
指示 Terraform 重新建立執行個體:
系統會在下一次執行 apply
時刪除並重新建立受汙染的資源。
- 執行
terraform apply
:
- 查看
ip_address.txt
檔案的內容,確認結果是否如預期。
這個檔案包含 IP 位址,與您的要求內容一致。
佈建工具發生錯誤和受汙染的資源
如果資源已成功建立,但未能完成某個佈建步驟,Terraform 會顯示錯誤,並將該資源標示為「tainted」(受汙染)。受汙染的資源仍會存在,但由於佈建失敗,因此不應將其視為可安全使用。
當您產生下一個執行計畫時,Terraform 會移除所有受汙染的資源,然後建立並嘗試重新佈建新資源。
刪除佈建工具
您也可以將佈建工具定義為只在刪除作業期間執行。這樣對於系統清理、資料擷取等作業很有幫助。
針對許多資源,建議您盡可能使用內建清理機制 (例如 init 指令碼),但您也可以視需要使用佈建工具。
本研究室不提供任何已刪除佈建工具的範例。如要使用刪除佈建工具,請參閱佈建工具說明文件。
恭喜!
在本研究室中,您學會了如何透過 Terraform 建構、變更及刪除基礎架構。接著,您建立了資源依附性,並透過 Terraform 設定檔佈建了基本的基礎架構。
後續步驟/瞭解詳情
請務必查看下列資源,獲得更多 Terraform 實作練習機會:
- Google Cloud Marketplace 上的 Hashicorp!
- Hashicorp Learn
- Terraform 社群
- Terraform Google 範例
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 1 月 26 日
研究室上次測試日期:2023 年 9 月 25 日
Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。