Usar o Pulumi no Google Cloud com YAML

1. Visão geral

Neste laboratório, você vai aprender a usar o Pulumi, uma ferramenta de infraestrutura como código para provisionar e gerenciar recursos do Google Cloud.

O que você vai aprender

Você vai aprender a:

  • Instalar e configurar o Pulumi
  • Crie um programa YAML para modelar sua infraestrutura no Google Cloud
  • Provisione e gerencie recursos do Cloud usando o Pulumi
  • Use pulumi convert para converter o programa YAML em um programa Python

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, pode gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

3. Configuração da infraestrutura

Instalar e configurar o Pulumi

No Cloud Shell, execute o seguinte comando para instalar o Pulumi

curl -fsSL https://get.pulumi.com | sh

Adicione Pulumi ao caminho e confira a mensagem de ajuda de Pulumi

export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h

Execute os comandos a seguir para definir o ID do projeto e autorizar o acesso. Siga as instruções fornecidas pelos comandos

export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login

No Cloud Shell, crie um bucket do GCS e use-o como back-end

gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}

Criar um novo projeto

No Cloud Shell, crie o diretório raiz do projeto

mkdir pulumi-lab && cd pulumi-lab

Definir o arquivo de projeto(o ponto de entrada para o Pulumi)

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: yaml
main: yaml-repo/
EOT

Definir recursos YAML

Criar diretório para armazenar as definições de recursos da nuvem no formato yaml

mkdir yaml-repo

Crie o arquivo yaml-repo/Pulumi.yaml com as seguintes definições de recursos

  1. Bucket
  2. Vinculação do IAM
  3. Um objeto de texto com a string "Hello World!"
  4. E algumas saídas
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}

Implantar os recursos

Inicializar e configurar a pilha

export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID

Verifique a configuração da pilha. A chave gcp:project será exibida com o ID do projeto como o valor.

pulumi config

Neste ponto, a estrutura de diretórios deve ser semelhante a esta:

├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
    └── Pulumi.yaml

Implantar a pilha

pulumi up

Esse comando avalia seu programa e determina as atualizações de recursos a serem feitas. Primeiro, é mostrada uma visualização que descreve as mudanças que serão feitas quando o comando

(Resposta)

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

Selecione sim e os recursos serão provisionados. A saída será parecida com esta:

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

O comando a seguir imprimirá as saídas definidas

pulumi stack output

Execute o comando a seguir para verificar a alteração.

gsutil ls $(pulumi stack output bucketName)

A saída vai ficar assim

(Resposta)

gs://my-bucket-11a9046/index-object-77a5d80

4. Converter YAML em Python

Vamos converter o exemplo acima em um programa Pulumi Python

pulumi convert --language python --out ./py-repo

Inspecione o código gerado em py-repo

cat py-repo/__main__.py

(Resposta)

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

Ativar o ambiente virtual do Python

source py-repo/bin/activate

Atualize o arquivo de projeto Pulumi.yaml para apontar para o programa Python. Observe que o ambiente de execução e a entrada principal foram alterados

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: python
main: py-repo/
EOT

Tente reimplantar a pilha e selecione yes

pulumi up

Não vai haver mudanças, e a saída vai ser parecida com esta:

(Resposta)

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. Excluir os recursos

Excluir os recursos criados

pulumi destroy

A confirmação ficará assim:

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. Parabéns!

Parabéns, você concluiu o laboratório.