

# Implantar código TypeScript transcompilado no Lambda com arquivos .zip
<a name="typescript-package"></a>

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:
+ [Usar o AWS Serverless Application Model (AWS SAM)](#aws-sam-ts)
+ [Usar o AWS Cloud Development Kit (AWS CDK)](#aws-cdk-ts)
+ [Usar a AWS Command Line Interface (AWS CLI) e o esbuild](#aws-cli-ts)

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](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html) 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](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 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
<a name="aws-sam-ts"></a>

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:
+ [AWS CLI versão 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [CLI do AWS SAM, versão 1.75 ou posterior](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
+ Node.js

**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 nodejs24.x
   ```

1. (Opcional) A aplicação de exemplo inclui configurações para ferramentas bastante usadas, como [ESLlint](https://eslint.org/) para linting de código e [Jest](https://jestjs.io/) para testes unitários. Para executar comandos lint e de teste:

   ```
   cd sam-app/hello-world
   npm install
   npm run lint
   npm run test
   ```

1. Crie a aplicação.

   ```
   cd sam-app
   sam build
   ```

1. Implante o aplicativo.

   ```
   sam deploy --guided
   ```

1. Siga as instruções na tela. Para aceitar as opções padrão fornecidas na experiência interativa, responda com `Enter`.

1. 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"}
   ```

1. 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
<a name="aws-cdk-ts"></a>

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:
+ [AWS CLI versão 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK versão 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ Node.js
+ [Docker](https://www.docker.com/get-started/) ou [esbuild](https://esbuild.github.io/)

**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
   ```

1. Inicialize a aplicação.

   ```
   cdk init app --language typescript
   ```

1. Adicione o pacote [@types/aws-lambda](https://www.npmjs.com/package/@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
   ```

1. 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**.

1. 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](https://www.npmjs.com/package/@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](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/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',
           }),
       };
   };
   ```

1. Abra o **hello-world.ts** e adicione o código a seguir ao arquivo. Ele contém o [constructo NodejsFunction](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html), que cria a função Lambda, e o [constructo LambdaRestApi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html), 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](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html#configuring-esbuild) (Configurar esbuild) na referência de API do AWS CDK.

1. Abra o **hello-world-stack.ts**. Este é o código que define sua [pilha do AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/stacks.html). 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');
     }
   }
   ```

1. a partir do diretório do `hello-world` que contém seu arquivo `cdk.json`, implante sua aplicação.

   ```
   cdk deploy
   ```

1. 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
<a name="aws-cli-ts"></a>

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:
+ [AWS CLI versão 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ Node.js
+ Uma [função de execução](lambda-intro-execution-role.md) para a função Lambda
+ Para usuários do Windows, um utilitário de arquivo zip, como o [7zip](https://www.7-zip.org/download.html).

**Implantar uma função de exemplo**

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

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

   ```
   npm init
   ```

1. Adicione pacotes [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) e [esbuild](https://esbuild.github.io/) 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
   ```

1. 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](https://www.npmjs.com/package/@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](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/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',
         }),
      };
   };
   ```

1. 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](https://esbuild.github.io/getting-started/#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](https://www.7-zip.org/download.html) 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*"
   },
   ```

------

1. Construa o pacote.

   ```
   npm run build
   ```

1. 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](lambda-intro-execution-role.md).

   ```
   aws lambda create-function --function-name hello-world --runtime "nodejs24.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
   ```

1. [Execute um evento de teste](testing-functions.md) 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](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html).

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