1. Tổng quan
Phòng thí nghiệm này hướng dẫn bạn cách sử dụng Pulumi, một công cụ Cơ sở hạ tầng dưới dạng mã để cung cấp và quản lý tài nguyên Google Cloud.
Kiến thức bạn sẽ học được
Trong phòng thí nghiệm này, bạn sẽ học cách thực hiện những việc sau:
- Cài đặt và định cấu hình Pulumi
- Viết chương trình YAML để mô hình hoá cơ sở hạ tầng của bạn trên Google Cloud
- Cung cấp và quản lý tài nguyên trên đám mây bằng Pulumi
- Sử dụng pulumi convert để chuyển đổi chương trình YAML thành chương trình Python
2. Thiết lập và yêu cầu
Thiết lập môi trường tự học
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



- Project name (Tên dự án) là tên hiển thị cho những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật vị trí này bất cứ lúc nào.
- Project ID (Mã dự án) là mã duy nhất trên tất cả các dự án của Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi đó. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử mã của riêng mình và xem mã đó có dùng được hay không. Bạn không thể thay đổi mã này sau bước này và mã sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn tham khảo, có một giá trị thứ ba là Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, thậm chí là không tốn chi phí. Để tắt các tài nguyên nhằm tránh phát sinh chi phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
3. Thiết lập cơ sở hạ tầng
Cài đặt và định cấu hình Pulumi
Trong Cloud Shell, hãy chạy lệnh sau để cài đặt Pulumi
curl -fsSL https://get.pulumi.com | sh
Thêm Pulumi vào đường dẫn và xem thông báo trợ giúp từ Pulumi
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
Chạy các lệnh sau để đặt mã dự án và cho phép truy cập. Bạn cần làm theo hướng dẫn do các lệnh cung cấp
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
Trong Cloud Shell, hãy tạo một bộ chứa GCS và sử dụng bộ chứa đó làm phần phụ trợ
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
Tạo dự án mới
Trong Cloud Shell, hãy tạo thư mục gốc của dự án
mkdir pulumi-lab && cd pulumi-lab
Xác định tệp dự án(điểm truy cập vào Pulumi)
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
Xác định tài nguyên YAML
Tạo thư mục để lưu trữ các định nghĩa tài nguyên trên đám mây ở định dạng YAML
mkdir yaml-repo
Tạo tệp yaml-repo/Pulumi.yaml có các định nghĩa tài nguyên sau
- Bộ chứa
- Liên kết IAM
- Một đối tượng văn bản có chuỗi "Hello World!"
- Và một số kết quả
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}
Triển khai tài nguyên
Khởi động và định cấu hình ngăn xếp
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
Kiểm tra cấu hình ngăn xếp và bạn sẽ thấy khoá gcp:project có mã dự án làm giá trị
pulumi config
Lúc này, cấu trúc thư mục sẽ có dạng như sau
├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
└── Pulumi.yaml
Triển khai ngăn xếp
pulumi up
Lệnh này đánh giá chương trình của bạn và xác định các bản cập nhật tài nguyên cần thực hiện. Trước tiên, một bản xem trước sẽ xuất hiện để nêu rõ những thay đổi sẽ được thực hiện khi bạn thực hiện lệnh
(Kết quả)
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
Chọn yes (có) và các tài nguyên sẽ được cung cấp. Kết quả của bạn sẽ có dạng như sau
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
Việc chạy lệnh sau sẽ in các kết quả đã được xác định
pulumi stack output
Chạy lệnh sau để xác minh thay đổi
gsutil ls $(pulumi stack output bucketName)
Kết quả của bạn sẽ có dạng như sau
(kết quả)
gs://my-bucket-11a9046/index-object-77a5d80
4. Chuyển đổi YAML sang Python
Hãy chuyển đổi ví dụ trên thành chương trình Pulumi Python
pulumi convert --language python --out ./py-repo
Kiểm tra mã đã tạo trong py-repo
cat py-repo/__main__.py
(kết quả)
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)
.......
Kích hoạt môi trường ảo Python
source py-repo/bin/activate
Cập nhật tệp dự án Pulumi.yaml để trỏ đến chương trình Python. Lưu ý rằng thời gian chạy và mục nhập chính đã thay đổi
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
Thử triển khai lại ngăn xếp và chọn yes (có)
pulumi up
Không có thay đổi nào và kết quả của bạn sẽ có dạng tương tự như sau
(kết quả)
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. Xoá tài nguyên
Xoá các tài nguyên đã tạo
pulumi destroy
Xác nhận của bạn sẽ có dạng như sau
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. Xin chúc mừng!
Xin chúc mừng, bạn đã hoàn thành phòng thí nghiệm!