Infraestrutura CDK
O AWS CDK é um framework para definir infraestrutura em nuvem em código e provisioná-la através do AWS CloudFormation.
O gerador de infraestrutura TypeScript cria uma aplicação de infraestrutura AWS CDK escrita em TypeScript. A aplicação gerada inclui práticas recomendadas de segurança através de verificações do Checkov.
Utilização
Seção intitulada “Utilização”Gerar um Projeto de Infraestrutura
Seção intitulada “Gerar um Projeto de Infraestrutura”Você pode gerar um novo projeto de infraestrutura de duas formas:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#infra - Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#infrayarn nx g @aws/nx-plugin:ts#infranpx nx g @aws/nx-plugin:ts#infrabunx nx g @aws/nx-plugin:ts#infraVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#infra --dry-runyarn nx g @aws/nx-plugin:ts#infra --dry-runnpx nx g @aws/nx-plugin:ts#infra --dry-runbunx nx g @aws/nx-plugin:ts#infra --dry-run| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| name Obrigatório | string | - | The name of the application. |
| directory | string | packages | The directory of the new application. |
| enableStageConfig | boolean | Enable centralized stage configuration (credentials, account, region) for multi-environment CDK deployments. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador criará a seguinte estrutura de projeto no diretório <directory>/<name>:
Directorysrc
- main.ts Ponto de entrada da aplicação que instancia estágios do CDK para implantação
Directorystages Definições de estágios do CDK
- application-stage.ts Define uma coleção de stacks para implantar em um estágio
Directorystacks Definições de stacks do CDK
- application-stack.ts Stack principal da aplicação
- cdk.json Configuração do CDK
- project.json Configuração do projeto e targets de build
- checkov.yml Arquivo de configuração do Checkov
Se você definir a opção enableStageConfig, o gerador também cria dois pacotes compartilhados para gerenciamento centralizado de credenciais (caso ainda não existam):
Directorypackages/common
Directoryinfra-config Tipos de configuração de estágio e mapeamentos de credenciais
Directorysrc
- stages.types.ts Definições de tipos para credenciais e configuração de estágios
- stages.config.ts Seus mapeamentos de estágio para credenciais (edite este arquivo)
- index.ts Re-exportações para importar de outros pacotes
Directoryscripts Scripts centralizados de deploy/destroy
Directorysrc
- infra-deploy.ts Script bin de deploy
- infra-destroy.ts Script bin de destroy
Directorystage-credentials/ Lógica compartilhada (busca de credenciais, construção de comandos CDK)
- …
Implementando sua Infraestrutura CDK
Seção intitulada “Implementando sua Infraestrutura CDK”Você pode começar a escrever sua infraestrutura CDK dentro de src/stacks/application-stack.ts, por exemplo:
import { Stack, StackProps } from 'aws-cdk-lib';import { Bucket } from 'aws-cdk-lib/aws-s3'import { Construct } from 'constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props);
// Declare sua infraestrutura aqui new Bucket(this, 'MyBucket'); }}Estágios e Stacks
Seção intitulada “Estágios e Stacks”O CDK usa Stages para agrupar stacks que devem ser implantadas juntas em um ambiente específico. O src/main.ts gerado cria um estágio sandbox para seu próprio desenvolvimento e testes:
new ApplicationStage(app, 'my-app-sandbox', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION, },});A propriedade env informa ao CDK em qual conta AWS e região implantar. CDK_DEFAULT_ACCOUNT e CDK_DEFAULT_REGION são resolvidos automaticamente pelo CDK CLI a partir de suas credenciais AWS ativas. Consulte a documentação de ambientes do CDK para mais detalhes.
Se você gerou com enableStageConfig, o main.ts lê conta e região de um arquivo de configuração centralizado, recorrendo a variáveis de ambiente quando nenhuma configuração está definida:
import stagesConfig from ':my-scope/common-infra-config';
const projectStages = stagesConfig.projects?.['packages/infra']?.stages ?? {};const sandboxConfig = projectStages['my-app-sandbox'];
new ApplicationStage(app, 'my-app-sandbox', { env: { account: sandboxConfig?.account ?? process.env.CDK_DEFAULT_ACCOUNT, region: sandboxConfig?.region ?? process.env.CDK_DEFAULT_REGION, },});Você pode adicionar mais estágios para implantar em diferentes ambientes. Por exemplo, estágios beta e prod direcionados a contas AWS separadas:
new ApplicationStage(app, 'project-beta', { env: { account: '123456789012', region: 'us-west-2', },});new ApplicationStage(app, 'project-prod', { env: { account: '098765432109', region: 'us-west-2', },});Um Stage agrupa uma ou mais stacks. Você pode adicionar quantas stacks precisar dentro de um estágio:
import { Stage, StageProps } from 'aws-cdk-lib';import { Construct } from 'constructs';import { BackendStack } from '../stacks/backend-stack.js';import { FrontendStack } from '../stacks/frontend-stack.js';
export class ApplicationStage extends Stage { constructor(scope: Construct, id: string, props?: StageProps) { super(scope, id, props);
new BackendStack(this, 'Backend', { crossRegionReferences: true, })
new FrontendStack(this, 'Frontend', { crossRegionReferences: true, }); }}Configuração de Credenciais de Estágio
Seção intitulada “Configuração de Credenciais de Estágio”Quando você tem múltiplos estágios direcionados a diferentes contas AWS, gerenciar credenciais manualmente pode ser propenso a erros, especialmente à medida que o número de estágios cresce.
A opção enableStageConfig resolve isso gerando dois pacotes compartilhados:
packages/common/infra-config— Um único arquivo de configuração onde você mapeia cada estágio para suas credenciais AWS, conta e região. Este arquivo pode ser importado de qualquer pacote no seu workspace, então seumain.tsdo CDK pode ler conta e região da mesma fonte de verdade.packages/common/scripts— Comandosinfra-deployeinfra-destroyque encapsulam o CDK com resolução automática de credenciais. Quando você executadeploy, o script lê a configuração, define as variáveis de ambiente AWS corretas para o processo filho do CDK e executacdk deploy. Seu ambiente shell nunca é modificado.
Configurando Credenciais
Seção intitulada “Configurando Credenciais”Edite packages/common/infra-config/src/stages.config.ts para mapear seus estágios para credenciais AWS:
import type { StagesConfig } from './stages.types.js';
const config: StagesConfig = { projects: { // A chave é o caminho do projeto relativo à raiz do workspace. // Isso corresponde ao caminho em project.json e nos comandos de deploy. 'packages/infra': { stages: { // Os nomes dos estágios devem corresponder aos identificadores de estágio do CDK em main.ts // (o primeiro argumento para `new ApplicationStage(app, 'my-app-dev', ...)`). 'my-app-dev': { credentials: { type: 'profile', profile: 'dev-account' }, region: 'us-east-1', }, 'my-app-prod': { credentials: { type: 'assumeRole', assumeRole: 'arn:aws:iam::123456789012:role/DeployRole', }, region: 'us-west-2', account: '123456789012', }, }, }, }, shared: { // Estágios compartilhados estão disponíveis para todos os projetos de infraestrutura. // Entradas específicas de projeto têm prioridade sobre as compartilhadas. stages: { sandbox: { credentials: { type: 'profile', profile: 'personal-sandbox' }, region: 'us-east-1', }, }, },};
export default config;Quando você implanta, por exemplo:
pnpm nx run infra:deploy my-app-dev/*yarn nx run infra:deploy my-app-dev/*npx nx run infra:deploy my-app-dev/*bunx nx run infra:deploy my-app-dev/*O script de deploy:
- Extrai o nome do estágio
my-app-devdos argumentos do comando - Busca credenciais na configuração: primeiro em
projects['packages/infra'], depois emshared - Se encontrado, define
AWS_PROFILE(ou assume a role IAM) apenas para o processo filho do CDK - Se não encontrado, recorre às credenciais AWS que estiverem no seu ambiente
Isso significa que workflows existentes sem qualquer configuração continuam a funcionar — o script só aplica credenciais quando encontra uma entrada correspondente.
Tipos de Credenciais
Seção intitulada “Tipos de Credenciais”Duas estratégias de credenciais são suportadas:
profile— Usa um perfil AWS CLI nomeado de~/.aws/config. O script defineAWS_PROFILEpara o processo CDK.assumeRole— Chama STS AssumeRole com o ARN da role especificado e passa as credenciais temporárias para o CDK. Você pode opcionalmente especificar umprofilecomo credenciais de origem para a chamada AssumeRole, umexternalIdpara políticas de confiança entre contas e umasessionDurationem segundos.
Conta e Região
Seção intitulada “Conta e Região”Cada configuração de estágio inclui uma region obrigatória e uma account opcional:
region(obrigatória) — A região AWS para implantar (por exemplo,us-east-1,eu-west-2).account(opcional) — O ID da conta AWS. Se omitido, o CDK o infere das credenciais ativas no momento da implantação. Consulte a documentação de ambientes do CDK para saber como o CDK resolve conta e região.
O main.ts gerado lê esses valores da configuração para que a síntese e implantação do CDK usem as mesmas configurações de ambiente:
const sandboxConfig = projectStages['my-app-sandbox'];new ApplicationStage(app, 'my-app-sandbox', { env: { account: sandboxConfig?.account ?? process.env.CDK_DEFAULT_ACCOUNT, region: sandboxConfig?.region ?? process.env.CDK_DEFAULT_REGION, },});Estágios Compartilhados vs Específicos de Projeto
Seção intitulada “Estágios Compartilhados vs Específicos de Projeto”Estágios compartilhados (em shared.stages) se aplicam a qualquer projeto de infraestrutura no workspace. Isso é útil quando múltiplos projetos implantam na mesma conta sandbox — você define as credenciais uma vez em vez de repeti-las para cada projeto.
Estágios específicos de projeto (em projects['packages/infra'].stages) aplicam-se apenas àquele projeto. Quando ambos existem para o mesmo nome de estágio, a entrada específica de projeto tem prioridade.
Infraestrutura de API
Seção intitulada “Infraestrutura de API”Se você usou os geradores tRPC API ou FastAPI para criar APIs, notará que já tem alguns constructs disponíveis em packages/common/constructs para implantá-los.
Se, por exemplo, você criou uma API tRPC chamada my-api, pode simplesmente importar e instanciar o construct para adicionar toda a infraestrutura necessária para implantá-la:
import * as cdk from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyApi } from ':my-scope/common-constructs';
export class ApplicationStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props);
// Adicione infraestrutura para sua API new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), }); }}Infraestrutura de Website
Seção intitulada “Infraestrutura de Website”Se você usou o gerador CloudScape website, notará que já tem um construct em packages/common/constructs para implantá-lo. Por exemplo:
import * as cdk from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite } from ':my-scope/common-constructs';
export class ApplicationStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props);
// Adicione infraestrutura para seu website new MyWebsite(this, 'MyWebsite'); }}É importante garantir que o website seja declarado após quaisquer constructs de API para que o Runtime Config do website inclua todas as configurações de API.
Sintetizando sua Infraestrutura
Seção intitulada “Sintetizando sua Infraestrutura”Como parte do target build, além de executar os targets padrão de compilação, lint e testes, seu projeto de infraestrutura é sintetizado para CloudFormation. Isso também pode ser executado separadamente através do target synth:
pnpm nx run <my-infra>:synthyarn nx run <my-infra>:synthnpx nx run <my-infra>:synthbunx nx run <my-infra>:synthVocê encontrará sua cloud assembly sintetizada na pasta dist raiz, em dist/packages/<my-infra-project>/cdk.out.
Testes de Segurança
Seção intitulada “Testes de Segurança”Um target checkov é adicionado ao seu projeto para executar verificações de segurança na sua infraestrutura usando o Checkov.
pnpm nx run <my-infra>:checkovyarn nx run <my-infra>:checkovnpx nx run <my-infra>:checkovbunx nx run <my-infra>:checkovVocê encontrará os resultados dos testes de segurança na pasta dist raiz, em dist/packages/<my-infra-project>/checkov.
Suprimindo Verificações do Checkov
Seção intitulada “Suprimindo Verificações do Checkov”Pode haver casos onde você queira suprimir certas regras em recursos. Você pode fazer isso de duas formas:
Suprimir uma regra em um construct específico
Seção intitulada “Suprimir uma regra em um construct específico”import { suppressRules } from ':my-scope/common-constructs';
// suprime a CKV_AWS_XXX para o construct especificadosuppressRules(construct, ['CKV_AWS_XXX'], 'Motivo');Suprimir uma regra em um construct descendente
Seção intitulada “Suprimir uma regra em um construct descendente”import { suppressRules } from ':my-scope/common-constructs';
// Suprime a CKV_AWS_XXX para o construct ou quaisquer descendentes se for uma instância de BucketsuppressRules(construct, ['CKV_AWS_XXX'], 'Motivo', (construct) => construct instanceof Bucket);Bootstrapping das Suas Contas AWS
Seção intitulada “Bootstrapping das Suas Contas AWS”Se você está implantando uma aplicação CDK em uma Conta AWS pela primeira vez, ela precisará ser bootstrapped. O bootstrapping cria os recursos que o CDK precisa para gerenciar implantações (um bucket S3 para assets, roles IAM, etc.).
Primeiro, certifique-se de ter configurado credenciais para sua conta AWS.
Em seguida, execute o comando bootstrap para cada conta e região em que você planeja implantar:
npx cdk bootstrap aws://<account-id>/<region>Para mais detalhes, consulte a documentação de bootstrapping do CDK.
Implantando na AWS
Seção intitulada “Implantando na AWS”Após um build, você pode implantar sua infraestrutura na AWS usando o target deploy.
Primeiro, certifique-se de ter credenciais AWS configuradas. Se você gerou com enableStageConfig e configurou credenciais de estágio em packages/common/infra-config/src/stages.config.ts, o comando deploy resolverá e aplicará automaticamente as credenciais corretas para o estágio alvo. Caso contrário, certifique-se de que suas credenciais AWS estejam definidas no seu ambiente (por exemplo, via AWS_PROFILE ou variáveis de ambiente). Consulte a documentação de credenciais AWS para as opções disponíveis.
Em seguida, execute o target deploy:
pnpm nx run <my-infra>:deploy <my-infra>-sandbox/*yarn nx run <my-infra>:deploy <my-infra>-sandbox/*npx nx run <my-infra>:deploy <my-infra>-sandbox/*bunx nx run <my-infra>:deploy <my-infra>-sandbox/*Implantando na AWS em um Pipeline CI/CD
Seção intitulada “Implantando na AWS em um Pipeline CI/CD”Use o target deploy-ci se estiver implantando na AWS como parte de um pipeline CI/CD.
pnpm nx run <my-infra>:deploy-ci my-stage/*yarn nx run <my-infra>:deploy-ci my-stage/*npx nx run <my-infra>:deploy-ci my-stage/*bunx nx run <my-infra>:deploy-ci my-stage/*Este target difere ligeiramente do target deploy normal por implantar uma cloud assembly pré-sintetizada em vez de sintetizar em tempo de execução. Isso evita potencial não-determinismo de mudanças em versões de pacotes, garantindo que cada estágio do pipeline implante usando a mesma cloud assembly.
Removendo Infraestrutura AWS
Seção intitulada “Removendo Infraestrutura AWS”Use o target destroy para remover seus recursos:
pnpm nx run <my-infra>:destroy <my-infra>-sandbox/*yarn nx run <my-infra>:destroy <my-infra>-sandbox/*npx nx run <my-infra>:destroy <my-infra>-sandbox/*bunx nx run <my-infra>:destroy <my-infra>-sandbox/*Mais Informações
Seção intitulada “Mais Informações”Para mais informações sobre o CDK, consulte o Guia do Desenvolvedor CDK e Referência da API.