Используйте Pulumi в Google Cloud с YAML

1. Обзор

В этой лабораторной работе вы научитесь использовать Pulumi , инструмент «Инфраструктура как код» для предоставления ресурсов Google Cloud и управления ими.

Что вы узнаете

В этой лабораторной работе вы научитесь делать следующее:

  • Установите и настройте Пулуми
  • Напишите программу YAML для моделирования вашей инфраструктуры в Google Cloud.
  • Предоставление облачных ресурсов и управление ими с помощью Pulumi
  • Используйте pulumi Convert для преобразования программы YAML в программу Python

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в 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 со следующими определениями ресурсов.

  1. Ведро
  2. IAM-привязка
  3. Текстовый объект со строкой «Hello World!»
  4. И некоторые выводы
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. Поздравляем!

Поздравляем, вы закончили лабораторную работу!