Menggunakan Pulumi di Google Cloud dengan YAML

1. Ringkasan

Lab ini mengajarkan cara menggunakan Pulumi, sebuah alat Infrastructure as Code untuk menyediakan dan mengelola resource Google Cloud.

Yang akan Anda pelajari

Di lab ini, Anda akan mempelajari cara melakukan hal-hal berikut:

  • Menginstal dan mengonfigurasi Pulumi
  • Menulis program YAML untuk membuat model infrastruktur Anda di Google Cloud
  • Menyediakan dan mengelola resource Cloud menggunakan Pulumi
  • Menggunakan pulumi convert untuk mengonversi program YAML ke program python

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai PROJECT_ID). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

3. Penyiapan infrastruktur

Instal dan Konfigurasi Pulumi

Di Cloud Shell, jalankan perintah berikut untuk menginstal Pulumi

curl -fsSL https://get.pulumi.com | sh

Tambahkan Pulumi ke jalur dan lihat pesan bantuan dari Pulumi

export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h

Jalankan perintah berikut untuk menetapkan project ID dan mengizinkan akses. Anda harus mengikuti petunjuk yang diberikan oleh perintah

export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login

Di Cloud Shell, membuat bucket GCS dan menggunakannya sebagai backend

gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}

Membuat project baru

Di Cloud Shell, buat direktori root project

mkdir pulumi-lab && cd pulumi-lab

Tentukan file project(titik entri ke Pulumi)

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: yaml
main: yaml-repo/
EOT

Menentukan resource YAML

Membuat direktori untuk menyimpan definisi resource cloud dalam format yaml

mkdir yaml-repo

Buat file yaml-repo/Pulumi.yaml dengan definisi resource berikut

  1. Bucket
  2. Binding IAM
  3. Objek teks dengan string "Hello World!"
  4. Dan beberapa output
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}

Men-deploy resource

Melakukan inisialisasi dan stack konfigurasi

export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID

Periksa konfigurasi stack dan Anda akan melihat kunci gcp:project dengan project ID sebagai nilai

pulumi config

Pada tahap ini, struktur direktori akan terlihat seperti berikut

├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
    └── Pulumi.yaml

Men-deploy stack

pulumi up

Perintah ini mengevaluasi program Anda dan menentukan pembaruan sumber daya yang akan dilakukan. Pertama, pratinjau ditampilkan yang menguraikan perubahan yang akan dibuat ketika Anda perintah

(Output)

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

Pilih ya dan materi akan disediakan. Output Anda akan terlihat seperti ini

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

Menjalankan perintah berikut akan mencetak output yang ditentukan

pulumi stack output

Jalankan perintah berikut untuk memverifikasi perubahan

gsutil ls $(pulumi stack output bucketName)

Output Anda akan terlihat seperti ini

(output)

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

4. Konversi YAML ke Python

Mari konversi contoh di atas menjadi program Python Pulumi

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

Memeriksa kode yang dibuat di py-repo

cat py-repo/__main__.py

(output)

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)
.......

Mengaktifkan lingkungan virtual Python

source py-repo/bin/activate

Update file project Pulumi.yaml agar mengarah ke program python. Perhatikan bahwa runtime dan entri utama telah diubah

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: python
main: py-repo/
EOT

Coba deploy ulang stack dan pilih ya

pulumi up

Seharusnya tidak ada perubahan dan output Anda akan terlihat seperti ini

(output)

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. Menghapus resource

Menghapus resource yang dibuat

pulumi destroy

Konfirmasi Anda akan terlihat seperti ini

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. Selamat!

Selamat, kamu telah menyelesaikan lab!