Użycie Pulumi w Google Cloud za pomocą YAML

1. Przegląd

Z tego modułu dowiesz się, jak używać Pulumi, narzędzia do infrastruktury jako kodu, do udostępniania zasobów Google Cloud i zarządzania nimi.

Czego się nauczysz

W tym module nauczysz się:

  • Instalowanie i konfigurowanie Pulumi
  • Napisz program w YAML-u, aby modelować infrastrukturę w Google Cloud
  • Provisioning zasobów w chmurze i zarządzanie nimi za pomocą Pulumi
  • Użyj polecenia pulumi convert, aby przekonwertować program YAML na program w Pythonie.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

3. Konfiguracja infrastruktury

Instalowanie i konfigurowanie Pulumi

Aby zainstalować Pulumi, w Cloud Shell uruchom to polecenie:

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

Dodaj Pulumi do ścieżki i wyświetl komunikat pomocy z Pulumi

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

Aby ustawić identyfikator projektu i autoryzować dostęp, uruchom te polecenia: Postępuj zgodnie z instrukcjami podanymi w poleceniach.

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

Tworzenie zasobnika GCS w Cloud Shell i używanie go jako backendu

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

Utwórz nowy projekt

Tworzenie katalogu głównego projektu w Cloud Shell

mkdir pulumi-lab && cd pulumi-lab

Zdefiniuj plik projektu(punkt wejścia do Pulumi)

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

runtime: yaml
main: yaml-repo/
EOT

Definiowanie zasobów YAML

Utwórz katalog do przechowywania definicji zasobów w chmurze w formacie YAML.

mkdir yaml-repo

Utwórz plik yaml-repo/Pulumi.yaml z tymi definicjami zasobów:

  1. Zasobnik
  2. Powiązanie uprawnień
  3. Obiekt tekstowy z ciągiem znaków „Hello World!”.
  4. i niektóre dane wyjściowe.
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}

Wdrażanie zasobów

Inicjowanie i konfigurowanie stosu

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

Sprawdź konfigurację stosu. Powinien zawierać klucz gcp:project z identyfikatorem projektu jako wartością.

pulumi config

W tym momencie struktura katalogu powinna wyglądać tak:

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

Wdrażanie stosu

pulumi up

To polecenie ocenia program i określa, jakie aktualizacje zasobów należy wprowadzić. Najpierw wyświetlany jest podgląd, który przedstawia zmiany, jakie zostaną wprowadzone po wykonaniu polecenia.

Dane wyjściowe

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

Kliknij Tak, aby udostępnić zasoby. Dane wyjściowe powinny wyglądać tak:

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

Uruchomienie tego polecenia spowoduje wyświetlenie zdefiniowanych danych wyjściowych.

pulumi stack output

Aby sprawdzić zmianę, uruchom to polecenie:

gsutil ls $(pulumi stack output bucketName)

Dane wyjściowe będą wyglądać tak:

(dane wyjściowe)

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

4. Konwertowanie YAML na Python

Przekształćmy powyższy przykład w program Pulumi w Pythonie.

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

Sprawdź kod wygenerowany w py-repo.

cat py-repo/__main__.py

(dane wyjściowe)

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

Aktywowanie wirtualnego środowiska Pythona

source py-repo/bin/activate

Zaktualizuj plik projektu Pulumi.yaml, aby wskazywał program w Pythonie. Zwróć uwagę, że czas działania i główny wpis zostały zmienione.

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

runtime: python
main: py-repo/
EOT

Spróbuj ponownie wdrożyć stos i kliknij yes (tak).

pulumi up

Nie powinno to spowodować żadnych zmian, a dane wyjściowe powinny wyglądać podobnie do tych:

(dane wyjściowe)

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. Usuwanie zasobów

Usuwanie utworzonych zasobów

pulumi destroy

Potwierdzenie będzie wyglądać tak:

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

Gratulacje! Moduł został ukończony.