# AWS CDK, CDKTF e Projen: Ferramentas para Automação de Infraestrutura em Nuvem ## 1. AWS Cloud Development Kit (AWS CDK) [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/) é um framework open-source que permite aos desenvolvedores definirem infraestrutura em nuvem usando linguagens de programação como TypeScript, Python e Java. O CDK gera templates do AWS CloudFormation, permitindo que os usuários escrevam infraestrutura como código (IaC) em um ambiente de programação mais familiar e flexível. ### Em um Contexto de Nuvem Não-AWS: Para nuvens que suportam uma API compatível com S3 e provedores Terraform da AWS, mas que não usam AWS CloudFormation, o CDK não é diretamente aplicável. No entanto, o [Cloud Development Kit for Terraform (CDKTF)](https://developer.hashicorp.com/terraform/cdktf) oferece uma abordagem semelhante para definir infraestrutura usando linguagens de programação de alto nível, enquanto utiliza o Terraform como o mecanismo subjacente para provisionamento. ## 2. Cloud Development Kit for Terraform (CDKTF) [Cloud Development Kit for Terraform (CDKTF)](https://developer.hashicorp.com/terraform/cdktf) estende o modelo do CDK para o Terraform. O CDKTF permite que os desenvolvedores definam infraestrutura em nuvem em linguagens como TypeScript, Python, Java e Go, enquanto usam o Terraform para provisionar os recursos. O CDKTF é agnóstico em relação à nuvem e suporta qualquer provedor que tenha suporte no ecossistema do Terraform, incluindo aqueles que oferecem serviços compatíveis com AWS, como o S3. ### Em um Contexto de Nuvem Não-AWS: Para ambientes de nuvem que suportam provedores compatíveis com AWS no Terraform, o CDKTF pode ser usado para gerenciar recursos. O CDKTF oferece flexibilidade na definição de infraestrutura usando linguagens de programação, enquanto o Terraform cuida do provisionamento dos recursos através do provedor correspondente. ## 3. Projen [Projen](https://github.com/projen/projen) é uma ferramenta projetada para automatizar a configuração e manutenção de projetos, particularmente para projetos com CDK, CDKTF e TypeScript. O Projen gera e mantém arquivos de configuração, workflows e scripts, garantindo consistência e reduzindo o esforço manual. ### Em um Contexto de Nuvem Não-AWS: O Projen pode ser utilizado independentemente do provedor de nuvem, já que seu foco principal é a automação da configuração do projeto, ao invés do gerenciamento de recursos em nuvem. Ele é especialmente útil para projetos com CDKTF, ajudando a automatizar a criação e manutenção de arquivos de configuração e a manter os projetos organizados. ## Resumo: Em ambientes com APIs compatíveis com S3 e suporte a provedores Terraform da AWS, o CDKTF e o Projen são ferramentas úteis para gerenciar infraestrutura em nuvem e configurações de projetos. O CDKTF permite que os desenvolvedores definam infraestrutura usando linguagens de programação familiares e conta com o Terraform para o gerenciamento dos recursos, enquanto o Projen ajuda na automação da configuração do projeto. O AWS CDK em si não é diretamente aplicável em ambientes não-AWS que não suportam CloudFormation, mas o CDKTF serve como uma alternativa viável. --- ## Exemplo de Código: Provisionando um Bucket Compatível com S3 com Dois Objetos Usando CDKTF Aqui está um exemplo de programa TypeScript usando CDKTF para provisionar um bucket compatível com S3 e dois objetos (arquivos) copiados do sistema de arquivos local, usando o perfil AWS `projen`: ``` import { App, TerraformStack } from 'cdktf'; import { AwsProvider } from '@cdktf/provider-aws'; import { S3Bucket, S3BucketObject } from '@cdktf/provider-aws/lib/s3'; import * as fs from 'fs'; import * as path from 'path'; class MyStack extends TerraformStack { constructor(scope: App, id: string) { super(scope, id); // Inicializar o provedor AWS usando o perfil "projen" new AwsProvider(this, 'AWS', { profile: 'projen', skipCredentialsValidation: true, skipRegionValidation: true, skipRequestingAccountId: true, }); // Definir o bucket compatível com S3 const bucket = new S3Bucket(this, 'MyBucket', { bucketPrefix: 'tutorial-bucket', }); // Adicionar dois objetos (arquivos) ao bucket a partir do sistema de arquivos const filesToUpload = { file1: path.resolve(__dirname, 'file1.txt'), file2: path.resolve(__dirname, 'file2.txt'), }; // Garantir que os arquivos existam no sistema de arquivos local for (const [fileKey, filePath] of Object.entries(filesToUpload)) { if (!fs.existsSync(filePath)) { throw new Error(`Arquivo não encontrado: ${filePath}. Certifique-se de que ele existe.`); } new S3BucketObject(this, `BucketObject-${fileKey}`, { bucket: bucket.bucket, key: path.basename(filePath), // Usar o nome do arquivo como a chave do objeto source: filePath, // Caminho para o arquivo no sistema local }); } } } const app = new App(); new MyStack(app, 'my-stack'); app.synth(); ``` ### Configuração Equivalente no Terraform: Para comparação, aqui está a configuração equivalente em HCL do Terraform: ``` provider "aws" { profile = "projen" skip_credentials_validation = true skip_region_validation = true skip_requesting_account_id = true } resource "aws_s3_bucket" "my_bucket" { bucket_prefix = "tutorial-bucket" } resource "aws_s3_object" "file1" { bucket = aws_s3_bucket.my_bucket.bucket key = "file1.txt" source = "./file1.txt" } resource "aws_s3_object" "file2" { bucket = aws_s3_bucket.my_bucket.bucket key = "file2.txt" source = "./file2.txt" } ``` ### Opções de Build e Deploy Você pode construir e fazer o deploy do projeto usando o CLI do `cdktf` ou Projen. Se você estiver usando apenas o `cdktf`, execute: ``` cdktf deploy ``` Se você estiver usando o Projen para gerenciar o projeto, pode construir e fazer o deploy com os seguintes comandos: ``` npx projen build npx projen deploy ``` Ambas as abordagens irão sintetizar e fazer o deploy da infraestrutura usando o Terraform como backend.