1. Visão geral
Este laboratório ensina 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
- Escrever um programa YAML para modelar sua infraestrutura no Google Cloud
- Provisionar e gerenciar 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
- 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.
- 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 É possível atualizar o local 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. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID
. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- 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 evitar cobranças 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
Adicionar o Pulumi ao caminho e conferir a mensagem de ajuda do 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 recurso
- Bucket
- Vinculação do IAM
- Um objeto de texto com a string "Hello World!"
- 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 e a chave gcp:project com o ID do projeto como 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, uma visualização é mostrada que descreve as mudanças que serão feitas quando você usar 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
A execução do comando a seguir vai imprimir as saídas definidas.
pulumi stack output
Execute o comando a seguir para verificar a mudança.
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 Python da Pulumi.
pulumi convert --language python --out ./py-repo
Inspecione o código gerado no 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 do projeto Pulumi.yaml para apontar para o programa Python. Observe que o tempo 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 implantar a pilha novamente e selecione sim.
pulumi up
Não deve haver mudanças, e o resultado deve ser semelhante a este:
(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
Sua confirmação vai 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!