1. Обзор
В этой лабораторной работе вы научитесь использовать Pulumi — инструмент «Инфраструктура как код» для выделения и управления ресурсами Google Cloud.
Что вы узнаете
В этой лабораторной работе вы научитесь выполнять следующие действия:
- Установите и настройте Pulumi.
- Напишите программу на языке YAML для моделирования вашей инфраструктуры в Google Cloud.
- Предоставление и управление облачными ресурсами с помощью Pulumi.
- Используйте pulumi convert для преобразования программы в формате YAML в программу на Python.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
3. Настройка инфраструктуры
Установка и настройка Pulumi
В Cloud Shell выполните следующую команду для установки Pulumi.
curl -fsSL https://get.pulumi.com | sh
Добавьте Pulumi в переменную PATH и просмотрите справку от Pulumi.
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
Выполните следующие команды, чтобы установить идентификатор проекта и авторизовать доступ. Необходимо следовать инструкциям, приведенным в командах.
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
В Cloud Shell создайте корзину GCS и используйте её в качестве бэкэнда.
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
Создать новый проект
В Cloud Shell создайте корневой каталог проекта.
mkdir pulumi-lab && cd pulumi-lab
Определите файл проекта (точку входа в Pulumi).
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
Определение ресурсов YAML
Создайте каталог для хранения определений облачных ресурсов в формате YAML.
mkdir yaml-repo
Создайте файл yaml-repo/Pulumi.yaml со следующими определениями ресурсов.
- Ведро
- Привязка IAM
- Текстовый объект со строкой "Hello World!"
- И некоторые результаты
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}
Разверните ресурсы
Инициализация и настройка стека
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
Проверьте конфигурацию стека, и вы должны увидеть ключ gcp:project со значением, равным идентификатору вашего проекта.
pulumi config
На данном этапе структура каталогов должна выглядеть следующим образом.
├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
└── Pulumi.yaml
Разверните стек
pulumi up
Эта команда оценивает вашу программу и определяет, какие изменения ресурсов необходимо внести. Сначала отображается предварительный просмотр, в котором описываются изменения, которые будут внесены после выполнения команды.
(Выход)
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
Выберите «да» , и ресурсы будут выделены. В результате должен получиться следующий вывод.
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
Выполнение следующей команды выведет на экран определенные параметры.
pulumi stack output
Выполните следующую команду, чтобы проверить изменения.
gsutil ls $(pulumi stack output bucketName)
Результат будет выглядеть следующим образом.
(выход)
gs://my-bucket-11a9046/index-object-77a5d80
4. Преобразование YAML в Python
Давайте преобразуем приведенный выше пример в программу на языке Pulumi Python.
pulumi convert --language python --out ./py-repo
Изучите код, сгенерированный в py-repo.
cat py-repo/__main__.py
(выход)
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
source py-repo/bin/activate
Обновите файл проекта Pulumi.yaml , указав путь к программе на Python. Обратите внимание, что были изменены параметры среды выполнения и основной записи.
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
Попробуйте повторно развернуть стек и выберите «да».
pulumi up
Никаких изменений быть не должно, и ваш результат должен выглядеть примерно так.
(выход)
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. Удалите ресурсы.
Удалите созданные ресурсы.
pulumi destroy
Ваше подтверждение будет выглядеть так.
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. Поздравляем!
Поздравляем, вы завершили лабораторную работу!