Infra As Code: Um Guia Prático de como Gerenciar sua Infraestrutura com Pulumi

O Pulumi é uma ferramenta moderna de Infrastructure as Code (IaC) que redefine a forma como gerenciamos recursos na nuvem. Diferentes das abordagens tradicionais que exigem o aprendizado de DSLs (Domain-Specific Languages), o Pulumi permite que você defina os recursos usando diferentes linguagens de programação, de acordo com a necessidade do usuário. Isso significa que você pode utilizar toda a flexibilidade de estruturas de programação (loops, condicionais, bibliotecas) ao mesmo tempo que sua arquitetura se integra nativamente com diversos provedores em nuvem.

Neste guia, utilizaremos Python para demonstrar como o Pulumi gerencia uma automação na AWS. Você aprenderá a implementar recursos com um bucket S3 e uma instância EC2, aplicando boas práticas profissionais e de segurança. Ao final, sua infraestrutura estará não somente no console da AWS mas também em seu repositório Git, versionada e pronta para ser escalada.

Pré-requisitos

  1. Conta na AWS com acesso programático ao IAM User com permissões para S3, EC2 e IAM.
  2. AWS CLI configurada: Execute aws configure e insira suas credenciais.
  3. Python 3.6+ instalado.
  4. Pulumi CLI instalado, veja abaixo.

Passo 1: Instalar o Pulumi

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

# Windows (PowerShell)
choco install pulumi

Verifique a instalação:

pulumi version

Passo 2: Configurar Credenciais AWS

Certifique-se de que a AWS CLI está configurada com:

aws configure

Isso define automaticamente as credenciais que o Pulumi usará.

Passo 3: Criar um Projeto Pulumi em Python

Inicialize o projeto:

mkdir pulumi-aws-python && cd pulumi-aws-python 
pulumi new aws-python -n meu-projeto

Escolha a stack padrão (ex: `dev`).

Ative o ambiente virtual:

python3 -m venv venv 
source venv/bin/activate  # Linux/macOS 
venv\Scripts\activate     # Windows 
pip install -r requirements.txt

Passo 4: Definir a Infraestrutura em Python

Abra o arquivo __main__.py e substitua o conteúdo por:

import pulumi 
from pulumi_aws import s3, ec2, iam 

# 1. Bucket S3 com políticas de segurança 
bucket = s3.Bucket("meu-bucket-pulumi", 
    acl="private", 
    tags={"Ambiente": pulumi.get_stack()}, 
    force_destroy=True  # Permite deletar o bucket mesmo com arquivos 
) 

# 2. Instância EC2 com role IAM 
role = iam.Role("ec2-role", 
    assume_role_policy="""{ 
        "Version": "2012-10-17", 
        "Statement": [{ 
            "Action": "sts:AssumeRole", 
            "Effect": "Allow", 
            "Principal": {"Service": "ec2.amazonaws.com"} 
        }] 
    }""" 
) 
instance = ec2.Instance("instancia-demo", 
    ami="ami-0c55b159cbfafe1f0",  # Amazon Linux 2 (us-east-1) 
    instance_type="t3.micro", 
    iam_instance_profile=role.name, 
    tags={"Name": "Instancia-Pulumi"} 
) 

# Exporta saídas úteis 
pulumi.export("bucket_name", bucket.id) 
pulumi.export("instance_public_ip", instance.public_ip)

Passo 5: Implantar na AWS

Execute o comando:

pulumi up

Revise o plano e confirme com yes.

Passo 6: Verificar Recursos

Acesse:

Ou via CLI:

pulumi stack output bucket_name 
pulumi stack output instance_public_ip

Gerenciamento Avançado

Atualizar Recursos

Modifique __main__.py (ex: mude `t3.micro` para `t3.small`) e execute:

pulumi up

Destruir Tudo

pulumi destroy

Múltiplos Ambientes (Stacks)

Crie uma stack para produção:

pulumi stack init prod 
pulumi config set aws:region us-west-2 # Altere a região

Boas Práticas Profissionais

Use IAM Roles e Políticas Restritivas

Evite credenciais estáticas. No exemplo, a instância EC2 assume uma role IAM. Para mais segurança, adicione políticas:

iam.RolePolicy("ec2-policy", role=role.id, 
   policy=bucket.arn.apply(lambda arn: f"""{ 
     "Version": "2012–10–17", 
     "Statement": [{ 
         "Effect": "Allow", 
         "Action": ["s3:GetObject"], 
         "Resource": "{arn}/*" 
     }] 
 }""") 
)

Tags Padronizadas

Adicione tags para rastrear custos e ambientes:

tags = { 
 "Projeto": "Infra-Pulumi", 
 "Stack": pulumi.get_stack(), 
 "GerenciadoPor": "IaC" 
}

Armazene o Estado Remotamente

Use o Pulumi Cloud ou um bucket S3:

pulumi login - cloud-url s3://meu-bucket-estados

Secrets Sensíveis

Armazene dados confidenciais com criptografia:

config = pulumi.Config() 
senha = config.get_secret("senha") # Define via CLI: `pulumi config set - secret senha 123`

Modularize seu Código

Crie classes ou funções reutilizáveis:

def criar_bucket(nome: str) -> s3.Bucket: 
   return s3.Bucket(nome, 
     acl="private", 
     tags={"Módulo": "Storage"} 
 )

Versionamento e CI/CD

Armazene o código no GitHub/GitLab.

Use GitHub Actions ou AWS CodePipeline para automatizar pulumi up.

Conclusão

Com Pulumi e Python, você gerencia infraestrutura AWS de forma programática, segura e escalável. Este guia cobriu desde a criação de recursos básicos até práticas avançadas como IAM, múltiplos ambientes e modularização.

Próximos passos

Para transformar sua AWS em código e otimizar sua infraestrutura com boas práticas, não deixe de acessar nosso repositório para exemplos práticos e nosso site para mais conteúdos e novidades!