Provisionamento de Recursos na Nuvem
Provisionar recursos na nuvem significa criar e atualizar primitivas da AWS (ou de outra nuvem) de forma repetível e revisável. Equipes Python combinam ferramentas de IaC com boto3 para convergência, importações e tarefas operacionais que não pertencem a um template estático.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import boto3
def provision_queue(sqs, name: str) -> str:
try:
resp = sqs.get_queue_url(QueueName=name)
return resp["QueueUrl"]
except sqs.exceptions.QueueDoesNotExist:
resp = sqs.create_queue(
QueueName=name,
Attributes={"VisibilityTimeout": "60"},
)
return resp["QueueUrl"]Quando usar isso:
- Bootstrap de contas antes da adoção completa de IaC
- Auxiliares idempotentes de garantia chamados de pipelines de deploy
- Fluxos de importação/adoção que envolvem APIs de nuvem
- Runbooks operacionais codificados como CLIs Python
- Emparelhamento com Pulumi/Terraform para recursos fora dos módulos atuais
Exemplo de Trabalho
Uma pequena CLI de provisionamento que garante anexos de políticas S3, SQS e IAM com logging estruturado.
"""provision.py - bootstrap idempotente de recursos AWS."""
from __future__ import annotations
import json
import logging
from dataclasses import dataclass
import boto3
from botocore.exceptions import ClientError
logging.basicConfig(level=logging.INFO, format="%(message)s")
log = logging.getLogger("provision")
@dataclass(frozen=True)
class ProvisionSpec:
bucket: str
queue: str
tags: dict[str, str]
def ensure_bucket(s3, name: str, tags: dict[str, str]) -> str:
buckets = {b["Name"] for b in s3.list_buckets().get("Buckets", [])}
if name not in buckets:
s3.create_bucket(Bucket=name)
log.info(json.dumps({"action": "create", "resource": "s3", "name": name}))
s3.put_bucket_tagging(Bucket=name, Tagging={"TagSet": [{"Key": k, "Value": v} for k, v in tags.items()]})
return name
def ensure_queue(sqs, name: str) -> str:
try:
return sqs.get_queue_url(QueueName=name)["QueueUrl"]
except ClientError as exc:
if exc.response["Error"]["Code"] != "AWS.SimpleQueueService.NonExistentQueue":
raise
url = sqs.create_queue(QueueName=name)["QueueUrl"]
log.info(json.dumps({"action": "create", "resource": "sqs", "name": name}))
return url
def main() -> None:
spec = ProvisionSpec(
bucket="company-events-dev",
queue="company-events-dev",
tags={"Environment": "dev", "Owner": "platform"},
)
session = boto3.Session()
s3 = session.client("s3")
sqs = session.client("sqs")
ensure_bucket(s3, spec.bucket, spec.tags)
ensure_queue(sqs, spec.queue)
log.info(json.dumps({"status": "ok", "bucket": spec.bucket, "queue": spec.queue}))
if __name__ == "__main__":
main()O que isso demonstra:
get_queue_url+ tratamento de exceção implementa a garantia idempotente de fila- Marcação aplicada a cada execução para convergir metadados
- Logs estruturados em JSON adequados para artefatos de CI
- Sessão por execução respeita credenciais de perfil e função IAM
AWS_PROFILE
Mergulho Profundo
Como Funciona
- Declare os recursos desejados em código, classes de dados ou programas IaC
- Planeje com ferramentas de pré-visualização (
pulumi preview,terraform plan) ao usar IaC - Aplique cria/atualiza; backends de estado rastreiam o que existe
- Verifique com APIs de descrição/obtenção e testes de integração
- Documente cada caminho de provisionamento no git com revisão de PR
Camadas de Provisionamento
| Camada | Ferramentas | Melhor para |
|---|---|---|
| IaC Declarativo | Pulumi, Terraform | VPCs, bases IAM, armazenamentos de dados |
| Garantia Imperativa | Scripts boto3 | Adoção única, cola de pipeline |
| APIs de Plano de Controle | CloudFormation | Equipes nativas da AWS |
| Configuração em instâncias | Ansible | Pacotes de SO após a instância existir |
Notas Python
from botocore.config import Config
retry_config = Config(retries={"max_attempts": 10, "mode": "standard"})
s3 = boto3.client("s3", config=retry_config)Armadilhas
- Scripts apenas de criação - a segunda execução falha com
BucketAlreadyExists. Correção: verifique a existência ou use IaC com estado. - Sem tags nos recursos - alocação de custos e auditorias de políticas falham. Correção: conjunto de tags obrigatório validado na política de CI.
- Credenciais compartilhadas em laptops - provisionamento de máquinas de desenvolvimento com chaves de administrador. Correção: funções OIDC de CI com escopo por ambiente.
- Regiões codificadas - recursos pousam na partição/região errada. Correção:
AWS_REGIONou configuração de sessão do spec do ambiente. - Falha parcial silenciosa - fila criada, bucket falhou, script ainda sai com 0. Correção: agregue erros e códigos de saída diferentes de zero.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Apenas Pulumi/Terraform | Ciclo de vida completo do ambiente | Precisa de adoção imperativa rápida |
| AWS CloudFormation | Apenas AWS, políticas de controle de serviço impõem CFN | Equipe padronizada em IaC Python em outro lugar |
| Click CLI + boto3 | Operadores executam comandos verificados | Notebooks boto3 ad hoc sem revisão |
| Cliques no Console | Apenas para quebra de emergência | Ambientes repetíveis |
FAQs
Quando o provisionamento com boto3 é suficiente?
Pequenas garantias idempotentes e código de cola. Ambientes completos com muitos recursos interdependentes pertencem a IaC com plano/aplicação.
Como tornar o provisionamento revisável?
Toda alteração através de PR no git, artefatos de plano/pré-visualização de CI e aprovações necessárias para contas de produção.
Quais tags são necessárias?
No mínimo Environment, Owner e CostCenter - expanda de acordo com a política da organização e valide antes de aplicar.
Como lidar com recursos existentes?
Importe para o estado Terraform/Pulumi ou escreva scripts de adoção que detectem e alinhem em vez de criar cegamente.
Posso provisionar a partir do Lambda?
Sim para pequenas garantias - observe permissões IAM, tempos limite e idempotência quando as retentativas do Lambda forem acionadas.
Como as retentativas interagem com o provisionamento?
Use retentativas Config do botocore para throttling. A criação em si deve permanecer idempotente para sobreviver a chamadas duplicadas.
E sobre AWS multi-conta?
Assuma funções por conta com sts:AssumeRole, backends de estado separados e guardrails impedindo aplicações de produção de CI de desenvolvimento.
Como testar sem AWS?
Use moto para testes unitários de funções de garantia e LocalStack para testes de integração seletivos - ainda execute testes de fumaça em uma conta sandbox.
Quem é o proprietário do código de provisionamento?
Plataforma/SRE é proprietário de módulos compartilhados; equipes de produto consomem módulos marcados em vez de copiar snippets de boto3.
Como isso se relaciona com o deploy?
O provisionamento cria infraestrutura compartilhada (filas, buckets); pipelines de deploy publicam artefatos de aplicativos que consomem esses recursos.
Relacionados
- Noções Básicas de Automação de Infraestrutura - mentalidade idempotente
- Pulumi (IaC Python) - provisionamento declarativo
- Noções Básicas de boto3 - sessões e clientes
- S3 - operações de armazenamento de objetos
- SQS & SNS - primitivas de mensagens
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.