O blog da AWS

Crie, empacote e publique .NET C# Lambda Functions com o AWS CDK

Por Ulili Nhaga, Arquiteto de aplicativos em nuvem na AWS

 

 

O AWS Cloud Development Kit (CDK) é uma estrutura de desenvolvimento de software de código aberto que define a infraestrutura de nuvem através de código e realiza o provisionamento por meio do AWS CloudFormation. Ele oferece uma abstração de alto nível para definir os recursos AWS usando linguagens de programação modernas. Entre seus componentes, ele fornece aws-s3-assets, que é uma construção de alto nível que abstrai o empacotamento das funções do AWS Lambda. O comportamento padrão dessa construção é compactar todo o conteúdo em uma pasta e carregá-lo em um bucket do Amazon Simple Storage Service (Amazon S3). Isso funciona muito bem para ambientes de execução da Lambda, como Python ou Node.js, que não exigem compilação de código, mas para o.NET, Java ou Go, que exigem compilação de código, você precisará de etapas extras para restaurar dependências externas, compilar o código e publicar o binário. Esta postagem explorará como simplificar a criação, o empacotamento e a publicação de funções .NET Lambda usando o AWS CDK.

Visão geral da arquitetura

Nesta postagem do blog, mostraremos como configurar uma arquitetura básica serverless usando o AWS CDK. Essa arquitetura criará uma API REST usando o Amazon API Gateway, a integração com Lambda proxy e a API Web do ASP.NET no Lambda. A API Web do ASP.NET é uma estrutura para criar APIs da Web sobre o .NET, onde você pode hospedar e executar suas funções Lambda. Essa implementação do AWS CDK criará três funções Lambda com essa arquitetura similar, todas escritas em .NET e mantidas como projetos de API Web ASP.NET separados. Dependendo do caminho da URL solicitado, o API Gateway roteará o tráfego para a função específica da Lambda.
Architecture diagram with API Gateway and Three Lambda Functions

Passo a passo do código

Pré-requisitos

Para permitir que o aplicativo AWS CDK compile e implante uma função Lambda escrita em .NET, você deve primeiro criar um objeto da classe BundlingOptions. O construtor Lambda usará esse objeto para compilar e gerar arquivos binários do código-fonte das funções Lambda .NET durante o tempo de sintetização do Projeto CDK da AWS.

O exemplo a seguir mostra como você pode definir a classe BundlingOptions para a função Lambda .NET. Estas são as propriedades relevantes que você precisará definir:

  • Image – deve receber uma imagem de container da AWS que corresponda ao Lambda runtime
  • User – defina como “root” a permissão do runtime para criar e gerar o arquivo binário de saída
  • OutputType – define como o CDK deve esperar o pacote. Para esta demonstração, ele está definido como Arquivo ZIP.
  • Command – está esperando as instruções de compilação e do pacote. No exemplo de trecho do código a seguir, você pode ver como eu o implementei usando o utilitário Lambda.Tools – afim de ajudar com os comandos .NET para o empacotamento de funções Lambda.
var buildOption = new BundlingOptions()
{
    Image = Runtime.DOTNET_6.BundlingImage,
    User = "root",
    OutputType = BundlingOutput.ARCHIVED,
    Command = new string[]{
   "/bin/sh",
    "-c",
    " dotnet tool install -g Amazon.Lambda.Tools"+
    " && dotnet build"+
    " && dotnet lambda package --output-package /asset-output/function.zip"
    }
};
C#

Com essa definição do objeto BundlingOption, o AWS CDK cuidará do processo de implantação de um projeto de função Lambda .NET. O código de exemplo a seguir é um exemplo de como enviar essa definição do objeto BundlingOption para a construção da função no AWS CDK:

var lambdaFunctionOne = new Function(this, "my-funcOne", new FunctionProps
{
    ...
    Code = Code.FromAsset("../apps/src/FunctionOne/", new Amazon.CDK.AWS.S3.Assets.AssetOptions
    {
        Bundling = buildOption
    }),
});
C#

Implantação e demonstração

O repositório do GitHub “aws-samples/aws-cdk-build-package-publish-dotnet-lambda-function” fornece a demonstração completa, para que você possa implantá-la e fazer solicitações a três exemplos de API para ver a implementação.

Implantação

Siga as etapas abaixo para implantar e testar as funções do .NET Lambda:

  1. Clone o repositório do GitHub
git clone https://github.com/aws-samples/aws-cdk-build-package-publish-dotnet-lambda-function.git
Bash

2. Abra uma sessão de terminal e navegue até a pasta infra dentro do código-fonte do projeto

cd /aws-cdk-build-package-publish-dotnet-lambda-function/infra
Bash

3. Na pasta Infra, digite CDK deploy usando seu perfil de conta da AWS

cdk deploy --profile <o alias do perfil de sua conta AWS>
Bash

Demo

Quando a implantação estiver concluída, copie o Endpoint da saída do terminal. O formato deve ser semelhante a: https://xxxyyyzzz .execute-api.us-east-1.amazonaws.com/prod/. Use esse endpoint em seu cliente de API REST favorito para fazer a solicitação. Esta demonstração está usando o Thunder Client. Ou você pode colar o URL na barra de endereço do navegador e receber as mensagens dessa forma. O exemplo a seguir mostra uma solicitação e uma resposta:

HTTP Get Request to FunctionOne URL using VSCode Thunder Client

Ou você pode usar CURL para fazer a solicitação, conforme mostrado no exemplo a seguir:

Request: curl https://xxxyyyzzz.execute-api.us-west-2.amazonaws.com/prod/

Response: Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function One!
Bash

Para testar a outra função Lambda, altere a URL adicionando /functiontwo ou /functionthree no final da URL original. Por exemplo, use https://xxxyyyzzz .execute-api.us-east-1.amazonaws.com/prod/functiontwo e faça uma solicitação.

HTTP Get Request to FunctionTwo using VSCode Thunder Client

Ou você pode usar CURL para fazer a solicitação, conforme mostrado no exemplo a seguir:

Request: curl https://xxxyyyzzz.execute-api.us-west-2.amazonaws.com/prod/functiontwo

Response: Welcome to running ASP.NET Core Minimal API on AWS Lambda - Function Two!
Bash

Cleaning Up

Siga uma das duas maneiras de remover a implantação:

  1. Acesse o AWS Management Console, navegue até a seção de stacks do CloudFormation e exclua a stack: InfraStack
  2. Na linha de comando, digite CDK destroy no mesmo diretório do qual você implantou.
cd ./aws-cdk-build-package-publish-dotnet-lambda-function/infra
cdk destroy --profile <your AWS account profile alias>
Bash

Conclusão

Nesta postagem do blog, você aprendeu a simplificar a criação, o empacotamento e a publicação de funções Lambda .NET usando o AWS CDK. Você também pode aplicar etapas semelhantes a outros runtimes do Lambda que exigiam a compilação do código, como Java ou Go. Essa abordagem simplifica o processo ao lidar com a compilação do código da função Lambda .NET e o provisionamento da infraestrutura, permitindo que você crie e implante a funções Lambda sem etapas extras para compilação fora do processo de implantação do AWS CDK.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Ulili Nhaga é arquiteto de aplicativos em nuvem na Amazon Web Services em San Diego, Califórnia. Ele ajuda os clientes a migrar, modernizar, arquitetar e criar aplicativos nativos em nuvem altamente escaláveis na AWS. Fora do trabalho, Ulili adora jogar futebol, correr, andar de bicicleta, fazer churrasco brasileiro e aproveitar o tempo na praia.

 

 

 

 

Revisores

Bruno Lopes é Senior Solutions Architect no time da AWS LATAM. Trabalha com soluções de TI há mais de 14 anos, tendo em seu portfólio inúmeras experiências em workloads Microsoft, ambientes híbridos e capacitação técnica de clientes como Technical Trainer e Evangelista. Agora atua como um Arquiteto de Soluções, unindo todas as capacidades para desburocratizar a adoção das melhores tecnologias afim de ajudar os clientes em seus desafios diários.

 

 

 

 

 

Leonardo Bonato Bizaro é estagiário de serviços profissionais no time da ProServe LATAM. Presente desde março de 2022, vem abraçando a grande oportunidade recebida por meio da constante busca de experiência e aprendizado na AWS para crescimento e desenvolvimento profissional.