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:
-
Node.js 18.x
Implantar uma aplicação de exemplo do AWS SAM
-
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
-
(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
-
Crie a aplicação.
cd sam-app sam build
-
Implante o aplicativo.
sam deploy --guided
-
Siga as instruções na tela. Para aceitar as opções padrão fornecidas na experiência interativa, responda com
Enter
. -
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.
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:
-
Node.js 18.x
Implantar uma aplicação de exemplo do AWS CDK
-
Crie um diretório de projeto para sua aplicação.
mkdir hello-world cd hello-world
-
Inicialize a aplicação.
cdk init app --language typescript
-
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
-
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.
-
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-lambdano 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', }), }; };
-
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.
-
-
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'); } }
-
a partir do diretório do
hello-world
que contém seu arquivocdk.json
, implante sua aplicação.cdk deploy
-
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:
-
Node.js 18.x
-
Uma função de execução para a função Lambda
-
Para usuários do Windows, um utilitário de arquivo zip, como o 7zip
.
Implantar uma função de exemplo
-
Em sua máquina local, crie um diretório de projeto para sua nova função.
-
Crie um novo projeto Node.js com npm ou um gerenciador de pacotes de sua escolha.
npm init
-
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
-
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-lambdano 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', }), }; };
-
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. -
Construa o pacote.
npm run build
-
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 -
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\"}" }