YAML ile Google Cloud'da Pulumi'yi kullanma

1. Genel Bakış

Bu laboratuvarda, Google Cloud kaynaklarını sağlama ve yönetme için bir kod olarak altyapı aracı olan Pulumi'yi nasıl kullanacağınız öğretilmektedir.

Öğrenecekleriniz

Bu laboratuvarda şunları yapmayı öğreneceksiniz:

  • Pulumi'yi yükleme ve yapılandırma
  • Google Cloud'daki altyapınızı modellemek için YAML programı yazma
  • Pulumi kullanarak bulut kaynaklarını sağlama ve yönetme
  • YAML programını Python programına dönüştürmek için pulumi convert komutunu kullanın.

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve 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ı için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması 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ğerinde ücretsiz deneme programından yararlanabilir.

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

Pulumi'yi yola ekleme ve Pulumi'den yardım mesajını görüntüleme

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 GCS paketi oluşturma ve bunu arka uç olarak kullanma

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

Yeni proje oluştur

Cloud Shell'de proje kök dizinini oluşturun.

mkdir pulumi-lab && cd pulumi-lab

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

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 bir dizin oluşturun

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. "Hello World!" 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

Yığın yapılandırmasını kontrol edin. Değer olarak proje kimliğinizle birlikte gcp:project anahtarını görmeniz gerekir.

pulumi config

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

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

Yığını dağıtma

pulumi up

Bu komut, programınızı değerlendirir ve yapılacak kaynak güncellemelerini belirler. Öncelikle, komutu kullandığınızda yapılacak değişikliklerin ana hatlarını gösteren bir önizleme gösterilir.

(Çı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 sağlanır. Çıkışınız şu şekilde görünmelidir:

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ırmak, tanımlanan çıkışları yazdırır.

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ünecek:

(çıkış)

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

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

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

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

py-repo içinde 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ına yönlendirecek şekilde güncelleyin. Çalışma süresinin ve ana girişin değiştiğini fark edin.

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

runtime: python
main: py-repo/
EOT

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

pulumi up

Herhangi bir değişiklik olmamalı ve çıkışınız aşağıdaki gibi görünmelidir.

(çıkış)

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 şu şekilde 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.