Configuração de constructos com Esquemas do CDK - AWS Kit de desenvolvimento em nuvem (AWS CDK) v2

Este é o Guia do desenvolvedor do AWS CDK v2. O CDK v1 antigo entrou em manutenção em 1º de junho de 2022 e encerrou o suporte em 1º de junho de 2023.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configuração de constructos com Esquemas do CDK

Use os Esquemas do AWS CDK para padronizar e distribuir configurações do constructo L2 em toda a sua organização. Com os Esquemas, é possível garantir que os recursos da AWS sejam configurados de forma consistente de acordo com seus padrões organizacionais e práticas recomendadas. Por exemplo, é possível habilitar automaticamente a criptografia para todos os buckets do Amazon S3, aplicar configurações de registro em log específicas a todas as funções do AWS Lambda ou aplicar regras de segurança padrão para todos os grupos de segurança.

Os Esquemas são alimentados pela injeção de propriedades, um mecanismo introduzido no AWS CDK v2.196.0 que permite modificar as propriedades do constructo no momento da instanciação. Um Esquema é uma coleção de injetores de propriedades, em que cada injetor de propriedades especifica a configuração ideal para um constructo L2 específico. O Esquema representa as práticas recomendas gerais para sua organização.

Os Esquemas não são um mecanismo de fiscalização da conformidade. Os desenvolvedores ainda podem ignorar os padrões, se necessário. Para uma fiscalização rigorosa da conformidade, considere usar o AWS CloudFormation Guard, as Políticas de controle de serviços ou o CDK Aspects, além dos Esquemas.

Para obter informações detalhadas sobre a implementação, consulte a RFC sobre injeção de propriedades.

Principais componentes dos Esquemas

Os Esquemas são coleções de injetores de propriedades que aplicam propriedades padrão aos constructos quando eles são instanciados. Um injetor de propriedades é um componente que implementa a interface IPropertyInjector, que intercepta a criação do constructo e modifica ou adiciona propriedades antes que o constructo seja criado.

  • IPropertyInjector: um IPropertyInjector define uma forma de injetar propriedades adicionais que não estão especificadas nas props. É específico para um constructo L2 e opera nas propriedades desse constructo.

  • PropertyInjectors: PropertyInjectors são uma coleção de injetores conectados à árvore de constructos. Os injetores podem ser conectados a qualquer constructo, mas, na prática, esperamos que a maioria deles seja conectada a um App, Stage ou Stack.

Casos de uso comuns para os Esquemas.

É possível usar os Esquemas do CDK para padronizar muitos aspectos dos seus recursos da AWS. Aqui estão alguns casos de uso comuns:

Padrões de segurança
  • Certificação de que todos os buckets do Amazon S3 tenham a criptografia no lado do servidor habilitada.

  • Configuração de todos os grupos de segurança para bloquear o acesso público por padrão.

  • Aplicação de permissões do AWS Identity and Access Management (IAM) com privilégio mínimo às funções do AWS Lambda.

  • Aplicação de SSL para todas as comunicações de rede.

Excelência operacional
  • Configuração do registro padronizado para todas as funções do AWS Lambda.

  • Aplicação de estratégias de marcação consistentes em todos os recursos.

  • Configuração de limites padrão de monitoramento e alerta.

  • Implementação de políticas de retenção padrão para logs e backups.

Otimização de custos
  • Configuração de tamanhos de instância apropriados com base no ambiente.

  • Aplicação de políticas de ajuste de escala automático com padrões organizacionais.

  • Definição de regras de ciclo de vida para buckets do Amazon S3 para fazer a transição de objetos para classes de armazenamento mais baratas.

  • Configuração de throughput provisionado padrão para bancos de dados.

Requisitos de conformidade
  • Implementação das configurações de criptografia necessárias para dados regulamentados.

  • Aplicação de políticas de backup necessárias para atender aos requisitos de retenção de dados.

  • Definição das configurações padrão da Amazon VPC que atendam aos requisitos de segurança.

  • Certificação de que os recursos tenham as tags necessárias para alocação de custos.

Produtividade do desenvolvedor
  • Fornecimento de padrões sensatos que reduzam a necessidade de código clichê.

  • Criação de classes de pilha específicas da organização com injetores integrados.

  • Compartilhamento das práticas recomendadas entre as equipes por meio de injetores reutilizáveis.

  • Simplificação da integração codificando o conhecimento organizacional em código.

Conceitos básicos dos Esquemas

Veja a seguir um exemplo simples de como criar e usar um injetor de propriedades:

Primeiro, crie um injetor de propriedades para os buckets do Amazon S3:

import { IPropertyInjector, InjectionContext } from 'aws-cdk-lib'; import { Bucket, BucketProps, BlockPublicAccess } from 'aws-cdk-lib/aws-s3'; export class SecureBucketDefaults implements IPropertyInjector { public readonly constructUniqueId: string; constructor() { this.constructUniqueId = Bucket.PROPERTY_INJECTION_ID; } public inject(originalProps: BucketProps, _context: InjectionContext): BucketProps { return { // Set security defaults blockPublicAccess: BlockPublicAccess.BLOCK_ALL, enforceSSL: true, // Include original props to allow overrides ...originalProps, }; } }

Em seguida, use o injetor em sua aplicação do CDK:

import { App, Stack } from 'aws-cdk-lib'; import { Bucket } from 'aws-cdk-lib/aws-s3'; import { SecureBucketDefaults } from './secure-bucket-defaults'; // Attach injectors when creating the App const app = new App({ propertyInjectors: [new SecureBucketDefaults()] }); const stack = new Stack(app, 'MyStack'); // This bucket automatically gets the default properties const myBucket = new Bucket(stack, 'MyBucket');

De forma alternativa, é possível usar o método PropertyInjectors.of():

import { App, Stack, PropertyInjectors } from 'aws-cdk-lib'; import { SecureBucketDefaults } from './secure-bucket-defaults'; const app = new App(); PropertyInjectors.of(app).add(new SecureBucketDefaults()); const stack = new Stack(app, 'MyStack'); const myBucket = new Bucket(stack, 'MyBucket');

Práticas recomendadas

  • Coloque as propriedades padrão antes de …​originalProps para permitir que sejam ignoradas.

  • Coloque as propriedades forçadas depois de …​originalProps para evitar que sejam ignoradas.

  • Use um sinalizador de pulo ao criar recursos para evitar a recursão infinita. Para ver um exemplo, consulte O que acontece quando você precisa criar um AccessLogBucket para um bucket? na RFC de injeção de propriedades.

  • Adição de logs para depuração.

  • Use o contexto do CDK para habilitar/desabilitar injetores para testes.

Para obter informações mais detalhadas sobre a injeção de propriedades, incluindo detalhes de implementação, dicas de solução de problemas e informações de referência, consulte a RFC de injeção de propriedades.