YAML ile Google Cloud'da Pulumi'yi kullanma

1. Genel Bakış

Bu laboratuvarda, Google Cloud kaynaklarını sağlamak ve yönetmek için bir kod olarak altyapı aracı olan Pulumi'nin nasıl kullanılacağı öğretilmektedir.

Öğrenecekleriniz

Bu laboratuvarda aşağıdakileri nasıl yapacağınızı öğreneceksiniz:

  • Pulumi'yi yükleme ve yapılandırma
  • Google Cloud'da altyapınızı modellemek için YAML programı yazma
  • Pulumi'yi kullanarak bulut kaynaklarını hazırlayın ve yönetin
  • YAML programını python programına dönüştürmek için pulumi dönüştürme işlevini kullanma

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, siz de deneyin ve kullanılıp kullanılamadığına bakın. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.

3. Altyapı kurulumu

Pulumi'yi Yükleme ve Yapılandırma

Cloud Shell'de Pulumi'yi yüklemek için aşağıdaki komutu çalıştırın

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

Yola Pulumi'yi ekleyin ve Pulumi'den gelen yardım mesajını görüntüleyin

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

Proje kimliğini ayarlamak ve erişimi yetkilendirmek için aşağıdaki komutları çalıştırın. Komutların verdiği talimatları uygulamanız gerekir.

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

Cloud Shell'de bir GCS paketi oluşturun ve bu paketi arka uç olarak kullanın

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

Yeni proje oluştur

Cloud Shell'de proje kök dizini oluşturun

mkdir pulumi-lab && cd pulumi-lab

Proje dosyasını(Pulumi'ye giriş noktası) tanımlama

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

runtime: yaml
main: yaml-repo/
EOT

YAML kaynaklarını tanımlama

Bulut kaynağı tanımlarını yaml biçiminde tutacak dizin oluşturma

mkdir yaml-repo

Aşağıdaki kaynak tanımlarıyla yaml-repo/Pulumi.yaml dosyasını oluşturun

  1. Paket
  2. IAM Bağlama
  3. "Merhaba Dünya!" dizesini içeren bir metin nesnesi
  4. Bazı çıkışlar
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}

Kaynakları dağıtma

Yığını başlatma ve yapılandırma

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

Grup yapılandırmasını kontrol edin. Değer olarak proje kimliğinizi içeren gcp:project anahtarını görürsünüz.

pulumi config

Bu noktada dizin yapısı aşağıdaki gibi görünmelidir:

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

Grupları dağıtma

pulumi up

Bu komut, programınızı değerlendirir ve yapılacak kaynak güncellemelerini belirler. İlk olarak,

(Çıkış)

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

Evet'i seçtiğinizde kaynaklar için temel hazırlama işlemi yapılır. Çıkışınız aşağıdaki gibi görünecektir

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

Aşağıdaki komutu çalıştırarak tanımlanan çıkışları yazdırabilirsiniz.

pulumi stack output

Değişikliği doğrulamak için aşağıdaki komutu çalıştırın

gsutil ls $(pulumi stack output bucketName)

Çıkışınız aşağıdaki gibi görünür

(output)

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

4. YAML'yi Python'a dönüştürün

Yukarıdaki örneği bir Pulumi Python programına dönüştürelim.

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

py-repo'da oluşturulan kodu inceleyin

cat py-repo/__main__.py

(çıkış)

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 sanal ortamını etkinleştirme

source py-repo/bin/activate

Pulumi.yaml proje dosyasını, Python programını işaret edecek şekilde güncelleyin. Çalışma süresinin ve ana girişin değiştirildiğine dikkat edin

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

runtime: python
main: py-repo/
EOT

Grubu yeniden dağıtmayı deneyin ve evet'i seçin.

pulumi up

Herhangi bir değişiklik olmayacaktır ve çıkışınız aşağıdakine benzer şekilde görünecektir.

(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. Kaynakları silme

Oluşturulan kaynakları silme

pulumi destroy

Onayınız şöyle görünür

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

Tebrikler, laboratuvarı tamamladınız.