Constructos da camada 1 - Recomendações da AWS

Constructos da camada 1

Os constructos L1 são os blocos de criação do AWS CDK e são facilmente distinguidos de outros constructos pelo prefixo Cfn. Por exemplo, o pacote do Amazon DynamoDB no AWS CDK contém um constructo Table, que é um constructo L2. O constructo L1 correspondente é chamado CfnTable, e representa diretamente uma Table do CloudFormation DynamoDB. É impossível usar o AWS CDK sem acessar essa primeira camada, embora uma aplicação do AWS CDK normalmente nunca use um constructo L1 diretamente. No entanto, na maioria dos casos, os constructos L2 e L3 que os desenvolvedores estão acostumados a usar dependem muito dos constructos L1. Portanto, você pode pensar nos constructos L1 como a ponte entre o CloudFormation e o AWS CDK.

O único propósito do AWS CDK é gerar modelos do CloudFormation usando linguagens de codificação padrão. Depois de executar o comando cdk synth da CLI e gerar os modelos resultantes do CloudFormation, o trabalho do AWS CDK estará concluído. O comando cdk deploy existe apenas por conveniência, mas o que você está fazendo ao executar esse comando acontece inteiramente no CloudFormation. A peça do quebra-cabeça que converte o código do AWS CDK no formato que o CloudFormation entende é o constructo L1.

O ciclo de vida do AWS CDK–CloudFormation para constructos L1

O processo para criar e usar constructos L1 consiste nestas etapas:

  1. O processo de criação do AWS CDK converte as especificações do CloudFormation em código programático na forma de constructos L1.

  2. Os desenvolvedores escrevem código que faz referência direta ou indireta aos constructos L1 como parte de uma aplicação do AWS CDK.

  3. Os desenvolvedores executam o comando cdk synth para converter o código programático novamente no formato ditado pelas especificações (modelos) do CloudFormation.

  4. Os desenvolvedores executam o comando cdk deploy para implantar as pilhas do CloudFormation dentro desses modelos nos ambientes da conta da AWS.

Vamos fazer um pequeno exercício. Acesse o repositório de código aberto do AWS CDK no GitHub, escolha um serviço aleatório da AWS e, em seguida, acesse o pacote do AWS CDK desse serviço (localizado na pasta packages, aws-cdk-lib, aws-<servicename>, lib). Neste exemplo, vamos escolher o Amazon S3, mas isso funciona para qualquer serviço. Se você olhar o arquivo index.ts principal desse pacote, verá uma linha que diz:

export * from './s3.generated';

No entanto, você não verá o arquivo s3.generated em nenhum lugar do diretório correspondente. Isso ocorre porque os constructos L1 são gerados automaticamente da especificação de recursos do CloudFormation durante o processo de criação do AWS CDK. Portanto, você verá s3.generated no pacote somente depois de executar o comando de criação do AWS CDK para o pacote.

A especificação do recurso AWS CloudFormation

A especificação do recurso do AWS CloudFormation define a infraestrutura como código (IAC) para a AWS e determina como o código nos modelos do CloudFormation é convertido em recursos em uma conta da AWS. Essa especificação define os recursos da AWS no formato JSON em um nível por região. Cada recurso recebe um nome de tipo de recurso exclusivo que segue o formato provider::service::resource. Por exemplo, o nome do tipo de recurso para um bucket do Amazon S3 seria AWS::S3::Bucket, e o nome do tipo de recurso para um ponto de acesso Amazon S3 seria AWS::S3::AccessPoint. Esses tipos de recursos podem ser renderizados em um modelo do CloudFormation usando a sintaxe definida na especificação do recurso do AWS CloudFormation. Quando o processo de criação do AWS CDK é executado, cada tipo de recurso também se torna um constructo L1.

Consequentemente, cada constructo L1 é uma imagem espelhada programática de seu recurso correspondente do CloudFormation. Cada propriedade que você aplicaria em um modelo do CloudFormation está disponível quando você instancia um constructo L1, e cada propriedade necessária do CloudFormation também é exigida como argumento quando você instancia o constructo L1 correspondente. A tabela a seguir compara um bucket do S3, conforme representado em um modelo do CloudFormation, com o mesmo bucket do S3, conforme definido como um constructo L1 do AWS CDK.

Modelo do CloudFormation

Constructo L1

"amzns3demobucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }, "MetricsConfigurations": [ { "Id": "myConfig" } ], "OwnershipControls": { "Rules": [ { "ObjectOwnership": "BucketOwnerPreferred" } ] }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, "VersioningConfiguration": { "Status": "Enabled" } } }
new CfnBucket(this, "amzns3demobucket", { bucketName: "amzn-s3-demo-bucket", bucketEncryption: { serverSideEncryptionConfiguration: [ { serverSideEncryptionByDefault: { sseAlgorithm: "AES256" } } ] }, metricsConfigurations: [ { id: "myConfig" } ], ownershipControls: { rules: [ { objectOwnership: "BucketOwnerPreferred" } ] }, publicAccessBlockConfiguration: { blockPublicAcls: true, blockPublicPolicy: true, ignorePublicAcls: true, restrictPublicBuckets: true }, versioningConfiguration: { status: "Enabled" } });

Como você pode ver, o constructo L1 é a manifestação exata no código do recurso do CloudFormation. Não há atalhos ou simplificações, então a quantidade de texto padronizado que deve ser escrita é praticamente a mesma. No entanto, uma das grandes vantagens de usar o AWS CDK é que ele ajuda a eliminar grande parte da sintaxe padronizada do CloudFormation. Então, como isso acontece? É aí que entra o constructo L2.