Implantar código TypeScript transcompilado no Lambda com arquivos .zip - AWS Lambda

Implantar código TypeScript transcompilado no Lambda com arquivos .zip

Antes que você possa implantar o código TypeScript ao AWS Lambda, é necessário transcompilá-lo para JavaScript. Esta página explica três maneiras de criar e implantar o código TypeScript no Lambda com arquivos .zip:

O AWS SAM e o AWS CDK simplificam a construção e a implantação de funções do TypeScript. A especificação do modelo do AWS SAM fornece uma sintaxe simples e clara para descrever as funções, APIs, permissões, configurações e eventos do Lambda que compõem sua aplicação sem servidor. O AWS CDK permite criar aplicações confiáveis, escaláveis e com bom custo-benefício na nuvem com o considerável poder expressivo de uma linguagem de programação. O AWS CDK destina-se a usuários da AWS bastante experientes ou moderadamente experientes. Tanto o AWS CDK como o AWS SAM usam esbuild para transcompilar código TypeScript em JavaScript.

Uso do AWS SAM para implantar código TypeScript no Lambda

Siga as etapas abaixo para baixar, criar e implantar uma aplicação de exemplo do Hello World TypeScript usando o AWS SAM. Esta aplicação implementa um backend básico da API. Consiste em um endpoint do Amazon API Gateway e uma função Lambda. Ao enviar uma solicitação GET ao endpoint do API Gateway, você invoca a função Lambda. A função retorna uma mensagem hello world.

nota

O AWS SAM usa esbuild para criar funções do Lambda do Node.js a partir de código do TypeScript. O suporte ao esbuild está atualmente em pré-visualização pública. Durante a pré-visualização pública, o suporte ao esbuild pode estar sujeito a alterações incompatíveis com versões anteriores.

Pré-requisitos

Para executar as etapas desta seção, você deve ter o seguinte:

Implantar uma aplicação de exemplo do AWS SAM
  1. Inicialize a aplicação usando o modelo Hello World TypeScript.

    sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs18.x
  2. (Opcional) A aplicação de exemplo inclui configurações para ferramentas bastante usadas, como ESLlint para linting de código e Jest para testes unitários. Para executar comandos lint e de teste:

    cd sam-app/hello-world npm install npm run lint npm run test
  3. Crie a aplicação.

    cd sam-app sam build
  4. Implante o aplicativo.

    sam deploy --guided
  5. Siga as instruções na tela. Para aceitar as opções padrão fornecidas na experiência interativa, responda com Enter.

  6. A saída mostra o endpoint para a API REST. Abra o endpoint em um navegador para testar a função. Você deverá visualizar esta resposta:

    {"message":"hello world"}
  7. Este é um endpoint de API pública que é acessado pela Internet. Recomendamos excluir o endpoint após o teste.

    sam delete

Usar o AWS CDK para implantar código TypeScript no Lambda

Siga as etapas abaixo para criar e implantar uma aplicação TypeScript de exemplo usando o AWS CDK. Esta aplicação implementa um backend básico da API. Consiste em um endpoint do API Gateway e uma função Lambda. Ao enviar uma solicitação GET ao endpoint do API Gateway, você invoca a função Lambda. A função retorna uma mensagem hello world.

Pré-requisitos

Para executar as etapas desta seção, você deve ter o seguinte:

Implantar uma aplicação de exemplo do AWS CDK
  1. Crie um diretório de projeto para sua aplicação.

    mkdir hello-world cd hello-world
  2. Inicialize a aplicação.

    cdk init app --language typescript
  3. Adicione o pacote @types/aws-lambda como uma dependência de desenvolvimento. Esse pacote contém as definições de tipo para o Lambda.

    npm install -D @types/aws-lambda
  4. Abra o diretório lib. Você deverá ver um arquivo chamado hello-world-stack.ts. Crie dois novos arquivos neste diretório: hello-world.function.ts e hello-world.ts.

  5. Abra o hello-world.function.ts e adicione o código a seguir ao arquivo. Este é o código da função Lambda.

    nota

    A instrução import importa as definições de tipo de @types/aws-lambda. Ela não importa o pacote aws-lambda do NPM, que é uma ferramenta de terceiros não relacionada. Para obter mais informações, consulte aws-lambda no repositório DefinitelyTyped do GitHub.

    import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  6. Abra o hello-world.ts e adicione o código a seguir ao arquivo. Ele contém o constructo NodejsFunction, que cria a função Lambda, e o constructo LambdaRestApi, que cria a API REST.

    import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function'); new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); } }

    O constructo NodejsFunction assume o seguinte, por padrão:

    • O manipulador de funções chama-se handler.

    • O arquivo .ts que contém o código da função (hello-world.function.ts) está no mesmo diretório que o arquivo .ts que contém o constructo (hello-world.ts). O constructo usa o ID do constructo (“hello-world”) e o nome de arquivo do manipulador do Lambda (“function”) para encontrar o código da função. Por exemplo, se o código da função estiver em um arquivo chamado hello-world.my-function.ts, o arquivo hello-world.ts deverá referenciar o código da função deste modo:

      const helloFunction = new NodejsFunction(this, 'my-function');

    É possível alterar esse comportamento e configurar outros parâmetros do esbuild. Para mais informações, consulte Configuring esbuild (Configurar esbuild) na referência de API do AWS CDK.

  7. Abra o hello-world-stack.ts. Este é o código que define sua pilha do AWS CDK. Substitua o código pelo seguinte:

    import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
  8. a partir do diretório do hello-world que contém seu arquivo cdk.json, implante sua aplicação.

    cdk deploy
  9. O AWS CDK cria e empacota a função Lambda usando esbuild e implanta a função no runtime do Lambda. A saída mostra o endpoint para a API REST. Abra o endpoint em um navegador para testar a função. Você deverá visualizar esta resposta:

    {"message":"hello world"}

    Este é um endpoint de API pública que é acessado pela Internet. Recomendamos excluir o endpoint após o teste.

Usar a AWS CLI e o esbuild para implantar código TypeScript no Lambda

O exemplo a seguir demonstra como transcompilar e implantar código TypeScript no Lambda usando o esbuild e a AWS CLI. O esbuild produz um arquivo JavaScript com todas as dependências. Este é o único arquivo que você precisa adicionar ao arquivo.zip.

Pré-requisitos

Para executar as etapas desta seção, você deve ter o seguinte:

Implantar uma função de exemplo
  1. Em sua máquina local, crie um diretório de projeto para sua nova função.

  2. Crie um novo projeto Node.js com npm ou um gerenciador de pacotes de sua escolha.

    npm init
  3. Adicione pacotes @types/aws-lambda e esbuild como dependência de desenvolvimento. O pacote @types/aws-lambda contém as definições de tipo para o Lambda.

    npm install -D @types/aws-lambda esbuild
  4. Crie um novo arquivo chamado index.ts. Adicione o código a seguir ao novo arquivo. Este é o código da função Lambda. A função retorna uma mensagem hello world. A função não cria recursos do API Gateway.

    nota

    A instrução import importa as definições de tipo de @types/aws-lambda. Ela não importa o pacote aws-lambda do NPM, que é uma ferramenta de terceiros não relacionada. Para obter mais informações, consulte aws-lambda no repositório DefinitelyTyped do GitHub.

    import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  5. Adicione um script de compilação ao arquivo package.json. Isso configura o esbuild para criar automaticamente o pacote de implantação .zip. Para obter mais informações, consulte Build scripts (Scripts de compilação) na documentação do esbuild.

    Linux and MacOS
    "scripts": { "prebuild": "rm -rf dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && zip -r index.zip index.js*" },
    Windows

    Neste exemplo, o comando "postbuild" usa o utilitário 7zip para criar o arquivo .zip. Use seu próprio utilitário zip do Windows preferido e modifique o comando conforme necessário.

    "scripts": { "prebuild": "del /q dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && 7z a -tzip index.zip index.js*" },
  6. Construa o pacote.

    npm run build
  7. Crie uma função Lambda usando o pacote de implantação .zip. Substitua o texto em destaque pelo nome do recurso da Amazon (ARN) da função de execução.

    aws lambda create-function --function-name hello-world --runtime "nodejs18.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
  8. Execute um evento de teste para confirmar que a função retorna a resposta a seguir. Para invocar essa função usando o API Gateway, crie e configure uma API REST.

    { "statusCode": 200, "body": "{\"message\":\"hello world\"}" }