

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á.

# Constructos da camada 1
<a name="layer-1"></a>

Os [constructos L1](https://docs.aws.amazon.com/cdk/v2/guide/constructs.html#constructs_l1_using) 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
<a name="l1-lifecycle"></a>

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.

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

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

1. 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](https://github.com/aws/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](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/aws-s3/lib/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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html) 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 name="l1-spec"></a>

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](https://www.json.org/json-en.html) em um nível por região. Cada recurso recebe um [nome de tipo de recurso](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html) 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** | 
| --- |--- |
| <pre>"amzns3demobucket": {<br />    "Type": "AWS::S3::Bucket",<br />    "Properties": {<br />      "BucketName": "amzn-s3-demo-bucket",<br />      "BucketEncryption": {<br />        "ServerSideEncryptionConfiguration": [<br />          {<br />            "ServerSideEncryptionByDefault": {<br />              "SSEAlgorithm": "AES256"<br />            }<br />          }<br />        ]<br />      },<br />      "MetricsConfigurations": [<br />        {<br />          "Id": "myConfig"<br />        }<br />      ],<br />      "OwnershipControls": {<br />        "Rules": [<br />          {<br />            "ObjectOwnership": "BucketOwnerPreferred"<br />          }<br />        ]<br />      },<br />      "PublicAccessBlockConfiguration": {<br />        "BlockPublicAcls": true,<br />        "BlockPublicPolicy": true,<br />        "IgnorePublicAcls": true,<br />        "RestrictPublicBuckets": true<br />      },<br />      "VersioningConfiguration": {<br />        "Status": "Enabled"<br />      }<br />    }<br />  }</pre> | <pre>new CfnBucket(this, "amzns3demobucket", {<br />  bucketName: "amzn-s3-demo-bucket",<br />  bucketEncryption: {<br />    serverSideEncryptionConfiguration: [<br />      {<br />        serverSideEncryptionByDefault: {<br />          sseAlgorithm: "AES256"<br />        }<br />      }<br />    ]<br />  },<br />  metricsConfigurations: [<br />    {<br />      id: "myConfig"<br />    }<br />  ],<br />  ownershipControls: {<br />    rules: [<br />      {<br />        objectOwnership: "BucketOwnerPreferred"<br />      }<br />    ]<br />  },<br />  publicAccessBlockConfiguration: {<br />    blockPublicAcls: true,<br />    blockPublicPolicy: true,<br />    ignorePublicAcls: true,<br />    restrictPublicBuckets: true<br />  },<br />  versioningConfiguration: {<br />    status: "Enabled"<br />  }<br />});</pre> | 

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.