Найти в Дзене
Nuances of programming

Как создать простую функцию AWS Lambda с помощью TypeScript

Источник: Nuances of Programming Поговорим о том, как написать простую AWS Lambda с помощью TypeScript. Как известно, для написания функции Lambda обычно используется Node.js. Однако JavaScript вызывает определенные сложности из-за отсутствия проверки типов и отладки кода. Применение Typescript для решения этой задачи обладает рядом преимуществ. Меньше слов  —  больше дела! Подготовка Воспользуемся инструментом 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, поскольку в данном случае она не потребуется. После этого переходим в терминал и доба
Оглавление

Источник: Nuances of Programming

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

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

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

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

Подготовка

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

sam init

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

-2

Из предлагаемых вариантов в обоих случаях выбираем 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

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

-3

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

Заключение

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

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

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

Читайте нас в Telegram, VK

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