本研究室是我們與合作夥伴 Hashicorp 攜手開發而成。如果您在帳戶個人資料中選擇接收產品最新消息、公告和優惠資訊,我們可能會將您的個人資訊提供給本研究室的贊助者 Hashicorp。
GSP751
![Google Cloud 自修研究室標誌](https://cdn.qwiklabs.com/GMOHykaqmlTHiqEeQXTySaMXYPHeIvaqa2qHEzw6Occ%3D)
總覽
透過 Terraform 管理基礎架構的過程中,您建立的設定會越來越複雜。單一 Terraform 設定檔或目錄的複雜度本身沒有任何限制,因此您可以持續在單一目錄中編寫及更新設定檔。不過,如果選擇這麼做,您可能會遇到以下問題:
- 設定檔會越來越難以理解和瀏覽。
- 設定更新作業的風險會較高,原因是更新設定的某個區塊可能會導致其他區塊發生非預期的結果。
- 在設定不同的開發/測試/實際工作環境等作業時,可能會產生越來越多重複的類似設定區塊,增加了更新此部分設定的負擔。
- 當您為了在不同專案和團隊之間分享設定的特定部分,而剪下及貼上設定區塊時,可能會容易發生錯誤且難以維護。
在本研究室中,您將瞭解透過模組解決這些問題的方法、Terraform 模組的結構,以及使用及建立模組時的最佳做法。
模組的功用為何?
只要使用模組,就能透過多種方式解決上述問題,例如:
-
整理設定:您可以透過模組將設定的相關部分分組,方便瀏覽、理解及更新。即使是複雜度一般的基礎架構,也可能需要數百或數千行設定才能實作。只要使用模組,您就能將設定整理成邏輯元件。
-
封裝設定:使用模組的另一個好處,就是可以將設定封裝成獨特的邏輯元件。封裝有助於避免發生非預期的結果 (例如變更設定的某個部分時意外導致其他基礎架構發生異動),並降低發生簡單錯誤的機會 (例如為兩個不同資源取相同名稱)。
-
重複使用設定:如果您未使用現有程式碼編寫所有設定,可能會耗費大量時間且容易發生錯誤。模組可讓您重複使用現有設定 (編寫者可能是您、其他團隊成員,或是發布模組以供您使用的其他 Terraform 從業人員),幫助您節省時間並減少代價高昂的錯誤。您也可以與其他團隊成員或一般大眾分享自己精心編寫的模組,讓大家跟著受惠。
-
提供一致性,並確保設定採用最佳做法:模組也可為設定提供一致性,讓複雜的設定較容易理解,同時確保所有設定皆採用最佳做法。舉例來說,雲端服務供應商提供許多物件儲存空間服務設定選項,例如 Amazon S3 (Simple Storage Service) 或 Google 的 Cloud Storage 值區。許多重大安全事件都與未受到妥善保護的物件儲存空間有關,且由於牽涉的複雜設定選項過多,因此很容易不小心以錯誤方式設定這些服務。
使用模組有助於減少這類錯誤。舉例來說,您可以建立一個模組來說明貴機構所有公開網站值區的設定方式,並針對用於記錄應用程式的私人值區建立另一個模組。此外,如果某種資源的設定需要更新,使用模組可讓您在同一個地方進行更新作業,並將更新內容套用到使用了該模組的所有部分。
目標
在本研究室中,您將瞭解如何執行下列工作:
設定和需求
點選「Start Lab」按鈕前的須知事項
請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。
您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。
如要完成這個研究室活動,請先確認:
- 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意:請使用無痕模式或私密瀏覽視窗執行此研究室。這可以防止個人帳戶和學生帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
注意:如果您擁有個人 Google Cloud 帳戶或專案,請勿用於本研究室,以免產生額外費用。
如何開始研究室及登入 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 產品和服務的選單,請點選左上角的「導覽選單」。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
- 點按 Google Cloud 控制台上方的「啟用 Cloud Shell」圖示
。
連線完成即代表已通過驗證,且專案已設為您的 PROJECT_ID。輸出內容中有一行宣告本工作階段 PROJECT_ID 的文字:
您在本工作階段中的 Cloud Platform 專案會設為「YOUR_PROJECT_ID」
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
-
點按「授權」。
-
輸出畫面應如下所示:
輸出內容:
ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = <project_ID>
輸出內容範例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
附註:如需有關 gcloud
的完整說明,請前往 Google Cloud 並參閱「gcloud CLI overview guide」(gcloud CLI 總覽指南)。
什麼是 Terraform 模組?
Terraform 模組是單一目錄中的一組 Terraform 設定檔。即使是由包含一或多個 .tf
檔案的單一目錄所構成的簡易設定,也算是模組。如果您直接透過這類目錄執行 Terraform 指令,該目錄即為根模組。因此,每個 Terraform 設定都是模組的一部分。一組簡易的 Terraform 設定檔可能會如下所示:
├── LICENSE
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
在這個情況下,如果您在 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 Registry 頁面](https://cdn.qwiklabs.com/jcJ08UOeoo4KQarfhfiv4P334d9eFOqoG5QtPucIZuQ%3D)
這個頁面包含模組相關資訊,以及來源存放區的連結。頁面右側則有用於選取模組版本的下拉式選單介面,以及使用模組佈建基礎架構的操作說明。
呼叫模組時,您必須提供 source
引數。在這個範例中,Terraform 會在 Terraform Registry 中搜尋符合指定字串的模組。您也可以使用網址或本機檔案路徑做為模組來源。如需可用的模組來源清單,請參閱 Terraform 說明文件。
這裡顯示的另一個引數是 version
。version 可讓您針對支援的來源,定義要載入的一或多個模組版本。在本研究室中,您要指定所用模組的確切版本號碼。如果想瞭解指定版本的其他方式,請參閱模組說明文件。
系統會將模組區塊的其他引數視為模組的輸入變數。
建立 Terraform 設定
- 首先在 Cloud Shell 中執行以下指令,從 Google Terraform 模組 GitHub 存放區複製範例簡易專案,並切換至
v6.0.1
分支版本:
git clone https://github.com/terraform-google-modules/terraform-google-network
cd terraform-google-network
git checkout tags/v6.0.1 -b v6.0.1
這可確保所用的版本號碼正確無誤。
-
在 Cloud Shell 工具列中,按一下「開啟編輯器」。如要在 Cloud Shell 與程式碼編輯器之間切換,請視需求點選「開啟編輯器」或「開啟終端機」。或者,您也可以點選「在新視窗中開啟」,在另一個分頁中保持開啟編輯器。
-
在編輯器中前往 terraform-google-network/examples/simple_project
,並開啟 main.tf
檔案。main.tf
設定應如下所示:
module "test-vpc-module" {
source = "terraform-google-modules/network/google"
version = "~> 6.0"
project_id = var.project_id # Replace this with your project ID
network_name = "my-custom-mode-network"
mtu = 1460
subnets = [
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
subnet_region = "us-west1"
},
{
subnet_name = "subnet-02"
subnet_ip = "10.10.20.0/24"
subnet_region = "us-west1"
subnet_private_access = "true"
subnet_flow_logs = "true"
},
{
subnet_name = "subnet-03"
subnet_ip = "10.10.30.0/24"
subnet_region = "us-west1"
subnet_flow_logs = "true"
subnet_flow_logs_interval = "INTERVAL_10_MIN"
subnet_flow_logs_sampling = 0.7
subnet_flow_logs_metadata = "INCLUDE_ALL_METADATA"
subnet_flow_logs_filter = "false"
}
]
}
這項設定包含一個重要區塊:
-
module "test-vpc-module"
定義了虛擬私有雲 (VPC),用來為基礎架構的其他部分提供網路服務。
設定模組輸入變數的值
某些輸入變數為「必要」項目,也就是說,模組不會提供預設值。您必須提供明確的值,Terraform 才能正常運作。
您必須將輸入變數傳遞至模組設定,才能使用大部分的模組。呼叫模組的設定會負責設定輸入值,再由系統將輸入值以引數形式傳遞至模組區塊。除了 source
和 version
以外,模組區塊的大部分引數都會設定變數值。
在 Google Cloud 網路模組的 Terraform Registry 頁面中,「Inputs」分頁會說明該模組支援的所有輸入變數。
定義根輸入變數
搭配模組使用輸入變數,以及在任何 Terraform 設定中使用變數,兩者的方法十分類似。常見的模式是先確認您日後可能會變更的模組輸入變數,再於設定的 variables.tf
檔案中,以適合的預設值建立相符變數。建立完成後,系統就能將這些變數以引數形式傳遞至模組區塊。
- 在 Cloud Shell 中執行以下指令,以擷取專案 ID:
gcloud config list --format 'value(core.project)'
-
在編輯器裡的同一目錄中,前往 variables.tf
。
-
為 project_id
變數填入前一指令的輸出內容。您必須按照下方格式為變數設定 default
值:
variable "project_id" {
description = "The project ID to host the network in"
default = "FILL IN YOUR PROJECT ID HERE"
}
- 在
variables.tf
中填入 network_name
變數。您可以使用 example-vpc
或任何其他想要的名稱,並按照下方格式為變數設定 default
值:
variable "network_name" {
description = "The name of the VPC network being created"
default = "example-vpc"
}
- 返回
main.tf
檔案,並將 network_name
參數的值更新為 var.network_name
,以便使用您剛定義的變數。
module "test-vpc-module" {
...
project_id = var.project_id
network_name = var.network_name
...
- 在
main.tf
檔案中,將第 35、40 和 47 行的子網路區域由 us-west1
更新為 。這可以確保子網路會在您專案允許的區域中建立。模組應會如下所示:
subnets = [
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
},
{
subnet_name = "subnet-02"
subnet_ip = "10.10.20.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
subnet_private_access = "true"
subnet_flow_logs = "true"
},
{
subnet_name = "subnet-03"
subnet_ip = "10.10.30.0/24"
subnet_region = "{{{project_0.default_region | REGION}}}"
...
..
}
定義根輸出值
模組也有輸出值。這些值要在模組中以 output
關鍵字定義。您可以參照 module.<MODULE NAME>.<OUTPUT NAME>
來存取這些輸出值。如同輸入變數,模組輸出內容會列在 Terraform Registry 的「outputs
」分頁中。
模組輸出內容通常會傳遞至設定的其他部分,或是定義為根模組的輸出內容。本研究室將說明這兩種使用情況。
- 前往設定目錄中的
outputs.tf
檔案,並確認該檔案包含以下內容:
output "network_name" {
value = module.test-vpc-module.network_name
description = "The name of the VPC being created"
}
output "network_self_link" {
value = module.test-vpc-module.network_self_link
description = "The URI of the VPC being created"
}
output "project_id" {
value = module.test-vpc-module.project_id
description = "VPC project id"
}
output "subnets_names" {
value = module.test-vpc-module.subnets_names
description = "The names of the subnets being created"
}
output "subnets_ips" {
value = module.test-vpc-module.subnets_ips
description = "The IP and cidrs of the subnets being created"
}
output "subnets_regions" {
value = module.test-vpc-module.subnets_regions
description = "The region where subnets will be created"
}
output "subnets_private_access" {
value = module.test-vpc-module.subnets_private_access
description = "Whether the subnets will have access to Google API's without a public IP"
}
output "subnets_flow_logs" {
value = module.test-vpc-module.subnets_flow_logs
description = "Whether the subnets will have VPC flow logs enabled"
}
output "subnets_secondary_ranges" {
value = module.test-vpc-module.subnets_secondary_ranges
description = "The secondary ranges associated with these subnets"
}
output "route_names" {
value = module.test-vpc-module.route_names
description = "The routes associated with this VPC"
}
佈建基礎架構
- 在 Cloud Shell 中,前往
simple_project
目錄:
cd ~/terraform-google-network/examples/simple_project
- 初始化 Terraform 設定:
terraform init
- 建立虛擬私有雲:
terraform apply
- 如要套用變更並繼續操作,請在系統提示時回應 yes。
太好了!您已首次使用模組。設定的輸出內容應會如下所示:
Outputs:
network_name = "example-vpc"
network_self_link = "https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-01-a68489b0625b/global/networks/example-vpc"
project_id = ""
route_names = []
subnets_flow_logs = [
false,
true,
true,
]
subnets_ips = [
"10.10.10.0/24",
"10.10.20.0/24",
"10.10.30.0/24",
]
subnets_names = [
"subnet-01",
"subnet-02",
"subnet-03",
]
....
....
瞭解模組的運作方式
首次使用新模組時,您必須執行 terraform init
或 terraform get
來安裝模組。執行上述任一指令時,Terraform 會在設定所用目錄的 .terraform/modules
目錄中安裝新模組。如果是本機模組,Terraform 會建立模組目錄的符號連結。因此,您不必重新執行 terraform get
,本機模組的任何變更就會立即生效。
清除基礎架構
您已瞭解如何使用 Terraform Registry 中的模組、使用輸入變數設定這些模組,以及透過這些模組取得輸出值。
- 刪除您建立的基礎架構:
terraform destroy
-
在系統提示時回應 yes
。
Terraform 隨即會刪除您建立的基礎架構。
-
刪除基礎架構後,請刪除 terraform-google-network
資料夾。
cd ~
rm -rd terraform-google-network -f
點選「Check my progress」,確認目標已達成。
佈建基礎架構。
工作 2:建構模組
在上一項工作中,您使用了 Terraform Registry 中的模組,在 Google Cloud 中建立虛擬私有雲網路。雖然正確使用現有 Terraform 模組是重要技能,但對於每個 Terraform 從業人員來說,瞭解如何建立模組也很有幫助。建議您在建立每項 Terraform 設定時,一律假設該設定可能會做為模組使用,因為這樣可幫助您設計出有彈性、可重複使用且可組合的設定。
您可能已知道,Terraform 會將每項設定都視為模組。當您執行 terraform
指令,或是使用 Terraform Cloud 或 Terraform Enterprise 來遠端執行 Terraform 時,系統會將包含 Terraform 設定的目標目錄視為根目錄。
在這項工作中,您將建立一個模組,以便管理用於託管靜態網站的 Compute Storage 值區。
模組結構
Terraform 會將 module
區塊的 source
引數中參照的本機目錄視為模組。新模組的一般檔案結構如下:
├── LICENSE
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
附註:這些全都不是必要檔案,而且當 Terraform 使用您的模組時,這些檔案對於 Terraform 來說都不具有任何特殊意義。您可以建立包含單一 .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 設定使用),因為模組輸入變數是透過設定中模組區塊的引數來進行設定。
附註:如要在 Git 等版本管控系統中追蹤模組異動情形,建議您在版本管控系統的設定中忽略這些檔案。如需範例說明,請查看 GitHub 中的這個 .gitignore 檔案。
建立模組
前往主目錄,並建構新的 main.tf
設定檔來建立根模組。接著建立名為「modules」的目錄,當中包含另一個名為 gcs-static-website-bucket
的資料夾。您將在 gcs-static-website-bucket
目錄中使用以下三個 Terraform 設定檔:website.tf
、variables.tf
和 outputs.tf
。
- 為新模組建立目錄:
cd ~
touch main.tf
mkdir -p modules/gcs-static-website-bucket
- 前往模組目錄,然後執行以下指令來建立三個空白檔案:
cd modules/gcs-static-website-bucket
touch website.tf variables.tf outputs.tf
- 在
gcs-static-website-bucket
目錄中執行下列指令,建立名為 README.md
且包含以下內容的檔案:
tee -a README.md <<EOF
# GCS static website bucket
This module provisions Cloud Storage buckets configured for static website hosting.
EOF
附註:為模組選擇正確授權的方式不在本研究室的涵蓋範圍內。本研究室將使用 Apache 2.0 開放原始碼授權。
- 建立另一個名為
LICENSE
且包含以下內容的檔案:
tee -a LICENSE <<EOF
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
EOF
附註:這些檔案都不是必要檔案,也不會由 Terraform 使用。不過,如果模組可能會與他人分享,建議您準備這些檔案。
目前的模組目錄結構應如下所示:
main.tf
modules/
└── gcs-static-website-bucket
├── LICENSE
├── README.md
├── website.tf
├── outputs.tf
└── variables.tf
- 將這項 Cloud Storage 值區資源新增至
modules/gcs-static-website-bucket
目錄中的 website.tf
檔案:
resource "google_storage_bucket" "bucket" {
name = var.name
project = var.project_id
location = var.location
storage_class = var.storage_class
labels = var.labels
force_destroy = var.force_destroy
uniform_bucket_level_access = true
versioning {
enabled = var.versioning
}
dynamic "retention_policy" {
for_each = var.retention_policy == null ? [] : [var.retention_policy]
content {
is_locked = var.retention_policy.is_locked
retention_period = var.retention_policy.retention_period
}
}
dynamic "encryption" {
for_each = var.encryption == null ? [] : [var.encryption]
content {
default_kms_key_name = var.encryption.default_kms_key_name
}
}
dynamic "lifecycle_rule" {
for_each = var.lifecycle_rules
content {
action {
type = lifecycle_rule.value.action.type
storage_class = lookup(lifecycle_rule.value.action, "storage_class", null)
}
condition {
age = lookup(lifecycle_rule.value.condition, "age", null)
created_before = lookup(lifecycle_rule.value.condition, "created_before", null)
with_state = lookup(lifecycle_rule.value.condition, "with_state", null)
matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null)
num_newer_versions = lookup(lifecycle_rule.value.condition, "num_newer_versions", null)
}
}
}
}
GitHub 為供應商說明文件。
- 前往模組中的
variables.tf
檔案,並新增以下程式碼:
variable "name" {
description = "The name of the bucket."
type = string
}
variable "project_id" {
description = "The ID of the project to create the bucket in."
type = string
}
variable "location" {
description = "The location of the bucket."
type = string
}
variable "storage_class" {
description = "The Storage Class of the new bucket."
type = string
default = null
}
variable "labels" {
description = "A set of key/value label pairs to assign to the bucket."
type = map(string)
default = null
}
variable "bucket_policy_only" {
description = "Enables Bucket Policy Only access to a bucket."
type = bool
default = true
}
variable "versioning" {
description = "While set to true, versioning is fully enabled for this bucket."
type = bool
default = true
}
variable "force_destroy" {
description = "When deleting a bucket, this boolean option will delete all contained objects. If false, Terraform will fail to delete buckets which contain objects."
type = bool
default = true
}
variable "iam_members" {
description = "The list of IAM members to grant permissions on the bucket."
type = list(object({
role = string
member = string
}))
default = []
}
variable "retention_policy" {
description = "Configuration of the bucket's data retention policy for how long objects in the bucket should be retained."
type = object({
is_locked = bool
retention_period = number
})
default = null
}
variable "encryption" {
description = "A Cloud KMS key that will be used to encrypt objects inserted into this bucket"
type = object({
default_kms_key_name = string
})
default = null
}
variable "lifecycle_rules" {
description = "The bucket's Lifecycle Rules configuration."
type = list(object({
# Object with keys:
# - type - The type of the action of this Lifecycle Rule. Supported values: Delete and SetStorageClass.
# - storage_class - (Required if action type is SetStorageClass) The target Storage Class of objects affected by this Lifecycle Rule.
action = any
# Object with keys:
# - age - (Optional) Minimum age of an object in days to satisfy this condition.
# - created_before - (Optional) Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition.
# - with_state - (Optional) Match to live and/or archived objects. Supported values include: "LIVE", "ARCHIVED", "ANY".
# - matches_storage_class - (Optional) Storage Class of objects to satisfy this condition. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY.
# - num_newer_versions - (Optional) Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition.
condition = any
}))
default = []
}
- 在模組的
outputs.tf
檔案中,為模組新增輸出內容:
output "bucket" {
description = "The created storage bucket"
value = google_storage_bucket.bucket
}
如同變數,模組輸出內容與根模組輸出內容的功用相同,只不過存取方式有所不同。模組的輸出內容可做為模組物件 (可在呼叫模組的設定中取得) 的唯讀屬性存取。
- 返回「根目錄」中的
main.tf
,並加入新模組的參照:
module "gcs-static-website-bucket" {
source = "./modules/gcs-static-website-bucket"
name = var.name
project_id = var.project_id
location = "{{{project_0.default_region | REGION}}}"
lifecycle_rules = [{
action = {
type = "Delete"
}
condition = {
age = 365
with_state = "ANY"
}
}]
}
- 在「根目錄」中,為根模組建立
outputs.tf
檔案:
cd ~
touch outputs.tf
- 在
outputs.tf
檔案中新增以下程式碼:
output "bucket-name" {
description = "Bucket names."
value = "module.gcs-static-website-bucket.bucket"
}
- 在「根目錄」中建立
variables.tf
檔案:
touch variables.tf
- 將下列程式碼加入
variables.tf
檔案,並將 project_id
和 name
變數預設為您的專案 ID:。
variable "project_id" {
description = "The ID of the project in which to provision resources."
type = string
default = "FILL IN YOUR PROJECT ID HERE"
}
variable "name" {
description = "Name of the buckets to create."
type = string
default = "FILL IN A (UNIQUE) BUCKET NAME HERE"
}
注意:您必須設定全域不重複的 Storage 值區名稱。建議您使用自己的名字和日期建立不重複的值區名稱。您也可以使用專案 ID。
安裝本機模組
在設定中新增模組後,該模組必須先由 Terraform 安裝才可供使用。terraform get
和 terraform init
指令都可用來安裝及更新模組。terraform init
指令還會初始化後端並安裝外掛程式。
- 安裝模組:
terraform init
- 佈建值區:
terraform apply
- 在系統提示時回應 yes。系統隨即會佈建值區和其他資源。
將檔案上傳至值區
您已設定自己的模組,並使用該模組建立靜態網站。接著,您可能會想造訪這個靜態網站。不過,目前值區中空無一物,因此網站上不會顯示任何內容。如要讓網站顯示內容,您必須將物件上傳至值區。您可以上傳 GitHub 存放區中 www
目錄的內容。
- 將範例內容下載至主目錄:
cd ~
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html
- 將檔案複製到值區,其中
YOUR-BUCKET-NAME
要替換為 Storage 值區的名稱:
gsutil cp *.html gs://YOUR-BUCKET-NAME
- 在瀏覽器的新分頁中,前往
https://storage.cloud.google.com/YOUR-BUCKET-NAME/index.html
網站,其中 YOUR-BUCKET-NAME
要替換為 Storage 值區的名稱。
您應該會看到顯示「這裡沒有任何內容可查看」的基本 HTML 網頁。
點選「Check my progress」,確認目標已達成。
建構模組。
清除網站和基礎架構所用資源
最後,請刪除您剛剛建立的基礎架構,清除專案所用的資源。
- 刪除 Terraform 資源:
terraform destroy
在系統提示時回應 yes
,Terraform 隨即會刪除您在本研究室中建立的所有資源。
恭喜!
在本研究室中,您學到了 Terraform 模組的基礎知識,以及使用 Registry 中現有模組的方式。接著,您自行建立了模組,以便建立透過 Cloud Storage 值區託管的靜態網站。過程中,您為設定檔定義了輸入內容、輸出內容和變數,並瞭解建構模組的最佳做法。
後續步驟/瞭解詳情
以下連結提供更多 Terraform 實作練習機會:
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 1 月 26 日
研究室上次測試日期:2023 年 12 月 11 日
Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。