检查点
Provision infrastructure
/ 50
Upload files to the bucket
/ 50
與 Terraform 模組互動
本研究室是我們與合作夥伴 Hashicorp 攜手開發而成。如果您在帳戶個人資料中選擇接收產品最新消息、公告和優惠資訊,我們可能會將您的個人資訊提供給本研究室的贊助者 Hashicorp。
GSP751
總覽
透過 Terraform 管理基礎架構的過程中,您建立的設定會越來越複雜。單一 Terraform 設定檔或目錄的複雜度本身沒有任何限制,因此您可以持續在單一目錄中編寫及更新設定檔。不過,如果選擇這麼做,您可能會遇到以下問題:
- 設定檔會越來越難以理解和瀏覽。
- 設定更新作業的風險會較高,原因是更新設定的某個區塊可能會導致其他區塊發生非預期的結果。
- 可能會有較多重複的類似設定區塊 (例如設定不同的開發/測試/實際工作環境時),導致您更新設定的這些部分時負擔加重。
- 當您剪下及貼上設定區塊,以便在不同專案和團隊之間分享設定的特定部分時,可能會容易發生錯誤且難以維護。
在本研究室中,您將瞭解透過模組解決這些問題的方法、Terraform 模組的結構,以及使用及建立模組時的最佳做法。
模組的功用為何?
只要使用模組,就能透過多種方式解決上述問題,例如:
-
整理設定:模組可用來將設定的相關部分分組,方便您瀏覽、理解及更新設定。即使是複雜度一般的基礎架構,也可能需要數百或數千行設定才能實作。只要使用模組,您就能將設定整理成邏輯元件。
-
封裝設定:使用模組的另一個好處,就是可以將設定封裝成獨特的邏輯元件。封裝有助於避免發生非預期的結果 (例如變更設定的某個部分時意外導致其他基礎架構發生異動),並降低發生簡單錯誤的機會 (例如為兩個不同資源取相同名稱)。
-
重複使用設定:如果您在不使用現有程式碼的情況下編寫所有設定,可能會耗費大量時間且容易發生錯誤。模組可讓您重複使用現有設定 (編寫者可能是您、其他團隊成員,或是發布模組以供您使用的其他 Terraform 從業人員),幫助您節省時間並減少代價高昂的錯誤。您也可以與其他團隊成員或一般大眾分享自己編寫的模組,讓他們受惠於您的心血結晶。
-
提供一致性,並確保設定採用最佳做法:模組也可為設定提供一致性,這樣不但能讓複雜的設定較容易理解,還可確保所有設定皆採用最佳做法。舉例來說,雲端服務供應商提供許多物件儲存空間服務設定選項,例如 Amazon S3 (Simple Storage Service) 或 Google 的 Cloud Storage 值區。許多重大安全事件都與未受到妥善保護的物件儲存空間有關,且由於牽涉的複雜設定選項過多,因此很容易不小心以錯誤方式設定這些服務。
使用模組有助於減少這類錯誤。舉例來說,您可以建立一個模組來說明貴機構所有公開網站值區的設定方式,並針對用於記錄應用程式的私人值區建立另一個模組。此外,如果某種資源的設定需要更新,使用模組可讓您在同一個地方進行更新作業,並將更新內容套用到使用了該模組的所有部分。
課程內容
在本研究室中,您將瞭解如何執行下列工作:
-
使用 Registry 中的模組
-
建構模組
設定和需求
點選「Start Lab」按鈕前的須知事項
請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。
您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。
如要完成這個研究室活動,請先確認:
- 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
- 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
如何開始研究室及登入 Google Cloud 控制台
-
按一下「Start Lab」(開始研究室) 按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」(研究室詳細資料) 面板會顯示下列項目:
- 「Open Google Console」(開啟 Google 控制台) 按鈕
- 剩餘時間
- 必須在這個研究室中使用的暫時憑證
- 完成這個研究室所需的其他資訊 (如有)
-
按一下「Open Google Console」(開啟 Google 控制台)。接著,研究室會啟動相關資源並開啟另一個分頁,當中會顯示「Sign in」(登入) 頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意事項:如果頁面中顯示了「Choose an account」(選擇帳戶) 對話方塊,請按一下「Use Another Account」(使用其他帳戶)。 -
如有必要,請複製「Lab Details」(研究室詳細資料) 面板中的使用者名稱,然後貼到「Sign in」(登入) 對話方塊。按一下「Next」(下一步)。
-
複製「Lab Details」(研究室詳細資料) 面板中的密碼,然後貼到「Welcome」(歡迎使用) 對話方塊。按一下「Next」(下一步)。
重要注意事項:請務必使用左側面板中的憑證,而非 Google Cloud 技能重點加強的憑證。 注意事項:如果使用自己的 Google Cloud 帳戶來進行這個研究室,可能會產生額外費用。 -
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
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 總覽指南)。
什麼是 Terraform 模組?
Terraform 模組是單一目錄中的一組 Terraform 設定檔。即使是由包含一或多個 .tf
檔案的單一目錄所構成的簡易設定,也算是模組。如果您直接透過這類目錄執行 Terraform 指令,該目錄即為根模組。因此,每個 Terraform 設定都是模組的一部分。一組簡易的 Terraform 設定檔可能會如下所示:
在這個情況下,如果您在 minimal-module
目錄中執行 Terraform 指令,該目錄的內容即為根模組。
呼叫模組
Terraform 指令只會直接使用單一目錄 (通常是目前使用中的目錄) 中的設定檔。不過,設定可能會使用模組區塊呼叫其他目錄中的模組。碰到模組區塊時,Terraform 會載入並處理該模組的設定檔。
由另一個設定呼叫的模組有時稱為該設定的「子項模組」。
本機和遠端模組
模組可透過本機檔案系統或遠端來源載入。Terraform 支援多種遠端來源,包括 Terraform Registry、大部分的版本管控系統、HTTP 網址,以及 Terraform Cloud 或 Terraform Enterprise 私人模組註冊資料庫。
模組最佳做法
在許多方面來說,Terraform 模組與大部分程式設計語言中的程式庫、套件或模組概念類似,可提供許多相同的好處。如同絕大多數的複雜電腦程式,實際的 Terraform 設定在大部分情況下也應一律使用模組來提供上述好處。
建議所有 Terraform 從業人員按照下列最佳做法使用模組:
-
在編寫模組之前,先為模組擬定計畫。即使是由單一人員管理且稍微複雜的 Terraform 設定,使用模組也利大於弊,值得您花時間妥善運用。
-
使用本機模組來整理及封裝程式碼。即使您並未使用或發布遠端模組,也還是建議您從一開始就根據模組來整理設定,這樣就能在基礎架構漸趨複雜的同時,大幅減輕維護和更新設定的負擔。
-
使用公開的 Terraform Registry 尋找實用模組。這樣一來,您就能運用他人的成果,安心地迅速實作設定。
-
發布模組並與團隊分享。大部分的基礎架構都是由團隊負責管理,而模組是團隊建立及維護基礎架構時可使用的重要工具。如前所述,您可以透過公開或私人的方式發布模組。具體做法請見本系列課程中的後續研究室。
工作 1:使用 Registry 中的模組
在本節中,您將使用 Terraform Registry 中的模組,在 Google Cloud 中佈建範例環境。您在本節中使用的概念適用於所有來源的任何模組。
- 在新的瀏覽器分頁或視窗中,開啟 Terraform Network 模組的 Terraform Registry 頁面。這個頁面應會如下所示:
這個頁面包含模組相關資訊,以及來源存放區的連結。頁面右側則有用於選取模組版本的下拉式選單介面,以及使用模組佈建基礎架構的操作說明。
呼叫模組時,您必須提供 source
引數。在這個範例中,Terraform 會在 Terraform Registry 中搜尋符合指定字串的模組。您也可以使用網址或本機檔案路徑做為模組來源。如需可用的模組來源清單,請參閱 Terraform 說明文件。
這裡顯示的另一個引數是 version
。針對支援的來源,version 可讓您定義要載入的一或多個模組版本。在本研究室中,您要指定所用模組的確切版本號碼。如果想瞭解指定版本的其他方式,請參閱模組說明文件。
系統會將模組區塊的其他引數視為模組的輸入變數。
建立 Terraform 設定
-
首先在 Cloud Shell 中執行以下指令,從 Google Terraform 模組 GitHub 存放區複製範例簡易專案,並切換至
v3.3.0
分支版本:
這可確保所用的版本號碼正確無誤。
-
在 Cloud Shell 工具列中,按一下「開啟編輯器」。如要在 Cloud Shell 與程式碼編輯器之間切換,請視需求點選「開啟編輯器」或「開啟終端機」。或者,您也可以點選「在新視窗中開啟」,在另一個分頁中保持開啟編輯器。
-
在編輯器中前往
terraform-google-network/examples/simple_project
,並開啟main.tf
檔案。main.tf
設定應如下所示:
這項設定包含幾個重要區塊:
-
provider "google"
:定義供應商。 -
locals
:三個子網路的名稱。您可以使用 local 值為運算式指派名稱,這樣就能在模組中多次使用該運算式,而不必重複指定運算式。 -
module "test-vpc-module"
:定義虛擬私有雲 (VPC),用來為基礎架構的其他部分提供網路服務。
為模組輸入變數設定值
某些輸入變數為「必要」項目,也就是說,模組不會提供預設值。您必須提供明確的值,Terraform 才能正常運作。
-
在
module "test-vpc-module"
區塊中,查看您要設定的輸入變數。這些輸入變數都記錄在 Terraform Registry 中。以下是這個模組的必要輸入變數:-
network_name
:要建立的網路名稱 -
project_id
:要在當中建立這個虛擬私有雲的專案 ID -
subnets
:要建立的子網路清單
-
如要使用大部分的模組,您必須將輸入變數傳遞至模組設定。呼叫模組的設定會負責設定其輸入值,再由系統將輸入值以引數形式傳遞至模組區塊。除了 source
和 version
以外,模組區塊的大部分引數都會設定變數值。
在 Google Cloud 網路模組的 Terraform Registry 頁面中,「Inputs」分頁會說明該模組支援的所有輸入變數。
定義根輸入變數
搭配模組使用輸入變數,以及在任何 Terraform 設定中使用變數,兩者的方法十分類似。常見的模式是先確認您日後可能會變更的模組輸入變數,再於設定的 variables.tf
檔案中,以適合的預設值建立相符變數。建立完成後,系統就能將這些變數以引數形式傳遞至模組區塊。
-
在 Cloud Shell 中執行以下指令,以擷取專案 ID:
-
在編輯器裡的同一目錄中,前往
variables.tf
。 -
為
project_id
變數填入前一指令的輸出內容。您必須按照下方格式為變數設定default
值:
-
在
variables.tf
中填入network_name
變數。您可以使用example-vpc
或任何其他想要的名稱,且必須按照下方格式為變數設定default
值:
定義根輸出值
模組也有輸出值。這些值要在模組中以 output
關鍵字定義。您可以參照 module.<模組名稱>.<輸出名稱>
來存取這些輸出值。如同輸入變數,模組輸出內容會列在 Terraform Registry 的「outputs
」分頁中。
模組輸出內容通常會傳遞至設定的其他部分,或是定義為根模組的輸出內容。本研究室將說明這兩種使用情況。
-
前往設定目錄中的
outputs.tf
檔案,並確認該檔案包含以下內容:
佈建基礎架構
-
在 Cloud Shell 中,前往
simple_project
目錄:
-
初始化 Terraform 設定:
-
建立虛擬私有雲:
- 如要套用變更並繼續操作,請在系統提示時回應 yes。
太好了!您已首次使用模組。設定的輸出內容應會如下所示:
瞭解模組的運作方式
首次使用新模組時,您必須執行 terraform init
或 terraform get
來安裝模組。執行上述任一指令時,Terraform 會在設定所用目錄的 .terraform/modules
目錄中安裝新模組。如果是本機模組,Terraform 會建立模組目錄的符號連結。因此,您不必重新執行 terraform get
,本機模組的任何變更就會立即生效。
清除基礎架構
您已瞭解如何使用 Terraform Registry 中的模組、使用輸入變數設定這些模組,以及透過這些模組取得輸出值。
-
刪除您建立的基礎架構:
- 在系統提示時回應
yes
。 Terraform 隨即會刪除您建立的基礎架構。
點選「Check my progress」,確認目標已達成。
工作 2:建構模組
在上一項工作中,您使用了 Terraform Registry 中的模組,在 Google Cloud 中建立虛擬私有雲網路。雖然正確使用現有 Terraform 模組是重要技能,但對於每個 Terraform 從業人員來說,瞭解如何建立模組也很有幫助。建議您在建立每項 Terraform 設定時,一律假設該設定可能會做為模組使用,因為這樣可幫助您設計出有彈性、可重複使用且可組合的設定。
您可能已知道,Terraform 會將每項設定都視為模組。當您執行 terraform
指令,或是使用 Terraform Cloud 或 Terraform Enterprise 來遠端執行 Terraform 時,系統會將包含 Terraform 設定的目標目錄視為根目錄。
在這項工作中,您將建立一個模組,以便管理用於託管靜態網站的 Compute Storage 值區。
模組結構
Terraform 會將 module
區塊的 source
引數中參照的本機目錄視為模組。新模組的一般檔案結構如下:
.tf
檔案的模組,或是視需要使用任何其他檔案結構。
這些檔案分別具有不同用途:
-
LICENSE
:包含模組的發布授權。當您分享模組時,LICENSE 檔案可讓模組使用者瞭解您是依據哪些條款提供模組。Terraform 本身不會使用這個檔案。 -
README.md
:包含 Markdown 格式的說明文件,用於說明模組的使用方式。Terraform 不會使用這個檔案,但當使用者造訪模組的 Terraform Registry 或 GitHub 頁面時,Terraform Registry 和 GitHub 會顯示這個檔案的內容。 -
main.tf
:包含模組的主要設定組合。您也可以建立其他設定檔,並以適合專案的方式整理這些檔案。 -
variables.tf
:包含模組的變數定義。當他人使用您的模組時,系統會在模組區塊中將變數設定為引數。由於所有 Terraform 值都必須經過定義,因此沒有預設值的變數將成為必要引數。包含預設值的變數也可以模組引數的形式提供,進而覆寫預設值。 -
outputs.tf
:包含模組的輸出內容定義。模組輸出內容會提供給使用模組的設定,因此經常用於針對模組定義的基礎架構,將其特定部分的相關資訊傳遞至設定的其他部分。
請注意以下檔案,確保您不會將其做為模組的一部分發布:
-
terraform.tfstate
和terraform.tfstate.backup
檔案包含 Terraform 狀態。Terraform 會運用這兩個檔案,針對您的設定與其所佈建的基礎架構,追蹤兩者之間的關係。 -
.terraform
目錄包含用於佈建基礎架構的模組和外掛程式。這類檔案是佈建基礎架構時的個別 Terraform 執行個體專屬檔案,而非.tf
檔案中定義的基礎架構設定。 -
*.tfvars
檔案不必與模組一併發布 (除非您也要將其做為獨立 Terraform 設定使用),因為模組輸入變數是透過設定中模組區塊的引數來進行設定。
建立模組
前往主目錄,並建構新的 main.tf
設定檔來建立根模組。接著建立名為 modules
的目錄,當中包含另一個名為 gcs-static-website-bucket
的資料夾。您將在 gcs-static-website-bucket
目錄中使用以下三個 Terraform 設定檔:website.tf
、variables.tf
和 outputs.tf
。
-
為新模組建立目錄:
-
前往模組目錄,然後執行以下指令來建立三個空白檔案:
-
在
gcs-static-website-bucket
目錄中,建立名為README.md
且包含以下內容的檔案:
-
建立另一個名為
LICENSE
且包含以下內容的檔案:
目前的模組目錄結構應如下所示:
-
將這項 Cloud Storage 值區資源新增至
modules/gcs-static-website-bucket
目錄中的website.tf
檔案:
GitHub 提供相關說明文件。
-
前往模組中的
variables.tf
檔案,並新增以下程式碼:
-
在模組的
outputs.tf
檔案中,為模組新增輸出內容:
如同變數,模組輸出內容與根模組輸出內容的功用相同,只不過存取方式有所不同。模組的輸出內容可做為模組物件 (可在呼叫模組的設定中取得) 的唯讀屬性存取。
-
返回根目錄中的
main.tf
,並加入新模組的參照:
-
在主目錄中,為根模組建立
outputs.tf
檔案:
-
在
outputs.tf
檔案中新增以下程式碼:
-
在主目錄中,建立
variables.tf
檔案:
-
在
variables.tf
檔案中新增以下程式碼,並定義project_id
和name
變數:
安裝本機模組
在設定中新增模組後,該模組必須先由 Terraform 安裝才可供使用。terraform get
和 terraform init
指令都可用來安裝及更新模組。terraform init
指令還會初始化後端並安裝外掛程式。
-
安裝模組:
-
佈建值區:
-
在系統提示時回應 yes。系統隨即會佈建值區和其他資源。
將檔案上傳至值區
您已設定自己的模組,並使用該模組建立靜態網站。接著,您可能會想造訪這個靜態網站。不過,目前值區中空無一物,因此網站上不會顯示任何內容。如要讓網站顯示內容,您必須將物件上傳至值區。您可以上傳 GitHub 存放區中 www
目錄的內容。
-
將範例內容下載至主目錄:
-
將檔案複製到值區,其中
YOUR-BUCKET-NAME
要替換為儲存空間值區的名稱:
- 在瀏覽器的新分頁中,前往
https://storage.cloud.google.com/YOUR-BUCKET-NAME/index.html
網站,其中YOUR-BUCKET-NAME
要替換為儲存空間值區的名稱。
點選「Check my progress」,確認目標已達成。
清除網站和基礎架構所用資源
最後,請刪除您剛剛建立的基礎架構,清除專案的所用資源。
-
刪除 Terraform 資源:
在系統提示時回應 yes
,Terraform 隨即會刪除您在本研究室中建立的所有資源。
恭喜!
在本研究室中,您學到了 Terraform 模組的基礎知識,以及使用 Registry 中現有模組的方式。接著,您自行建立了模組,以便建立透過 Cloud Storage 值區託管的靜態網站。過程中,您為設定檔定義了輸入內容、輸出內容和變數,並瞭解建構模組的最佳做法。
完成您的任務
這個自修研究室是「在 Google Cloud 中使用 Terraform 自動化基礎架構」任務的一部分。任務是指一系列相關的研究室課程,藉由課程建立出完整的學習路徑。完成這項任務後即可獲得徽章,以表彰您的成就。您可以公開展示徽章,並在線上履歷或社群媒體帳戶中加入徽章連結。歡迎報名參加這項任務或任何包含本研究室的任務,立即取得完成學分。請參閱「Google Cloud 技能重點加強目錄」來查看所有可參加的任務。
進行下一個研究室
進行下一個 Google Cloud 技能重點加強研究室「管理 Terraform 狀態」,繼續完成任務。
後續步驟/瞭解詳情
以下連結提供更多 Terraform 實作練習機會:
- Google Cloud Marketplace 上的 Hashicorp!
- Hashicorp Learn
- Terraform 社群
- Terraform Google 範例
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2022 年 7 月 13 日
研究室上次測試日期:2022 年 3 月 30 日
Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。