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



- 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.
- 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:
- Zasobnik
- Powiązanie uprawnień
- Obiekt tekstowy z ciągiem znaków „Hello World!”.
- 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.