Implementar código de TypeScript transpilado en Lambda con archivos .zip - AWS Lambda

Implementar código de TypeScript transpilado en Lambda con archivos .zip

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:

AWS SAM y AWS CDK simplifican la creación e implementación de funciones de TypeScript. La especificación de plantillas de AWS SAM 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 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

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:

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 nodejs18.x
  2. (Opcional) La aplicación de ejemplo incluye configuraciones para herramientas de uso habitual, tales como ESLint para linting de código y Jest para pruebas unitarias. Para ejecutar comandos de lint y pruebas:

    cd sam-app/hello-world npm install npm run lint npm run test
  3. Compile la aplicación.

    cd sam-app sam build
  4. Implemente la aplicación.

    sam deploy --guided
  5. Siga las indicaciones que aparecen en pantalla. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, responda con Enter.

  6. 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"}
  7. 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

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:

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
  2. Inicialice la aplicación.

    cdk init app --language typescript
  3. Agregue el paquete @types/aws-lambda en forma de dependencia de desarrollo. Este paquete contiene las definiciones de tipos de Lambda.

    npm install -D @types/aws-lambda
  4. 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.

  5. 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. 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 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', }), }; };
  6. Abra hello-world.ts y agregue el siguiente código al archivo. Este código contiene la construcción NodejsFunction, que crea la función de Lambda, y la construcción LambdaRestApi, 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 en la Referencia de la API de AWS CDK.

  7. Abra hello-world-stack.ts. Este es el código que define la pila de AWS CDK. 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'); } }
  8. el directorio hello-world que contiene su archivo cdk.json, implemente su aplicación.

    cdk deploy
  9. 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

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:

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

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

    npm init
  3. Agregue los paquetes @types/aws-lambda y esbuild 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
  4. 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. 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 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', }), }; };
  5. 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 (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 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*" },
  6. Cree el paquete.

    npm run build
  7. 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.

    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. Ejecute un evento de prueba 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.

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