Поговорим о том, как написать простую AWS Lambda с помощью TypeScript. Как известно, для написания функции Lambda обычно используется Node.js. Однако JavaScript вызывает определенные сложности из-за отсутствия проверки типов и отладки кода. 

Применение Typescript для решения этой задачи обладает рядом преимуществ.

  1. Подсказка вариантов для автозавершения кода при программировании IDE. 
  2. Проверка ошибок во время компиляции. 
  3. Знание о структуре входных и выходных данных. 

Меньше слов  —  больше дела! 

Подготовка

Воспользуемся инструментом SAM CLI, прежде чем создать простой проект Lambda.

sam init

В терминале отображается следующий результат: 

Из предлагаемых вариантов в обоих случаях выбираем 1 в качестве номера Choice

По окончании процесса получаем вот такой структурированный каталог: 

├── README.md
├── events
│ └── event.json
├── hello-world
│ ├── app.js
│ ├── package.json
│ └── tests
│ └── unit
│ └── test-handler.js
└── template.yaml

Сначала переименовываем папку hello-word в src и удаляем папку tests, поскольку в данном случае она не потребуется. После этого переходим в терминал и добавляем зависимости. 

Начинаем с зависимости AWS, выполняя команду: 

npm install aws-sdk

Теперь поработаем с зависимостями Typescript: 

npm install --save-dev typescript @types/aws-lambda @types/node
  1. typescript.
  2. @type/aws-lambda содержит типы AWS для автозавершения кода и проверки типов. 
  3. @type/node используется для встроенных типов. 

Установив все зависимости, выполняем команду: 

tsc --init

Данная команда создает файл tsconfig.json:

{
"compilerOptions": {
"module": "CommonJS",
"target": "ES2017",
"noImplicitAny": true,
"preserveConstEnums": true,
"outDir": "./built",
"sourceMap": true
}
}

Компилятору TypeScript нужен файл tsconfig.json, позволяющий понять, как преобразовать TypeScript в JavaScript.

Изменение кода 

Конфигурация готова, приступаем к изменению кода. Переименовываем app.js в app.ts и удаляем код внутри. 

Прописываем обработчик Lambda следующим образом: 

import { 
  APIGatewayProxyEvent, 
  APIGatewayProxyResult } 
from "aws-lambda/trigger/api-gateway-proxy";

export const lambdaHandler = async (
   event: APIGatewayProxyEvent
): Promise<APIGatewayProxyResult> => {  
  const queries = JSON.stringify(event.queryStringParameters);  

  return {
    statusCode: 200,
    body: `Queries: ${queries}`
  }
}

Этот простой обработчик считывает и выводит параметры строки запроса функции. 

Создаем интерфейс Person:

interface Person {
name: string
surname: string
age: number
}

Цель функции  —  передать объект Person на вход и отобразить содержащуюся в нем информацию на выходе. 

Пишем код:

import { 
  APIGatewayProxyEvent, 
  APIGatewayProxyResult } 
from "aws-lambda/trigger/api-gateway-proxy";

interface Person {
  name: string
  surname: string
  age: number
}

export const lambdaHandler = async (
   event: APIGatewayProxyEvent
): Promise<APIGatewayProxyResult> => {  
const person: Person = JSON.parse(event.body);  

return {
    statusCode: 200,
    body: JSON.stringify({'Person' : person})
  }
}

Развертывание и тестирование 

Протестируем функцию Lambda. Прежде всего, скомпилируем Lambda и проверим, все ли работает. 

Переходим в файл package.json и добавляем данный шаг в раздел скрипта: 

.
.
.
"scripts": {
"compile": "tsc"
},
.
.
.

Выполняем команду:

npm run compile

Если все работает должным образом, происходит компиляция функции Lambda. Теперь тестируем! Переходим в template.yml и подгоняем его под приложение. В данном случае он выглядит так: 

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample Lambda Function in Typescript
Globals:
Function:
Timeout: 3
Resources:
TypescriptFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/built
Handler: app.lambdaHandler
Runtime: nodejs14.x
Events:
Typescript:
Type: Api
Properties:
Path: /hello
Method: get
.
.
.

Далее выполняем команду: 

sam build

Если ошибок нет, вносим изменения в файл event.json, расположенный в папке events, и заменяем поле body следующим образом: 

"body": "{\"name\": \"Bob\", \"surname\":\"Brown\",\"age\":21}",
.
.
.

Запускаем функцию Lambda на локальном компьютере: 

sam local invoke -e events/event.json

Если все работает отлично, то получаем в терминале такой результат: 

Lambda готова к развертыванию на AWS.

Заключение 

С кодом можно ознакомиться по ссылке.

Процесс применения TypeScript для функций Lambda интересен и прост. Он позволяет избежать ошибок, таких как написание имен методов, и избавляет от необходимости копаться в тоннах документации API. Компилятор помогает писать правильные типы и снижать потенциальные проблемы перед развертыванием.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Valerio Uberti: Create a Simple AWS Lambda Using TypeScript

Предыдущая статьяСпецификатор constexpr в C++: зачем он нужен и как работает
Следующая статьяЛучшие практики REST API — примеры проектирования конечных точек