SST - a parte da infra que pode ser legal
Hoje em dia cloud providers estão cada vez mais em alta e saber o minimo possivel sobre eles meio que passou a ser um requisito implicito, ou um que faz muita diferenca para se destacar hoje em dia. Irei abordar SST, uma ferramenta que trás abstracoes muito interessantes e faceis encima do AWS CDK, um tooling da aws que transforma codigo em templates cloudformation. Cloudformation Nao vou entrar muito nesse assunto, porém é muito importante saber o que é cloudformation: O AWS CloudFormation é um serviço que ajuda você a modelar e configurar seus recursos da AWS para despender menos tempo gerenciando esses recursos e mais tempo se concentrando em seus aplicativos executados AWS. Você cria um modelo que descreve todos os recursos da AWS desejados (como funções do Amazon EC2 e tabelas do Amazon RDS), e o CloudFormation cuida do provisionamento e da configuração desses recursos para você. Não é necessário criar e configurar individualmente os recursos da AWS e descobrir o que depende do que: o CloudFormation lida com tudo isso. Os cenários a seguir demonstram como o CloudFormation pode ajudar. Porém é absolutamente contra intuitivo a maneira como os templates sao criados, sendo assim, abstracoes encima dele sao de suma importancia. Comecando! npx create-next-app@latest aws-nextjs cd aws-nextjs Iremos usar nextjs como exemplo para ilustrar o poder do sst e como ele interage com cdk/cloudformation por debaixo dos panos Iniciar o sst: npx sst@latest init Após isso, sst irá gerar um arquivo de configuracao, onde podemos usar para nosso exemplo: const bucket = new sst.aws.Bucket("MyBucket", { access: "public" }); No código assim, após os templates do CF serem compilados, irá criar na aws um bucket chamado MyBucket onde estará exposto a internet, para acesso publico! Agora, precisamos dizer para o deploy da nossa aplicacao next, que deverá usar esse bucket para colocar assets que nao necessitam estar pelo server: new sst.aws.Nextjs("MyWeb", { link: [bucket] }) Se formos para o codigo fonte, ele encapsula outras partes de infra para que nao precisemos lidar com isso https://github.com/sst/sst/blob/9e099fe2caf4c093f8bc45d5b422a3b652a7dfe7/platform/src/components/aws/nextjs.ts#L7 Há mais coisas na documentacao do SST, mas quero apontar para um pedaco de codigo muito interessante: Lambda/Function Para dar um pouco de contexto, lambda na aws é uma funcao que é executada, tem um comeco e um fim, podendo responder a eventos. Usando CDK há diversas maneiras de fazer o deploy da mesma, com SST, há algumas abstracoes novamente sobre ela: https://github.com/sst/sst/blob/9e099fe2caf4c093f8bc45d5b422a3b652a7dfe7/platform/src/components/aws/function.ts Há por exemplo, configuracao de node, versao, opcoes de bundler usando es-build (https://github.com/sst/sst/blob/9e099fe2caf4c093f8bc45d5b422a3b652a7dfe7/platform/src/components/aws/function.ts#L717-L720) entre outras coisas. Tudo isso para no final das contas criar: return new lambda.Function( transformed[0], { ...transformed[1], ...(dev ? { description: transformed[1].description ? output(transformed[1].description).apply( (v) => `${v.substring(0, 240)} (live)`, ) : "live", runtime: "provided.al2023", architectures: ["x86_64"], } : {}), }, transformed[2], ); }, Por isso é muito mais simples usar as diversas abstracoes que SST nos disponibiliza!
Hoje em dia cloud providers estão cada vez mais em alta e saber o minimo possivel sobre eles meio que passou a ser um requisito implicito, ou um que faz muita diferenca para se destacar hoje em dia. Irei abordar SST, uma ferramenta que trás abstracoes muito interessantes e faceis encima do AWS CDK, um tooling da aws que transforma codigo em templates cloudformation.
Cloudformation
Nao vou entrar muito nesse assunto, porém é muito importante saber o que é cloudformation: O AWS CloudFormation é um serviço que ajuda você a modelar e configurar seus recursos da AWS para despender menos tempo gerenciando esses recursos e mais tempo se concentrando em seus aplicativos executados AWS. Você cria um modelo que descreve todos os recursos da AWS desejados (como funções do Amazon EC2 e tabelas do Amazon RDS), e o CloudFormation cuida do provisionamento e da configuração desses recursos para você. Não é necessário criar e configurar individualmente os recursos da AWS e descobrir o que depende do que: o CloudFormation lida com tudo isso. Os cenários a seguir demonstram como o CloudFormation pode ajudar.
Porém é absolutamente contra intuitivo a maneira como os templates sao criados, sendo assim, abstracoes encima dele sao de suma importancia.
Comecando!
npx create-next-app@latest aws-nextjs
cd aws-nextjs
Iremos usar nextjs como exemplo para ilustrar o poder do sst e como ele interage com cdk/cloudformation por debaixo dos panos
Iniciar o sst:
npx sst@latest init
Após isso, sst irá gerar um arquivo de configuracao, onde podemos usar para nosso exemplo:
const bucket = new sst.aws.Bucket("MyBucket", {
access: "public"
});
No código assim, após os templates do CF serem compilados, irá criar na aws um bucket chamado MyBucket
onde estará exposto a internet, para acesso publico!
Agora, precisamos dizer para o deploy da nossa aplicacao next, que deverá usar esse bucket para colocar assets que nao necessitam estar pelo server:
new sst.aws.Nextjs("MyWeb", {
link: [bucket]
})
Se formos para o codigo fonte, ele encapsula outras partes de infra para que nao precisemos lidar com isso
Há mais coisas na documentacao do SST, mas quero apontar para um pedaco de codigo muito interessante: Lambda/Function
Para dar um pouco de contexto, lambda na aws é uma funcao que é executada, tem um comeco e um fim, podendo responder a eventos. Usando CDK há diversas maneiras de fazer o deploy da mesma, com SST, há algumas abstracoes novamente sobre ela:
https://github.com/sst/sst/blob/9e099fe2caf4c093f8bc45d5b422a3b652a7dfe7/platform/src/components/aws/function.ts
Há por exemplo, configuracao de node, versao, opcoes de bundler usando es-build (https://github.com/sst/sst/blob/9e099fe2caf4c093f8bc45d5b422a3b652a7dfe7/platform/src/components/aws/function.ts#L717-L720) entre outras coisas.
Tudo isso para no final das contas criar:
return new lambda.Function(
transformed[0],
{
...transformed[1],
...(dev
? {
description: transformed[1].description
? output(transformed[1].description).apply(
(v) => `${v.substring(0, 240)} (live)`,
)
: "live",
runtime: "provided.al2023",
architectures: ["x86_64"],
}
: {}),
},
transformed[2],
);
},
Por isso é muito mais simples usar as diversas abstracoes que SST nos disponibiliza!