1. 總覽
本研究室將指導您如何使用 Pulumi,這個基礎架構即程式碼工具來佈建及管理 Google Cloud 資源。
學習目標
在本研究室中,您將瞭解如何執行下列操作:
- 安裝及設定 Pulumi
- 編寫 YAML 程式,在 Google Cloud 上建立基礎架構模型
- 使用 Pulumi 佈建及管理 Cloud 資源
- 使用 pulumi 轉換功能,將 YAML 程式轉換為 Python 程式
2. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID
)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
3. 設定基礎架構
安裝及設定 Pulumi
在 Cloud Shell 中執行下列指令,安裝 Pulumi
curl -fsSL https://get.pulumi.com | sh
將 Pulumi 加入路徑,並查看 Pulumi 的說明訊息
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
執行下列指令,設定專案 ID 並授予存取權。你必須按照指令提供的指示進行操作
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
在 Cloud Shell 中建立 GCS 值區,並做為後端使用
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
建立新專案
在 Cloud Shell 中建立專案根目錄
mkdir pulumi-lab && cd pulumi-lab
定義專案檔案(Pulumi 的進入點)
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
定義 YAML 資源
建立目錄,以保存 yaml 格式的雲端資源定義
mkdir yaml-repo
建立含有下列資源定義的檔案「yaml-repo/Pulumi.yaml
」
- 值區
- IAM 繫結
- 包含「Hello World!」字串的文字物件
- 某些輸出內容
resources:
# Create a GCP resource (Storage Bucket)
my-bucket:
type: gcp:storage:Bucket
properties:
location: US
website:
mainPageSuffix: index.html
uniformBucketLevelAccess: true
my-bucket-binding:
type: gcp:storage:BucketIAMBinding
properties:
bucket: ${my-bucket.name}
role: "roles/storage.objectViewer"
members: ["allUsers"]
index-object:
type: gcp:storage:BucketObject
properties:
bucket: ${my-bucket}
source:
fn::stringAsset: Hello World!
outputs:
bucketName: ${my-bucket.url}
部署資源
初始化與設定堆疊
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
檢查堆疊設定,且該金鑰的值應該是 gcp:project,值則是您的專案 ID
pulumi config
此時,目錄結構應如下所示:
├── Pulumi.dev.yaml ├── Pulumi.yaml └── yaml-repo └── Pulumi.yaml
部署堆疊
pulumi up
這個指令會評估您的程式,並決定要進行的資源更新。首先,系統會顯示預覽畫面,概略說明按下指令時將會進行的變更
輸出內容
Previewing update (dev): Downloading plugin gcp v6.44.0: 45.69 MiB / 45.69 MiB [=============] 100.00% 1s Type Name Plan + pulumi:pulumi:Stack pulumi-lab-dev create + ├─ gcp:storage:Bucket my-bucket create + ├─ gcp:storage:BucketObject index-object create + └─ gcp:storage:BucketIAMBinding my-bucket-binding create Outputs: bucketName: output<string> Resources: + 4 to create Do you want to perform this update? [Use arrows to move, type to filter] yes > no details
選取「yes」,系統就會佈建資源。輸出內容應如下所示
Do you want to perform this update? yes Updating (dev): Type Name Status + pulumi:pulumi:Stack pulumi-lab-dev created (3s) + ├─ gcp:storage:Bucket my-bucket created (1s) + ├─ gcp:storage:BucketObject index-object created (0.78s) + └─ gcp:storage:BucketIAMBinding my-bucket-binding created (5s) Outputs: bucketName: "gs://my-bucket-874aa08" Resources: + 4 created Duration: 11s
執行下列指令,輸出定義的輸出內容
pulumi stack output
執行下列指令來驗證變更
gsutil ls $(pulumi stack output bucketName)
輸出內容應如下所示
(輸出內容)
gs://my-bucket-11a9046/index-object-77a5d80
4. 將 YAML 轉換為 Python
將上述範例轉換為 Pulumi Python 程式
pulumi convert --language python --out ./py-repo
檢查 py-repo 中產生的程式碼
cat py-repo/__main__.py
(輸出內容)
import pulumi import pulumi_gcp as gcp my_bucket = gcp.storage.Bucket("my-bucket", location="US", website=gcp.storage.BucketWebsiteArgs( main_page_suffix="index.html", ), uniform_bucket_level_access=True) my_bucket_binding = gcp.storage.BucketIAMBinding("my-bucket-binding", bucket=my_bucket.name, role="roles/storage.objectViewer", members=["allUsers"]) index_object = gcp.storage.BucketObject("index-object", bucket=my_bucket.id, source=pulumi.StringAsset("Hello World!")) pulumi.export("bucketName", my_bucket.url) .......
啟用 Python 虛擬環境
source py-repo/bin/activate
更新 Pulumi.yaml 專案檔案以指向 Python 程式。請注意,執行階段和主要項目已變更
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
嘗試重新部署堆疊,並選取「是」
pulumi up
無須有任何變更,輸出內容應類似下列所示
(輸出內容)
Previewing update (dev): Type Name Plan pulumi:pulumi:Stack pulumi-lab-dev Resources: 4 unchanged Do you want to perform this update? yes Updating (dev): Type Name Status pulumi:pulumi:Stack pulumi-lab-dev Outputs: bucketName: "gs://my-bucket-c2b49ad" Resources: 4 unchanged Duration: 6s
5. 刪除資源
刪除已建立的資源
pulumi destroy
確認畫面看起來會像這樣
Previewing update (dev): Type Name Plan pulumi:pulumi:Stack pulumi-lab-dev Resources: 4 unchanged Do you want to perform this update? [Use arrows to move, type to filter] yes > no details Do you want to perform this destroy? yes Destroying (dev): Type Name Status - pulumi:pulumi:Stack pulumi-lab-dev deleted - ├─ gcp:storage:BucketIAMBinding my-bucket-binding deleted (5s) - ├─ gcp:storage:BucketObject index-object deleted (1s) - └─ gcp:storage:Bucket my-bucket deleted (0.73s) Outputs: - bucketName: "gs://my-bucket-874aa08" Resources: - 4 deleted Duration: 10s
6. 恭喜!
恭喜,您完成了研究室!