1. Обзор
В этой лабораторной работе вы научитесь использовать Pulumi , инструмент «Инфраструктура как код» для предоставления ресурсов Google Cloud и управления ими.
Что вы узнаете
В этой лабораторной работе вы научитесь делать следующее:
- Установите и настройте Пулуми
- Напишите программу YAML для моделирования вашей инфраструктуры в Google Cloud.
- Предоставление облачных ресурсов и управление ими с помощью Pulumi
- Используйте pulumi Convert для преобразования программы YAML в программу Python
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта. - К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
3. Настройка инфраструктуры
Установите и настройте Пулуми
В Cloud Shell выполните следующую команду, чтобы установить Pulumi.
curl -fsSL https://get.pulumi.com | sh
Добавьте Pulumi в путь и просмотрите справочное сообщение от 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. Поздравляем!
Поздравляем, вы закончили лабораторную работу!