Curso
Gerenciar a infraestrutura em nuvem com modelos JSON ou YAML brutos pode ser entediante e propenso a erros. O AWS Cloud Development Kit (CDK) muda isso, permitindo que você defina recursos de nuvem usando linguagens de programação modernas, como Python, TypeScript, Java e C#.
Com o CDK, a infraestrutura se torna um código reutilizável, testável e com controle de versão. Ele permite que você pense como um desenvolvedor, mesmo ao provisionar sistemas de nuvem complexos.
Neste tutorial, você aprenderá a configurar um projeto AWS CDK usando Python. Vamos percorrer o processo de escrever sua primeira pilha, adicionar um recurso essencial do AWS e implementá-la em sua conta do AWS. Ao final, você entenderá claramente como o CDK funciona e como usá-lo para gerenciar a infraestrutura de uma forma amigável ao desenvolvedor, com código.
Para entender melhor as práticas por trás de ferramentas como o AWS CDK, explore os princípios básicos em nosso curso Conceitos de DevOps.
Pré-requisitos
Antes de começarmos a escrever código com o AWS CDK, certifique-se de que seu ambiente esteja configurado corretamente. Aqui está o que você precisará:
Conta AWS para experimentação
Você precisa ter acesso a uma conta do AWS para implantar o aplicativo que criaremos. Se o seu sistema já estiver configurado com credenciais para um usuário de nível de administrador, fique à vontade para pular essa etapa.
Se vocêainda não tiver uma conta do AWS, crie uma aqui.
Para que você tenha um caminho de aprendizagem estruturado que abranja os fundamentos da AWS, o programa AWS Cloud Practitioner é um excelente ponto de partida.
Usuário administrador
Você precisará de um usuário com acesso programático e permissões completas para acompanhar o processo.
- Faça login na sua conta do AWS.
- Abra o console do IAM.
- Crie um novo usuário - você pode nomeá-lo como "datacamp-cdk"
- Selecione Acesso programático.
- Clique em Next: Permissões.
- Escolha Anexar políticas existentes diretamente e marque Acesso do administrador.
- Clique em Next: Tags,Próximo: Consulte e, em seguida, Create User (Criar usuário).
Na tela final, anote o ID da chave de acesso e a chave de acesso secreta. Você precisará deles na próxima etapa.
Configure suas credenciais do AWS
Abra um terminal e execute:
aws configure
Você será solicitado a inserir as credenciais do console IAM:
AWS Access Key ID [None]: <your access key ID>
AWS Secret Access Key [None]: <your secret access key>
Default region name [None]: us-east-1
Default output format [None]:
Escolha um IDE para desenvolvimento
O AWS CDK permite que os desenvolvedores trabalhem em um ambiente de programação completo, em vez de modelos YAML ou JSON. Esse ambiente repleto de recursos permite que você use seu IDE preferido e, ao mesmo tempo, se beneficie dos recursos de autocompletar código, linting em tempo real e ferramentas de refatoração para um gerenciamento eficiente do código da infraestrutura.
Para que você tenha a melhor experiência de desenvolvimento com o Python CDK, sugiro que use um IDE que ofereça suporte ao seguinte:
- Destaque de sintaxe
- Conclusão do código
- Navegação e sugestões inteligentes
- Suporte a ambientes virtuais
Instale o Python e o pip
Para usar o AWS CDK com Python, você precisará ter a versão 3.8 ou superior do Python instalada no seu sistema. Se você ainda não o tiver, poderá fazer o download da versão mais recente no site oficial do Python.
Se você estiver no Windows, verifique se o Python foi adicionado à variável de ambiente PATH
do seu sistema. Para verificar, abra um terminal ou prompt de comando e execute:
python --version
Se você vir um erro do tipo "command not found" (comando não encontrado) ou semelhante, é provável que o Python não esteja no seu site PATH
. A solução mais fácil é que você marque a caixa "Add Python 3.x to PATH" durante a instalação.
Você também precisará do pip, o instalador de pacotes Python, para instalar as dependências do AWS CDK posteriormente. A maioria das distribuições modernas do Python vem com o pip pré-instalado.
pip --version
Se ele não estiver instalado, siga o guia oficial de instalação do pip.
Primeiros passos com o AWS CDK
Antes de escrevermos qualquer código, é essencial que você entenda o que é o AWS CDK, por que ele existe e como ele se encaixa no mundo mais amplo da infraestrutura como código (IaC). Esta seção apresentará a você os principais conceitos por trás do CDK e mostrará como ele se compara a outras ferramentas populares de IaC.
O que é o AWS CDK e por que ele é usado?
O AWS Cloud Development Kit (CDK) é uma estrutura de código aberto que permite aos usuários criar uma infraestrutura de nuvem por meio de linguagens de programação conhecidas, incluindo Python, TypeScript, Java e C#.
O CDK permite que os usuários gerem modelos do CloudFormation de forma programática por meio de código real, em vez de exigir a gravação manual de modelos JSON ou YAML.
Isso significa que você pode:
- Reutilize a lógica usando loops e funções.
- Organize sua infraestrutura usando módulos e classes.
- Seu IDE oferece ferramentas para conclusão de código, verificação de erros e recursos de refatoração.
Em sua essência, o CDK gira em torno de três conceitos principais:
- App - O ponto de entrada do seu projeto CDK. Ele pode conter uma ou mais pilhas.
- Pilha - Uma unidade de implementação que mapeia para uma pilha do CloudFormation. Cada pilha define um conjunto de recursos a serem criados.
- Construto - O bloco de construção da CDK. Os construtos representam componentes da nuvem, como buckets S3, funções Lambda, VPCs e padrões complexos que combinam vários recursos.
Hierarquia visual de um aplicativo AWS CDK
CDK vs Terraform vs CloudFormation
A tabela a seguir descreve as diferenças entre as ferramentas disponíveis na AWS para que você gerencie a infraestrutura.
Recurso |
AWS CDK |
Terraform |
AWS CloudFormation |
Suporte a idiomas |
Python, TypeScript, Java, C# |
HCL (declarativo) |
YAML / JSON |
Nível de abstração |
Alta (OOP + bibliotecas) |
Médio |
Baixa |
Modularidade |
Forte (construções, classes) |
Forte (módulos) |
Fraco (pilhas aninhadas) |
Gerenciamento do estado |
Tratados pelo CloudFormation |
Manipulado pelo Terraform (tfstate) |
Tratados pelo CloudFormation |
Multi-cloud |
Somente AWS |
Sim |
Somente AWS |
Idiomas suportados e pré-requisitos
O AWS CDK oferece suporte a várias linguagens de programação, permitindo que os desenvolvedores escolham aquela com a qual se sentem mais confortáveis:
- TypeScript
- Python
- Java
- C#/.NET
- Ir
Neste tutorial, vamos nos concentrar em Python, mas os conceitos principais se aplicam a todas as linguagens suportadas.
Instalação e configuração
Agora que seu ambiente está pronto, é hora de usar o Python para estruturar seu primeiro aplicativo AWS CDK. O comando CDK init
configura toda a estrutura do projeto, incluindo arquivos, diretórios e um ambiente virtual, para ajudar você a começar rapidamente.
Criar um diretório de projeto
Abra o terminal e execute o seguinte comando para criar um novo diretório e navegar até ele:
mkdir cdk_datacamp && cd cdk_datacamp
Inicializar o aplicativo CDK
cdk init sample-app --language python
Isso cria um projeto inicial pré-configurado com um exemplo básico que inclui:
- Uma pilha de amostra (
cdk_datacamp_stack
) - Uma fila SQS inscrita em um tópico SNS
- Um arquivo
cdk.json
que configura como seu aplicativo CDK é executado - Um ambiente virtual (em
.venv
) para as dependências do Python
Quando o comando for concluído, você verá uma saída semelhante a esta:
Estrutura de projeto CDK Python
Configuração do ambiente virtual
Se o processo cdk init
não criar automaticamente um ambiente virtual, você poderá fazê-lo manualmente:
python3 -m venv .venv
source .venv/bin/activate
Depois de ativado, instale as dependências necessárias:
pip install -r requirements.txt
Compreensão dos conceitos de CDK
Antes de nos aprofundarmos no código, vamos explorar como os principais componentes do AWS CDK - aplicativos, pilhas e construções - funcionam juntos na prática. Agora que você está familiarizado com o que cada um representa, é essencial ver como eles interagem para formar uma infraestrutura modular e dimensionável.
Também detalharemos os diferentes níveis de construções (L1, L2, L3) e examinaremos as bibliotecas de CDK que tornam isso possível.
Aplicativos, pilhas e construções
Agora que você sabe o que são App, Stack e Construct das seções anteriores, vamos entender como eles funcionam juntos em um aplicativo CDK.
Pense nisso como se você estivesse construindo uma casa:
- O aplicativo é o projeto geral de construção.
- Cada pilha é como um edifício ou uma estrutura separada nesse projeto.
- Cada Construct é um componente, como paredes, portas ou encanamento, que vai para uma pilha.
No código, o relacionamento tem a seguinte aparência:
# app.py
from aws_cdk import App
from my_project.my_stack import MyStack
# Initialize the CDK application
app = App()
# Instantiate the stack and add it to the app
MyStack(app, "MyFirstStack")
# Synthesize the CloudFormation template
app.synth()
# my_stack.py
from aws_cdk import Stack
from aws_cdk import aws_s3 as s3
from constructs import Construct
class MyStack(Stack):
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# Define an Amazon S3 bucket with default settings
s3.Bucket(self, "MyBucket")
Aqui, o aplicativo instancia uma pilha, que inclui construtos como um bucket S3.
Compreensão dos níveis de construção: L1, L2 e L3
No AWS CDK, os construtores vêm em três níveis de abstração, oferecendo flexibilidade com base no nível de controle ou simplicidade que você precisa.
Nível 1 (L1) - Construções do CloudFormation
Esses são os blocos de construção brutos gerados diretamente da especificação do AWS CloudFormation. Cada recurso do AWS no CloudFormation tem uma construção L1 equivalente no CDK; seus nomes sempre começam com "Cfn".
Os construtores L1 expõem todas as opções de configuração possíveis, mas não oferecem abstrações ou padrões. Eles são ideais quando você precisa de controle total ou usa recursos mais recentes da AWS que ainda não foram incluídos em construções de nível superior.
- Exemplo:
s3.CfnBucket
Nível 2 (L2) - Construções nativas do AWS CDK
Os construtos L2 oferecem uma abstração de nível mais alto e de fácil desenvolvimento em relação aos construtos L1. São componentes opinativos com padrões sensatos e métodos incorporados que simplificam as tarefas cotidianas. Eles foram projetados para o uso diário e ajudam a reduzir a padronização e, ao mesmo tempo, oferecem um bom nível de personalização.
- Exemplo:
s3.Bucket
- Você pode criar um bucket com controle de versão com apenas uma linha de código.
Nível 3 (L3) - Construções de padrões
As construções L3 são abstrações que agrupam vários recursos da AWS em padrões arquitetônicos comuns. Eles podem ser fornecidos pela AWS ou criados como componentes reutilizáveis pela comunidade ou por você. Use construções L3 para encapsular a complexidade e reutilizar padrões de infraestrutura em projetos ou equipes.
- Exemplo:
aws_s3_deployment.BucketDeployment
- Combina um bucket S3 e uma estratégia de implantação para automatizar os uploads de ativos.
A maioria dos desenvolvedores começa com construções L2 e introduz a L1 somente quando necessário. O L3 se torna útil à medida que seu projeto cresce e você deseja abstrair padrões repetidos em componentes reutilizáveis.
Bibliotecas e módulos CDK
Você não interage diretamente com o CloudFormation bruto ao criar com o AWS CDK. Em vez disso, você usa as bibliotecas modulares do CDK, que fornecem construções para serviços da AWS como S3, Lambda, IAM e outros. Todos os módulos de serviço do AWS são agrupados no pacote principal chamado aws-cdk-lib
, e são organizados por serviço.
Bibliotecas comumente usadas em Python
A seguir, você encontrará algumas das bibliotecas (ou módulos) mais usadas em aws-cdk-lib
em projetos Python:
aws_cdk.aws_s3
- Para criar buckets S3aws_cdk.aws_lambda
- Para definir funções Lambdaaws_cdk.aws_iam
- Para gerenciar funções e permissõesaws_cdk.aws_dynamodb
- Para que você trabalhe com tabelas do DynamoDBaws_cdk.aws_ec2
- Para componentes de rede, como VPCs e grupos de segurançaaws_cdk.aws_sns
/aws_cdk.aws_sns_subscriptions
- Para tópicos do SNS e seus assinantes
Esses módulos são importados somente quando necessário, mantendo seu projeto leve e modular.
Como importar e usar um módulo CDK
Para usar um serviço específico da AWS, você importa seu módulo e chama suas classes de construção. Por exemplo, para criar um bucket S3:
from aws_cdk import aws_s3 as s3
# Inside your stack
bucket = s3.Bucket(self, "MyBucket")
Este exemplo usa a construção L2 s3.Bucket
, que inclui padrões integrados, como opções de criptografia e controle de versão.
Se você precisar usar outro serviço, basta importar seu módulo da mesma forma:
from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam
Observação: Em seu requirements.txt
, você normalmente só precisa:
aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0
Esses dois pacotes dão a você acesso a todas as construções do AWS CDK e à funcionalidade central da estrutura.
Criando sua primeira pilha CDK
Depois de aprender sobre as operações internas do AWS CDK, você pode implementar esse conhecimento. A seção a seguir orienta você na criação de uma pilha CDK operacional usando Python. Antes de implantá-los na sua conta do AWS, você criará uma estrutura de projeto por meio de código e implementará recursos reais do AWS, como buckets S3 e funções Lambda.
Andaimes de um novo projeto
Quando você executa o comando cdk init
com o sinalizador --language python
, ele configura uma estrutura de projeto completa que se parece com esta:
Estrutura de pastas de um projeto Python do AWS CDK
O arquivo app.py
é onde o aplicativo é definido, e o arquivo cdk_datacamp_stack.py
é onde você escreve o código da pilha e dos construtos.
Dica: Você pode renomear o arquivo de pilha ou a classe para que corresponda à finalidade do seu aplicativo, como storage_stack.py
ou monitoring_stack.py
.
Adicionando recursos do AWS
Agora, vamos adicionar alguns recursos do AWS à sua pilha CDK. Você escreverá isso dentro do método __init__()
da sua classe Stack
no arquivo cdk_datacamp_stack.py.
Balde S3
from aws_cdk import aws_s3 as s3
# Create an S3 bucket with versioning and managed encryption
bucket = s3.Bucket(
self,
"MyBucket",
versioned=True,
encryption=s3.BucketEncryption.S3_MANAGED
)
Função lambda
from aws_cdk import aws_lambda as lambda_
# Define a Lambda function using Python 3.9 runtime
lambda_function = lambda_.Function(
self,
"MyFunction",
runtime=lambda_.Runtime.PYTHON_3_9,
handler="index.handler",
code=lambda_.Code.from_asset("lambda") # Load code from local folder named 'lambda'
)
Implementação da pilha
Depois que você adicionar seus recursos, é hora de implantá-los no AWS.
Em seu terminal, ative o ambiente virtual e execute:
cdk deploy
Isso irá:
- Sintetize sua pilha em um modelo do CloudFormation
- Carregue esse modelo no AWS
- Provisione os recursos em sua conta
Você será solicitado a aprovar as alterações se for a primeira vez que estiver implementando a pilha.
Após a implantação, você pode:
- Abra o console do AWS
- Navegue até o respectivo serviço (por exemplo, S3, Lambda)
- Veja os recursos que o CDK acabou de criar
Trabalhando com construções de CDK
Os aplicativos AWS CDK dependem de construções como seus elementos estruturais essenciais. O código da sua infraestrutura se tornará mais modular, passível de manutenção e legível quando você dominar as construções, quer você use construções de serviço incorporadas ou crie padrões reutilizáveis.
Esta seção ensina você a usar construções L2 (alto nível) e a desenvolver construções personalizadas que reduzem padrões repetitivos.
Uso de construções L2
As construções L2 são abstrações nativas do CDK que são mais fáceis de usar do que o CloudFormation bruto (L1). Eles têm padrões sensatos e segurança de tipo, geralmente exigindo menos linhas de código para configurar um recurso do AWS.
Por que usar construções L2?
- Menos boilerplate - menos campos obrigatórios em comparação com L1
- Código Python mais legível e idiomático
- Inclui métodos utilitários como
.add_to_role_policy()
ou.add_event_notification()
- Gerencia automaticamente as dependências entre os recursos
Exemplo: Criando um bucket S3 usando L2
from aws_cdk import aws_s3 as s3
# Create a versioned and encrypted S3 bucket
bucket = s3.Bucket(
self,
"MyBucket",
versioned=True,
encryption=s3.BucketEncryption.S3_MANAGED
)
A construção equivalente em L1, s3.CfnBucket
, precisaria que todas as propriedades fossem definidas manualmente e que a configuração fosse definida como ditados brutos, o que é muito menos intuitivo.
Outros construtos comuns de L2 incluem:
lambda_.Function()
para o AWS Lambdadynamodb.Table()
for DynamoDBsqs.Queue()
para SQSsns.Topic()
para SNS
Criando construções personalizadas
Sua infraestrutura se expandirá com padrões recorrentes, como a criação de funções Lambda com permissões específicas e buckets S3. Os construtores personalizados são a solução ideal para esse cenário específico.
As construções personalizadas permitem que você combine recursos relacionados em uma única unidade lógica, que pode ser reutilizada em pilhas ou projetos.
Quando você deve criar uma construção personalizada:
- Quando você tem mais de 3 recursos que são sempre provisionados juntos
- Quando você quiser encapsular a lógica reutilizável
- Quando você quiser reduzir a duplicação de código entre pilhas
Exemplo: Um padrão reutilizável de S3 + Lambda
from constructs import Construct
from aws_cdk import aws_s3 as s3, aws_lambda as lambda_
class StorageWithLambda(Construct):
def __init__(self, scope: Construct, id: str) -> None:
super().__init__(scope, id)
# S3 bucket
self.bucket = s3.Bucket(self, "MyBucket")
# Lambda function
self.function = lambda_.Function(
self,
"MyFunction",
runtime=lambda_.Runtime.PYTHON_3_9,
handler="index.handler",
code=lambda_.Code.from_asset("lambda")
)
# Grant Lambda access to the S3 bucket
self.bucket.grant_read_write(self.function)
Agora você pode usar essa construção dentro de qualquer pilha como esta:
from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")
Antes de executar o procedimento acima, crie uma pasta chamada lambda
na raiz do projeto e crie um arquivo index.py
com o seguinte conteúdo:
def handler(event, context):
return {
"statusCode": 200,
"body": "Hello from Lambda!"
}
Dicas de reutilização
- Prefixe os arquivos com
construct_
ou coloque-os em uma pastaconstructs/
- Exponha saídas como
self.bucket
ouself.function
para maior flexibilidade - Mantenha cada construção focada em uma responsabilidade
Teste e síntese de aplicativos CDK
Depois de escrever o código da infraestrutura, é essencial verificar o que o CDK implantará e, de preferência, testar se as pilhas se comportam conforme o esperado. O AWS CDK fornece ferramentas para sintetizar modelos do CloudFormation e escrever testes automatizados para detectar configurações incorretas antes da implementação.
Sintetizando modelos
O comando cdk synth
gera o modelo do CloudFormation a partir do seu código CDK.
cdk synth
Quando você executa isso, o CDK:
- Carrega seu aplicativo (via
app.py
) - Resolve todas as construções e pilhas
- Emite modelos YAML/JSON brutos do CloudFormation
Modelo de CloudFormation sintetizado
Por padrão, a saída vai para o terminal, mas você também pode enviar a saída para um arquivo, se necessário:
cdk synth > template.yaml
Isso é útil quando você:
- Você deseja inspecionar o modelo real antes da implantação
- Você está depurando a estrutura de uma pilha
- Você está compartilhando o modelo com equipes que não estão usando o CDK
Infraestrutura de testes
Embora testar a infraestrutura como código possa parecer incomum, é vantajoso, especialmente quando suas pilhas ficam grandes ou incluem lógica condicional, loops ou construções reutilizáveis.
O AWS CDK oferece o módulo de asserções para testar pilhas sintetizadas.
Escrevendo um teste simples com pytest
Aqui está um exemplo de teste que verifica se um recurso específico (como um bucket S3) está incluído na pilha:
# test/test_cdk_datacamp_stack.py
import aws_cdk as cdk
from aws_cdk.assertions import Template
from cdk_datacamp.cdk_datacamp_stack import CdkDatacampStack
def test_s3_bucket_created():
app = cdk.App()
stack = CdkDatacampStack(app, "TestStack")
template = Template.from_stack(stack)
# Assert that an S3 bucket exists
template.resource_count_is("AWS::S3::Bucket", 1)
Para executar os testes, verifique se o site pytest
está instalado:
pip install -U pytest
Então, corra:
pytest
Se tudo for aprovado, você verá uma marca de verificação verde. Caso contrário, o resultado do teste informará a você o que está faltando.
Saída do Pytest mostrando a execução bem-sucedida de todos os casos de teste para a pilha do AWS CDK
Você também pode incluir a validação em sua pilha CDK. Os testes de validação são verificações de tempo de execução dentro do código de construção ou de pilha que validam as entradas antes da implantação. Eles ajudam a detectar configurações incorretas ou a impor restrições no início do ciclo de vida do desenvolvimento.
Digamos que você queira passar o bucket_name
como uma variável de contexto, mas queremos validar isso:
- O nome do intervalo não está vazio
- Ele atende às regras de nomenclatura do S3 (por exemplo, somente letras minúsculas)
Crie um arquivo chamado test/test_storage_with_lambda.py
e adicione o seguinte:
import pytest
from aws_cdk import App, Stack
from cdk_datacamp.storage_with_lambda import StorageWithLambda
def test_missing_bucket_name():
app = App()
stack = Stack(app, "TestStack")
with pytest.raises(ValueError, match="bucket_name is required"):
StorageWithLambda(stack, "FailingConstruct", bucket_name=None)
def test_bucket_name_uppercase():
app = App()
stack = Stack(app, "TestStack")
with pytest.raises(ValueError, match="must be lowercase"):
StorageWithLambda(stack, "FailingConstruct", bucket_name="InvalidName")
Para testar a validação, execute o comando abaixo:
test/test_storage_with_lambda.py
Saída do Pytest mostrando a execução bem-sucedida de todos os casos de teste para a pilha do AWS CDK
Quando você deve usar o teste:
- Você está criando construções ou padrões reutilizáveis.
- A implementação de testes serve para estabelecer requisitos técnicos padrão entre os membros da equipe.
- Você deseja detectar regressões ou alterações não intencionais durante a CI/CD.
Você quer reforçar seus conhecimentos sobre o CDK em uma entrevista? As principais perguntas da entrevista de DevOps da AWS podem ajudar você a se preparar.
Práticas recomendadas e dicas para trabalhar com o AWS CDK
Depois de dominar a criação e a implantação da pilha CDK, você deve seguir as práticas recomendadas para manter o código da infraestrutura limpo, seguro e dimensionável. Esta seção discutirá como estruturar grandes projetos, lidar corretamente com a segurança e integrar o CDK aos pipelines de CI/CD.
Organização de grandes projetos
À medida que seu aplicativo CDK cresce, organizar o código em unidades gerenciáveis torna-se essencial.
Use várias pilhas
Divida sua infraestrutura por área de interesse. Por exemplo:
- NetworkingStack: VPCs, sub-redes, grupos de segurança
- ComputeStack: EC2, Lambda
- StorageStack: S3, DynamoDB
Isso permite que você implemente, teste ou destrua partes da sua infraestrutura de forma independente. Veja como ele pode ser incluído em app.py
:
network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")
Você também pode passar recursos entre pilhas usando saídas ou referências.
Criar construções aninhadas reutilizáveis
Encapsule recursos relacionados (como um Lambda e suas permissões) em uma construção personalizada, como você fez com StorageWithLambda
. Isso melhora a legibilidade e a reutilização em pilhas ou aplicativos.
Use a configuração específica do ambiente
Ofereça suporte a vários ambientes (desenvolvimento, preparação, produção) usando:
cdk.json
com valores de contexto- Substituições da CLI:
cdk deploy -c env=prod
- Lógica condicional em suas pilhas
env = app.node.try_get_context("env")
if env == "prod":
bucket_name = "mycompany-prod-logs"
Segurança e permissões
Qualquer projeto de infraestrutura deve priorizar a segurança durante os processos de implementação automatizada do AWS CDK. A seção a seguir demonstra o gerenciamento seguro de recursos do IAM por meio de princípios de privilégio mínimo.
Definir funções de IAM em vez de usar os padrões
Os construtores CDK, que incluem tarefas Lambda ou ECS, criarão automaticamente funções de IAM. Embora seja conveniente, isso pode limitar o seu controle sobre permissões e nomes.
Em vez disso, defina as funções explicitamente:
from aws_cdk import aws_iam as iam
execution_role = iam.Role(
self,
"LambdaExecutionRole",
assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
description="Custom role for Lambda with least privilege",
managed_policies=[
iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole")
]
)
Por padrão, essa função permite apenas o registro em log e nada mais.
Aplicar o princípio do menor privilégio
Evite usar "*"
em actions
ou resources
, a menos que seja absolutamente necessário.
Exemplo:
lambda_fn.add_to_role_policy(
iam.PolicyStatement(
actions=["*"],
resources=["*"]
)
)
Você também pode usar subsídios específicos para recursos, quando disponíveis:
bucket.grant_read(lambda_fn)
Isso gera automaticamente a política necessária com acesso com escopo ao bucket do S3.
Use políticas gerenciadas quando possível
As políticas gerenciadas pelo AWS simplificam a manutenção e reduzem a chance de erros.
iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")
Você pode anexá-las a funções personalizadas para serviços como ECS, Batch ou Step Functions.
Integração de CI/CD
O AWS CDK oferece um poder excepcional por meio de sua capacidade de integração com pipelines de CI/CD contemporâneos. O CDK oferece suporte à entrega de infraestrutura automatizada por meio da implantação de código com controle de versão, que funciona com o GitHub, o GitLab e os serviços nativos da AWS, incluindo o CodePipeline. O sistema reduz os erros humanos, encurta os ciclos de feedback e permite a implementação em vários ambientes.
Ações do GitHub: Automatizando implantações de CDK
Você pode usar o GitHub Actions para sintetizar, diferenciar, testar e implantar pilhas de CDK em cada push ou pull request.
Dê uma olhada no site .github/workflows/deploy.yml
:
name: Deploy CDK App
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Install dependencies
run: |
pip install -r requirements.txt
npm install -g aws-cdk
- name: Run unit tests
run: pytest
- name: CDK Synth
run: cdk synth -c environment=prod
- name: Deploy to AWS
run: cdk deploy --require-approval never
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Use cdk diff
em PRs para visualizar as alterações infra antes de mesclá-las.
CDK pipelines: CI/CD de CDK nativo com o CodePipeline
Para implantações totalmente gerenciadas no AWS, o CDK fornece um módulo chamado aws_cdk.pipelines
, que permite que você defina todo o seu pipeline de CI/CD como código, assim como a infraestrutura.
Aqui está um exemplo simplificado:
from aws_cdk import pipelines, SecretValue, Stack
from constructs import Construct
from my_app_stage import MyAppStage # replace with your actual stage import
class PipelineStack(Stack):
def __init__(
self,
scope: Construct,
construct_id: str,
**kwargs
) -> None:
super().__init__(scope, construct_id, **kwargs)
# Define the source of the pipeline from a GitHub repository
source = pipelines.CodePipelineSource.git_hub(
repo_string="your-org/your-repo", # GitHub org/repo
branch="main",
authentication=SecretValue.secrets_manager("GITHUB_TOKEN")
)
# Define the CodePipeline and its synthesis step
pipeline = pipelines.CodePipeline(
self,
"MyAppPipeline",
synth=pipelines.ShellStep(
"Synth",
input=source,
commands=[
"pip install -r requirements.txt",
"npm install -g aws-cdk",
"cdk synth"
]
)
)
# Add an application stage (e.g., production deployment)
pipeline.add_stage(
MyAppStage(self, "ProdStage")
)
No código acima:
SecretValue.secrets_manager("GITHUB_TOKEN")
extrai com segurança seu token do GitHub do Secrets Manager.MyAppStage
deve ser uma classe que estendaStage
e envolva suas pilhas CDK reais.
Se você estiver implantando sistemas de machine learning, a integração do CDK com práticas de implantação contínua é abordada em nosso curso CI/CD para machine learning.
Conclusão
Este tutorial mostrou a você como construir e implantar a infraestrutura de nuvem em Python por meio das operações do AWS Cloud Development Kit (CDK). Você aprendeu como fazer:
- Crie sua primeira pilha CDK.
- Defina e valide os buckets S3 e as funções Lambda como recursos.
- Organize um projeto por meio de construções personalizadas e padrões de várias pilhas.
- Aplique as práticas recomendadas de segurança por meio do princípio do menor privilégio.
- Automatize as implementações combinando o GitHub Actions com o CDK Pipelines.
- Escreva testes para validar a lógica de sua infraestrutura.
Agora que você implantou seu primeiro aplicativo CDK, aqui estão algumas maneiras de subir de nível:
- Use ambientes parametrizados para desenvolvimento/estágio/produção
- Adicionar alarmes do CloudWatch, API Gateway ou Step Functions
- Explore as construções de CDK como
aws_s3_deployment
,aws_ecs_patterns
ecdk.pipelines
- Converta suas construções em uma biblioteca interna do Python para reutilização
Para que você continue aprendendo e construindo, confira o curso Introdução ao AWS Boto em Python.você pode conferir o curso Introdução ao AWS Boto em Python!
Perguntas frequentes
O que é o AWS CDK e qual é a diferença entre ele e o CloudFormation ou o Terraform?
O AWS CDK permite que você defina a infraestrutura de nuvem usando linguagens de programação como Python, enquanto o CloudFormation e o Terraform dependem de JSON/YAML ou HCL. O CDK oferece maior abstração e reutilização por meio de construções.
Você precisa conhecer o CloudFormation para usar o AWS CDK?
Não, o CDK abstrai a maior parte da complexidade do CloudFormation. No entanto, entender o CloudFormation ajuda você a usar construções de nível inferior ou a solucionar problemas de implementação.
Posso implantar vários ambientes (por exemplo, desenvolvimento, produção) com o AWS CDK?
Sim! O CDK oferece suporte à configuração específica do ambiente usando valores de contexto e sinalizadores da CLI, como cdk deploy -c env=prod
.
Como faço para testar meu código de infraestrutura CDK?
Você pode usar o pytest junto com as asserções do CDK e o módulo de modelo para escrever testes de unidade que verificam os recursos e as configurações da sua pilha antes da implantação.
O que acontece nos bastidores quando executo o cdk deploy?
cdk deploy
sintetiza seu código Python em um modelo CloudFormation, carrega-o no AWS e provisiona os recursos definidos em sua conta.
Rahul Sharma é embaixador da AWS, arquiteto de DevOps e blogueiro técnico especializado em computação em nuvem, práticas de DevOps e tecnologias de código aberto. Com experiência em AWS, Kubernetes e Terraform, ele simplifica conceitos complexos para alunos e profissionais por meio de artigos e tutoriais envolventes. Rahul é apaixonado por resolver desafios de DevOps e compartilhar insights para capacitar a comunidade de tecnologia.