Бессерверные приложения Node на AWS Lambda
Что такое бессерверное?
Функции как услуги (FaaS). Они состоят из эфемерных контейнеров, которые автоматически масштабируются и имеют плату за выполнение.
Все еще в замешательстве?
Он запускает ваши функции в облаке без необходимости сервера ПЕРИОД.
Плюсы
- Низкая ценастоимость выполнения этих функций намного ниже, чем наличие собственного пользовательского хоста.
- Автоматическое масштабирование, вам не нужно беспокоиться о масштабировании сервера, поскольку на самом деле у вас нет сервера. AWS Lambda сделает это за вас автоматически, поскольку функция получает все больше и больше запросов.
- Нулевая ремонтопригодностьвам не нужно поддерживать сервер, на котором размещены ваши функции.
Минусы
- Холодно-горячая модафункции отключаются, а затем включаются после того, как запрос был сделан, это приведет к задержке ответа.
- Среда заблокированавы не можете установить дополнительные пакеты или программное обеспечение, поэтому, если ваша функция зависит от стороннего пакета, вы можете забыть об использовании AWS Lambda.
- Различные среды, изменения, внесенные вами в одном экземпляре, не будут гарантированно сохранены в следующем экземпляре. Все будут уничтожены (случайным образом).
Как бороться с минусами
Холодно-горячая мода
Вы можете использовать Разогревать
Среда заблокирована
Вы можете указать своей функции использовать API, на котором размещено программное обеспечение, от которого вы зависите.
Различные среды
Вы можете хранить файлы, которые вам нужны, с помощью AWS S3.
Настраивать
Посетите консоль AWS AIM, создайте нового пользователя, затем предоставьте ему доступ к программному доступу и, наконец, предоставьте ему AdministratorAccess
. После подтверждения сохраните Идентификатор ключа доступа и Секретный ключ доступа.
Наконец, установите интерфейс командной строки AWS и настройте ключ доступа. Идентификатор ключа доступа и Секретный ключ доступа.
brew install awscli
aws configure
Бессерверная платформа
Установите бессерверный фреймворк.
npm install -g serverless
Ручная настройка
Давайте настроим бессерверную структуру в нашем приложении вручную. И предоставить две конечные точки API, create user
а также get one user
.
serverless create --template aws-nodejs --path api
cd api
mkdir todos
// api/package.json
{
"name": "api-todos",
"version": "1.0.0",
"description": "Create and Get one Todo",
"author": "",
"license": "MIT",
"dependencies": {
"uuid": "^2.0.3"
}
}
Установите наши зависимости npm install
(AWS Lambda также установит зависимости).
# api/serverless.yml
service: api
provider:
name: aws
runtime: nodejs8.10
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
functions:
create:
handler: todos/create.create
events:
- http:
path: todos
method: post
cors: true
get:
handler: todos/get.get
events:
- http:
path: todos/{id}
method: get
cors: true
resources:
Resources:
TodosDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: id
AttributeType: S
KeySchema:
-
AttributeName: id
KeyType: Hash
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.DYNAMODB_TABLE}
Затем создайте каждый файл функции.
// api/todos/create.js
'use strict';
const AWS = require("aws-sdk");
const uuid = require ("uuid/v4");
const client = new AWS.DynamoDB.documentClient();
module.exports.create = async (event) => {
const data =JSON.parse(event.body);
const params = {
TableName: "todos"'
Item: {
id: uuid(),
text: data.text,
checked: false
}
};
await client.put(params).promise();
return{
statusCode: 200,
body: JSON.stringify(data)
};
};
// api/todos/get.js
'use strict';
const AWS = require("aws-sdk");
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports.get = async (event) => {
const params = {
TableName: "todos",
Key: {
id: event.pathParameters.id
}
};
const result = await dynamoDb.get(params).promise();
if (result.Item) {
return {
statusCode:200,
body: JSON.stringify(result.Item)
};
} else {
return {
statusCode: 404,
body: JSON.stringify({ message: "Couldn't find the todo item." })
};
}
}
event
объект, содержащий данные запроса.context
— это объект, содержащий информацию об AWS.callback
это функция, которая будет вызываться с ответом об ошибке в качестве первого аргумента или допустимым ответом в качестве второго аргумента.
Развертывать
Развертывание — одна из самых крутых частей.
sls deploy
После развертывания вы можете протестировать функцию.
Создать для всех
curl -X POST --data '{ "text": "Learn Serverless" }'
Выход:
{"text":"Learn Serverless","id":"ee6490d0-aa11e6-9ede-afdfa051af86","createdAt":1479138570824,"checked":false,"updatedAt":1479138570824}%
Получить один Todo
# Replace the <id> part with a real id from your todos table curl /<id>
Выход:
{"text":"Learn Serverless","id":"ee6490d0-aa11e6-9ede-afdfa051af86","createdAt":1479138570824,"checked":false,"updatedAt":1479138570824}%
Подробнее о развертывании
Вы также можете развернуть ТОЛЬКО функцию (это довольно быстро).
serverless deploy function -f create
ДинамоДБ
При создании таблицы вы указываете, сколько выделенной пропускной способности вы хотите зарезервировать для операций чтения и записи. DynamoDB зарезервирует необходимые ресурсы для удовлетворения ваших потребностей в пропускной способности, обеспечивая при этом стабильную производительность с низкой задержкой. Вы можете изменить подготовленную пропускную способность и увеличить или уменьшить емкость по мере необходимости.
Параллельные выполнения
По умолчанию AWS Lambda ограничивает общее количество одновременных выполнений всех функций в заданном регионе до 100. Ограничение по умолчанию — это предел безопасности, который защищает вас от затрат из-за потенциальных неуправляемых или рекурсивных функций во время первоначальной разработки и тестирования. Чтобы увеличить этот предел выше значения по умолчанию, выполните действия, описанные в Чтобы запросить увеличение лимита для одновременных исполнений.
Обработка большого количества трафика
Если вы ожидаете большого трафика, рекомендуется переключиться на опция автоматического масштабирования для DynamoDB.
Варианты использования в реальном мире
AWS Lambda или любую другую Lambda можно использовать для нескольких целей, например:
- Обработка данных
- Бэкенды
- Интернет вещей
- Боты
Узнайте больше о вариантах использования
Последние мысли
Серверов больше нет? Ну конечно нет. Это не будет заменой подачи (по крайней мере, не сейчас). Тем не менее, это отличный инструмент для разработки микросервисов и многого другого.