Cloud & Infraestrutura

O que Todo Dev Deve Saber sobre CloudShell e AWS CDK: Infraestrutura como Código Nativa da AWS

8 min de leitura

O que Todo Dev Deve Saber sobre CloudShell e AWS CDK: Infraestrutura como Código Nativa da AWS

CloudShell e AWS CDK: A Fundação da Infraestrutura como Código A infraestrutura como código (IaC) revolucionou como desenvolvemos e mantemos aplicações na nuvem. O AWS CloudShell oferece um ambiente shell pré-configurado diretamente no console AWS, enquanto o AWS CDK permite definir infraestrutura usando linguagens de programação reais como Python, TypeScript ou Go. Juntos, formam um ecossistema poderoso para automação de infraestrutura na AWS. Neste artigo, exploraremos conceitos fundamentais, ferramentas práticas e padrões que todo desenvolvedor deve dominar. CloudShell: Seu Terminal AWS Pessoal O que é CloudShell e Por Que Importa O AWS CloudShell é um shell interativo baseado em navegador, já autenticado com suas credenciais AWS e pré-configurado com ferramentas essenciais como AWS CLI, Git, Docker e Node.js. Não requer instalação local, funciona em qualquer navegador e mantém um armazenamento persistente de 1GB por região. Para desenvolvimento rápido e execução de scripts, é indispensável. Acesse CloudShell diretamente no console AWS (ícone na barra superior). Uma grande vantagem é a integração

<h2>CloudShell e AWS CDK: A Fundação da Infraestrutura como Código</h2>

<p>A infraestrutura como código (IaC) revolucionou como desenvolvemos e mantemos aplicações na nuvem. O AWS CloudShell oferece um ambiente shell pré-configurado diretamente no console AWS, enquanto o AWS CDK permite definir infraestrutura usando linguagens de programação reais como Python, TypeScript ou Go. Juntos, formam um ecossistema poderoso para automação de infraestrutura na AWS. Neste artigo, exploraremos conceitos fundamentais, ferramentas práticas e padrões que todo desenvolvedor deve dominar.</p>

<h2>CloudShell: Seu Terminal AWS Pessoal</h2>

<h3>O que é CloudShell e Por Que Importa</h3>

<p>O AWS CloudShell é um shell interativo baseado em navegador, já autenticado com suas credenciais AWS e pré-configurado com ferramentas essenciais como AWS CLI, Git, Docker e Node.js. Não requer instalação local, funciona em qualquer navegador e mantém um armazenamento persistente de 1GB por região. Para desenvolvimento rápido e execução de scripts, é indispensável.</p>

<p>Acesse CloudShell diretamente no console AWS (ícone <code>&gt;_</code> na barra superior). Uma grande vantagem é a integração automática com IAM — você não precisa configurar credenciais manualmente. Basta iniciar e começar a trabalhar. É ideal para executar comandos AWS CLI, testar CDK localmente e debugar problemas de permissão rapidamente.</p>

<pre><code class="language-bash"># Verificar versão do AWS CLI

aws --version

Listar seus buckets S3

aws s3 ls

Clonar repositório para trabalhar com CDK

git clone https://github.com/seu-repo/seu-cdk-project.git

cd seu-cdk-project</code></pre>

<h3>Usando CloudShell para Gerenciar Projetos CDK</h3>

<p>CloudShell já possui Node.js instalado, o que permite instalar ferramentas CDK e trabalhar com projetos TypeScript ou JavaScript sem setup adicional. Você pode executar <code>cdk synth</code>, <code>cdk deploy</code> e gerenciar stacks diretamente do navegador.</p>

<pre><code class="language-bash"># Instalar AWS CDK globalmente

npm install -g aws-cdk

Criar novo projeto CDK em TypeScript

cdk init app --language typescript

Visualizar recursos que serão criados

cdk synth

Fazer deploy da stack (após revisar)

cdk deploy</code></pre>

<h2>AWS CDK: Programação Orientada à Infraestrutura</h2>

<h3>Fundamentos e Estrutura do Projeto</h3>

<p>O AWS CDK abstrai o CloudFormation em construções de alto nível usando linguagens de programação convencionais. Em vez de escrever YAML/JSON, você escreve código TypeScript, Python ou Go. Um projeto CDK organiza-se em <code>App</code> (raiz), <code>Stack</code> (unidade de deployment) e <code>Construct</code> (blocos reutilizáveis).</p>

<p>A grande vantagem é que você pode usar loops, condicionais, classes e toda a lógica de uma linguagem real. Isso elimina duplicação massiva presente em templates CloudFormation puros. O CDK transpila seu código para CloudFormation automaticamente durante <code>cdk synth</code>.</p>

<pre><code class="language-typescript">// lib/minha-stack.ts

import * as cdk from &#039;aws-cdk-lib&#039;;

import * as s3 from &#039;aws-cdk-lib/aws-s3&#039;;

import * as lambda from &#039;aws-cdk-lib/aws-lambda&#039;;

export class MinhaStack extends cdk.Stack {

constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {

super(scope, id, props);

// Criar bucket S3 com versionamento

const bucket = new s3.Bucket(this, &#039;MeuBucket&#039;, {

versioned: true,

blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,

encryption: s3.BucketEncryption.S3_MANAGED,

});

// Criar função Lambda com acesso ao bucket

const funcao = new lambda.Function(this, &#039;MinhaFuncao&#039;, {

runtime: lambda.Runtime.NODEJS_18_X,

handler: &#039;index.handler&#039;,

code: lambda.Code.fromAsset(&#039;lambda&#039;),

environment: {

BUCKET_NAME: bucket.bucketName,

},

});

// Permitir Lambda ler do bucket

bucket.grantRead(funcao);

}

}</code></pre>

<h3>Constructs: Blocos Reutilizáveis</h3>

<p>Constructs são componentes reutilizáveis que encapsulam lógica de infraestrutura. Os Constructs de nível 1 (L1) mapeiam 1:1 para recursos CloudFormation. Níveis 2 (L2) fornecem abstrações mais inteligentes com padrões bem definidos. Nível 3 (L3) são abstrações empresariais prontas para produção.</p>

<p>Criar seus próprios Constructs promove reutilização entre projetos e times. Um bom Construct deve ter interface clara, documentação e assumir valores padrão sensatos.</p>

<pre><code class="language-typescript">// constructs/api-rest-com-banco.ts

import * as cdk from &#039;aws-cdk-lib&#039;;

import * as apigateway from &#039;aws-cdk-lib/aws-apigateway&#039;;

import * as dynamodb from &#039;aws-cdk-lib/aws-dynamodb&#039;;

import * as lambda from &#039;aws-cdk-lib/aws-lambda&#039;;

export interface ApiRestComBancoProps {

nomeProjeto: string;

ambiente: string;

}

export class ApiRestComBanco extends cdk.Construct {

public readonly api: apigateway.RestApi;

public readonly tabela: dynamodb.Table;

constructor(

scope: cdk.Construct,

id: string,

props: ApiRestComBancoProps

) {

super(scope, id);

this.tabela = new dynamodb.Table(this, &#039;Tabela&#039;, {

partitionKey: { name: &#039;id&#039;, type: dynamodb.AttributeType.STRING },

removalPolicy: cdk.RemovalPolicy.DESTROY,

billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,

});

const funcaoLambda = new lambda.Function(this, &#039;Handler&#039;, {

runtime: lambda.Runtime.PYTHON_3_11,

handler: &#039;index.handler&#039;,

code: lambda.Code.fromAsset(&#039;src&#039;),

environment: { TABLE_NAME: this.tabela.tableName },

});

this.tabela.grantReadWriteData(funcaoLambda);

this.api = new apigateway.RestApi(this, &#039;Api&#039;, {

restApiName: ${props.nomeProjeto}-${props.ambiente},

});

this.api.root.addMethod(

&#039;POST&#039;,

new apigateway.LambdaIntegration(funcaoLambda)

);

}

}</code></pre>

<h2>Boas Práticas e Padrões Críticos</h2>

<h3>Organização e Reutilização</h3>

<p>Estruture seu projeto separando stacks por responsabilidade: uma stack para networking, outra para aplicação, outra para monitoramento. Use Constructs reutilizáveis em diretório <code>constructs/</code> separado. Implemente configuração por ambiente (dev, staging, prod) usando variáveis ou arquivos de configuração, não duplicando código inteiro de stack.</p>

<pre><code class="language-typescript">// bin/app.ts

import * as cdk from &#039;aws-cdk-lib&#039;;

import { MinhaStack } from &#039;../lib/minha-stack&#039;;

const app = new cdk.App();

const ambientes = {

dev: { env: { account: &#039;123456789&#039;, region: &#039;us-east-1&#039; } },

prod: { env: { account: &#039;987654321&#039;, region: &#039;us-east-1&#039; } },

};

Object.entries(ambientes).forEach(([ambiente, config]) =&gt; {

new MinhaStack(app, MinhaStack-${ambiente}, {

...config,

environment: ambiente,

});

});</code></pre>

<h3>Testes e Segurança</h3>

<p>Todo desenvolvedor deve testar sua infraestrutura. Use <code>@aws-cdk/assertions</code> para validar templates gerados. Escaneie seus Constructs com <code>cdk-nag</code> para detectar violações de segurança. Nunca harde credenciais ou secrets no código — use Secrets Manager ou Parameter Store.</p>

<pre><code class="language-typescript">// test/minha-stack.test.ts

import { Template } from &#039;aws-cdk-lib/assertions&#039;;

import * as cdk from &#039;aws-cdk-lib&#039;;

import { MinhaStack } from &#039;../lib/minha-stack&#039;;

test(&#039;Bucket tem versionamento ativado&#039;, () =&gt; {

const app = new cdk.App();

const stack = new MinhaStack(app, &#039;TestStack&#039;);

Template.fromStack(stack).hasResourceProperties(&#039;AWS::S3::Bucket&#039;, {

VersioningConfiguration: {

Status: &#039;Enabled&#039;,

},

});

});</code></pre>

<h2>Conclusão</h2>

<p>Dominar CloudShell e AWS CDK é essencial para qualquer desenvolvedor moderno. Primeiro, compreenda que <strong>CloudShell é seu ambiente de trabalho zero-setup</strong>, eliminando fricção na hora de executar comandos AWS. Segundo, <strong>CDK transforma infraestrutura em código real</strong>, permitindo reutilização, testes e versionamento como faria com aplicação normal. Terceiro, <strong>organize-se em Constructs reutilizáveis e stacks bem definidas</strong> para escalar com qualidade.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html" target="_blank" rel="noopener noreferrer">AWS CloudShell Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html" target="_blank" rel="noopener noreferrer">AWS CDK Developer Guide</a></li>

<li><a href="https://docs.aws.amazon.com/cdk/api/latest/" target="_blank" rel="noopener noreferrer">AWS CDK API Reference</a></li>

<li><a href="https://cdkpatterns.com/" target="_blank" rel="noopener noreferrer">CDK Patterns - Best Practices</a></li>

<li><a href="https://www.oreilly.com/library/view/infrastructure-as-code/9781491924334/" target="_blank" rel="noopener noreferrer">Infrastructure as Code - Kief Morris (O&#039;Reilly)</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

S3 Avançado: Replication, Object Lock, Intelligent Tiering e S3 Select na Prática
S3 Avançado: Replication, Object Lock, Intelligent Tiering e S3 Select na Prática

S3 Replication: Garantindo Disponibilidade e Conformidade S3 Replication perm...

O que Todo Dev Deve Saber sobre CodeCommit, CodeBuild e CodeDeploy: CI/CD Nativo da AWS
O que Todo Dev Deve Saber sobre CodeCommit, CodeBuild e CodeDeploy: CI/CD Nativo da AWS

Entendendo a Tríade CI/CD da AWS A integração contínua e deployment contínuo...

Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis
Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis

AppSync: Fundamentos e Arquitetura AWS AppSync é um serviço gerenciado que pe...