Sử dụng Pulumi trên Google Cloud bằng YAML

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ã để cấp phép và quản lý các tài nguyên trên Google Cloud.

Kiến thức bạn sẽ học được

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu 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 để lập mô hình 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 theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. 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 (mã này 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ã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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í 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à uỷ quyền quyền truy cập. Bạn cần làm theo hướng dẫn bằng lệnh

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 đến 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 giữ các định nghĩa về tài nguyên trên đám mây ở định dạng yaml

mkdir yaml-repo

Tạo tệp yaml-repo/Pulumi.yaml với các định nghĩa tài nguyên sau đây

  1. Liên kết IAM
  2. Một đối tượng văn bản có chuỗi "Hello World!"
  3. Ngoài ra, một số dữ liệu đầu ra
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 chạy và ngăn xếp cấu hình

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 với giá trị là mã dự án

pulumi config

Tại thời điểm 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 nội dung cập nhật tài nguyên cần thực hiện. Đầu tiên, bản xem trước sẽ trình bày tóm tắt các thay đổi sẽ được thực hiện khi bạn dùng 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 cấp phé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

(đầu ra)

gs://my-bucket-11a9046/index-object-77a5d80

4. Chuyển đổi YAML sang Python

Hãy chuyển đổi ví dụ trên sang chương trình Pulumi Python

pulumi convert --language python --out ./py-repo

Kiểm tra mã đã được tạo trong py-repo

cat py-repo/__main__.py

(đầu ra)

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. Hãy lưu ý rằng thời gian chạy và mục nhập chính đã được 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 rồi chọn yes

pulumi up

Sẽ không có bất kỳ thay đổi nào và kết quả của bạn sẽ có dạng như sau

(đầu ra)

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

Thông báo 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!