Развертывание безсерверного Typescript с Esbuild на AWS Lambda

Вопрос или проблема

Я пытаюсь развернуть свою безсерверную функцию. Мое развертывание прошло без каких-либо проблем. Однако я сталкиваюсь с проблемами, когда консоль AWS Lambda ищет расширение .mjs, а встроенный код имеет расширение .js. Тогда мне приходится вручную обновлять расширение, чтобы мое развертывание работало, что противоречит цели. Я пробовал как outExtension, так и outFile конфигурацию, но без успеха.

Вот моя конфигурация serverless.yml:

...
build:
  esbuild:
    bundle: true
    minify: false
    external:
      - "uuid"
    exclude: "*"
    format: esm
    outExtension:
      ".js": ".mjs"

plugins:
  - serverless-offline
...

Вот базовый код, который я хочу развернуть:

import { v4 as uuidv4 } from "uuid";

export const hello: any = async (event: any) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      id: uuidv4(),
      message: "Go Serverless v4! Your function executed successfully!",
    }),
  };
};

Скомпилированный результат выглядит следующим образом:

|--handler.js // <=== AWS Lambda ожидает handler.mjs
|--handler.js.map

Ответ или решение

Развертывание Serverless-приложения на TypeScript с использованием Esbuild в AWS Lambda

Введение

Развертывание безсерверных функций на AWS Lambda позволяет вашим приложениям масштабироваться и реагировать на события в реальном времени. При использовании TypeScript и сборщика Esbuild, вы можете значительно упростить процесс, что делает вашу разработку более эффективной. Однако, встретив проблему, где AWS Lambda ожидает файлы с расширением .mjs, в то время как ваш код выглядит как .js, можно столкнуться с дополнительными трудностями. В следующем руководстве мы рассмотрим, как правильно настроить ваш проект для решения этой проблемы.

Проблема: Расширение файла

Вы столкнулись с тем, что AWS Lambda требует, чтобы ваши функции имели расширение .mjs, однако после сборки ваш код сохраняется в формате .js. Эта несоответствие может привести к ошибкам выполнения и требует ручного вмешательства, что не является желаемым поведением.

Настройка serverless.yml

Давайте рассмотрим вашу конфигурацию serverless.yml. Основной фрагмент, который вызывает проблемы, — это блок build с параметром outExtension. Рассмотрим более подробный вариант настройки:

service: my-service

provider:
  name: aws
  runtime: nodejs14.x

build:
  esbuild:
    bundle: true
    minify: false
    external:
      - "uuid"
    format: esm
    outExtension:
      ".js": ".mjs" # Проблема в том, что это не работает должным образом

plugins:
  - serverless-offline

functions:
  hello:
    handler: handler.hello

Изменение конфигурации

Для того чтобы изменить поведение сборщика и получить ожидаемое расширение файлов, необходимо внести правки в конфигурацию esbuild. Проверьте, что ваша версия Esbuild актуальна и поддерживает необходимую функциональность.

Установка необходимых зависимостей

Если вы еще не установили esbuild и serverless-esbuild, выполните следующую команду:

npm install esbuild serverless-esbuild --save-dev

Использование Esbuild для компиляции

Убедитесь, что ваш скрипт для сборки настроен так, чтобы использовать расширение .mjs автоматически. Ваша проблема может быть связана с тем, что конфигурация outExtension не применяется или не распознается.

Код функции

Не забудьте, что основная функция должна быть корректно определена. Обратите внимание на тот код, который вы предоставили:

import { v4 as uuidv4 } from "uuid";

export const hello = async (event: any) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      id: uuidv4(),
      message: "Go Serverless v4! Your function executed successfully!",
    }),
  };
};

Obnavite fieli

После выполнения всех вышеуказанных шагов, пересоберите и протестируйте ваше приложение:

serverless deploy

Заключение

Следуя вышеприведенной инструкции и внимательно настраивая конфигурацию вашего проекта, вы сможете избежать ситуаций, когда AWS Lambda ожидает файлы с неправильным расширением. Убедитесь, что версии всех используемых вами библиотек актуальны, и не забудьте протестировать своё приложение после изменений.

Если после внесения изменений проблема все еще сохраняется, стоит внимательно проверить логи AWS Lambda, чтобы получить более детальную информацию о возникших ошибках. Удачи в разработке — ваше безсерверное приложение готово к развертыванию!

Оцените материал
Добавить комментарий

Капча загружается...