

# Implementar código de TypeScript transpilado en Lambda con archivos .zip
<a name="typescript-package"></a>

Para poder implementar código de TypeScript enAWS Lambda, tiene que transpilarlo a JavaScript. En esta página se explican tres formas de crear e implementar código de TypeScript en Lambda con archivos .zip:
+ [Uso de AWS Serverless Application Model (AWS SAM)](#aws-sam-ts)
+ [Uso de AWS Cloud Development Kit (AWS CDK)](#aws-cdk-ts)
+ [Uso de AWS Command Line Interface (AWS CLI) y esbuild](#aws-cli-ts)

AWS SAM y AWS CDK simplifican la creación e implementación de funciones de TypeScript. La [especificación de plantillas de AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html) proporciona una sintaxis sencilla y limpia para describir las funciones, las API, los permisos, las configuraciones y los eventos de Lambda que constituyen la aplicación sin servidor. [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html) permite crear aplicaciones fiables, escalables y rentables en la nube con la considerable potencia expresiva de un lenguaje de programación. AWS CDK se dirige a usuarios de AWS con una experiencia entre media y alta. Tanto AWS CDK como AWS SAM utilizan esbuild para transpilar código de TypeScript a JavaScript.

## Uso de AWS SAM para implementar código de TypeScript en Lambda
<a name="aws-sam-ts"></a>

Siga los pasos que figuran a continuación para descargar, compilar e implementar una aplicación de ejemplo de TypeScript de tipo “hola mundo” mediante AWS SAM. Esta aplicación implementa un backend de API básico. Consta de un punto de conexión de Amazon API Gateway y una función de Lambda. Cuando se envía una solicitud GET al punto de conexión de API Gateway, se invoca la función de Lambda. La función devuelve el mensaje `hello world`.

**nota**  
AWS SAM utiliza esbuild para crear funciones de Lambda de Node.js a partir de código de TypeScript. La compatibilidad con esbuild se encuentra actualmente en versión preliminar pública. Mientras se encuentre en versión preliminar pública, el soporte de esbuild puede verse sometido a cambios incompatibles con versiones anteriores.

**Requisitos previos**

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Versión 1.75 o posterior de la CLI de AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
+ Node.js

**Implementar un aplicación de ejemplo de AWS SAM**

1. Inicialice la aplicación utilizando la plantilla de TypeScript de tipo “hola mundo”.

   ```
   sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs24.x
   ```

1. (Opcional) La aplicación de ejemplo incluye configuraciones para herramientas de uso habitual, tales como [ESLint](https://eslint.org/) para linting de código y [Jest](https://jestjs.io/) para pruebas unitarias. Para ejecutar comandos de lint y pruebas:

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

1. Compile la aplicación.

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

1. Implemente la aplicación.

   ```
   sam deploy --guided
   ```

1. Siga las indicaciones que aparecen en pantalla. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, responda con `Enter`.

1. El resultado muestra el punto de conexión de la API REST. Abra el punto de conexión en un navegador para probar la función. Debería ver esta respuesta:

   ```
   {"message":"hello world"}
   ```

1. Se trata de un punto de conexión de API pública al que se puede acceder a través de Internet. Se recomienda eliminar el punto de conexión después de las pruebas.

   ```
   sam delete
   ```

## Uso de AWS CDK para implementar código de TypeScript en Lambda
<a name="aws-cdk-ts"></a>

Siga los pasos que figuran a continuación para crear e implementar una aplicación de ejemplo de TypeScript mediante AWS CDK. Esta aplicación implementa un backend de API básico. Consiste en un punto de conexión de API Gateway y una función de Lambda. Cuando se envía una solicitud GET al punto de conexión de API Gateway, se invoca la función de Lambda. La función devuelve el mensaje `hello world`.

**Requisitos previos**

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK versión 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ Node.js
+ Bien sea [Docker](https://www.docker.com/get-started/) o [esbuild](https://esbuild.github.io/)

**Implementar un aplicación de ejemplo de AWS CDK**

1. Cree un directorio de proyecto para la nueva aplicación.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. Inicialice la aplicación.

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

1. Agregue el paquete [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) en forma de dependencia de desarrollo. Este paquete contiene las definiciones de tipos de Lambda.

   ```
   npm install -D @types/aws-lambda
   ```

1. Abra el directorio **lib**. Debería ver un archivo llamado **hello-world-stack.ts**. Cree dos nuevos archivos en este directorio: **hello-world.function.ts** y **hello-world.ts**.

1. Abra **hello-world.function.ts** y agregue el siguiente código al archivo. Se trata del código de la función de Lambda.
**nota**  
La instrucción `import` importa las definiciones de tipo de [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda). No importa el paquete NPM de `aws-lambda`, que es una herramienta de terceros no relacionada. Para obtener más información, consulte [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) en el repositorio de GitHub DefinitelyTyped.

   ```
   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 **hello-world.ts** y agregue el siguiente código al archivo. Este código contiene [la construcción NodejsFunction](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html), que crea la función de Lambda, y la [construcción LambdaRestApi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html), que crea la 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,
       });
     }
   }
   ```

   La construcción `NodejsFunction` presupone lo siguiente de manera predeterminada:
   + El controlador de función se llama `handler`.
   + El archivo .ts que contiene el código de la función (**hello-world.function.ts**) se encuentra en el mismo directorio que el archivo .ts que contiene la construcción (**hello-world.ts**). La construcción utiliza el ID de la construcción (“hello-world”) y el nombre del archivo del controlador de Lambda (“function”) para buscar el código de la función. Por ejemplo, si el código de la función se encuentra en un archivo llamado **hello-world.my-function.ts**, el archivo **hello-world.ts** debe hacer referencia al código de la función de este modo:

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

   Puede cambiar este comportamiento y configurar otros parámetros de esbuild. Para obtener más información, consulte [Configuración de esbuild](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html#configuring-esbuild) en la Referencia de la API de AWS CDK.

1. Abra **hello-world-stack.ts**. Este es el código que define la [pila de AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/stacks.html). Reemplace el código con lo siguiente:

   ```
   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. el directorio `hello-world` que contiene su archivo `cdk.json`, implemente su aplicación.

   ```
   cdk deploy
   ```

1. AWS CDK compila y empaqueta la función de Lambda mediante esbuild y, a continuación, implementa la función en el tiempo de ejecución de Lambda. El resultado muestra el punto de conexión de la API REST. Abra el punto de conexión en un navegador para probar la función. Debería ver esta respuesta:

   ```
   {"message":"hello world"}
   ```

   Se trata de un punto de conexión de API pública al que se puede acceder a través de Internet. Se recomienda eliminar el punto de conexión después de las pruebas.

## Uso de AWS CLI y esbuild para implementar código de TypeScript en Lambda
<a name="aws-cli-ts"></a>

El siguiente ejemplo muestra cómo transpilar e implementar código de TypeScript en Lambda mediante esbuild y AWS CLI. esbuild produce un archivo de JavaScript con todas las dependencias. Este es el único archivo que hay que agregar al archivo .zip.

**Requisitos previos**

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ Node.js
+ Un [rol de ejecución](lambda-intro-execution-role.md) para la función de Lambda.
+ Para los usuarios de Windows, una utilidad de archivos zip como [7zip](https://www.7-zip.org/download.html).

**Implementar una función de ejemplo**

1. En su máquina local, cree un directorio de proyecto para su nueva función. 

1. Cree un nuevo proyecto de Node.js con npm o un administrador de paquetes de su elección.

   ```
   npm init
   ```

1. Agregue los paquetes [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) y [esbuild](https://esbuild.github.io/) en forma de dependencias de desarrollo. El paquete `@types/aws-lambda` contiene las definiciones de tipos de Lambda.

   ```
   npm install -D @types/aws-lambda esbuild
   ```

1. Cree un nuevo archivo con el nombre **index.ts**. Agregue el siguiente código al nuevo archivo. Se trata del código de la función de Lambda. La función devuelve el mensaje `hello world`. La función no crea ningún recurso de API Gateway.
**nota**  
La instrucción `import` importa las definiciones de tipo de [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda). No importa el paquete NPM de `aws-lambda`, que es una herramienta de terceros no relacionada. Para obtener más información, consulte [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) en el repositorio de GitHub DefinitelyTyped.

   ```
   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. Agregue un script de compilación al archivo **package.json**. Esto configura esbuild para que cree automáticamente el paquete de implementación .zip. Para obtener más información, consulte [Build scripts](https://esbuild.github.io/getting-started/#build-scripts) (Scripts de compilación) en la documentación de 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 ]

   En este ejemplo, el comando `"postbuild"` usa la utilidad [7zip](https://www.7-zip.org/download.html) para crear el archivo.zip. Utilice la utilidad zip de Windows que prefiera y modifique el comando según sea necesario.

   ```
   "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. Cree el paquete.

   ```
   npm run build
   ```

1. Cree una función de Lambda mediante el paquete de implementación .zip. Reemplace el texto resaltado con el nombre de recurso de Amazon (ARN) del [rol de ejecución](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. [Ejecute un evento de prueba](testing-functions.md) para confirmar que la función devuelve la siguiente respuesta. Si desea invocar esta función mediante API Gateway, [cree y configure una API REST](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html).

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