1. Omówienie
W tym module dowiesz się, jak używać Pulumi – narzędzia „Infrastructure as Code” do udostępniania zasobów Google Cloud i zarządzania nimi.
Czego się nauczysz
Z tego modułu dowiesz się, jak:
- Instalowanie i konfigurowanie Pulumi
- Pisanie programu w formacie YAML do modelowania infrastruktury w Google Cloud
- Udostępnianie zasobów Cloud i zarządzanie nimi za pomocą Pulumi
- Użyj pulumi convert, aby przekonwertować program w formacie YAML na program w Pythonie.
2. Konfiguracja i wymagania
Konfigurowanie środowiska we własnym tempie
- 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 jest wyświetlaną nazwą uczestników tego projektu. 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 niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Cloud Console automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem musisz odwoływać się do identyfikatora projektu (zazwyczaj jest to
PROJECT_ID
). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego konta i sprawdzić, czy jest ono dostępne. Po tym kroku nie można go zmienić. Pozostanie ona niezmieniona przez cały czas trwania projektu. - Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, którego używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Przejście przez ten Codelab nie powinno wiązać się z wielkimi kosztami, jeśli w ogóle będą jakieś. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, możesz usunąć utworzone przez siebie 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ć aplikację Pulumi, w Cloud Shell uruchom to polecenie
curl -fsSL https://get.pulumi.com | sh
Dodaj do ścieżki Pulumi i wyświetl komunikat pomocy od 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 podane niżej polecenia. Postępuj zgodnie z instrukcjami podanymi w poleceniach
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
Utwórz w Cloud Shell zasobnik GCS i użyj go jako backendu
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
Utwórz nowy projekt
Utwórz w Cloud Shell katalog główny projektu
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 chmury 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 kilka wyników
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 konfiguracja stosu
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
Sprawdź konfigurację stosu. Powinieneś zobaczyć klucz gcp:project z identyfikatorem projektu jako wartością.
pulumi config
W tym momencie struktura katalogów 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 aktualizacje zasobów, które należy wprowadzić. Najpierw wyświetla się podgląd z informacjami o zmianach, które zostaną wprowadzone po uruchomieniu 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
Wybierz yes (tak), a zasoby zostaną udostępnione. 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 wydrukowanie 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 pliku YAML na Pythona
Przekonwertujmy ten przykład na 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 środowiska wirtualnego 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ć pakiet i wybierz tak.
pulumi up
Nie powinno być żadnych zmian, a dane wyjściowe powinny wyglądać mniej więcej tak
(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
usunąć utworzone zasoby.
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! Masz ukończony ten moduł.