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