Бессерверные приложения 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 можно использовать для нескольких целей, например:

  • Обработка данных
  • Бэкенды
  • Интернет вещей
  • Боты

Узнайте больше о вариантах использования

Последние мысли

Серверов больше нет? Ну конечно нет. Это не будет заменой подачи (по крайней мере, не сейчас). Тем не менее, это отличный инструмент для разработки микросервисов и многого другого.

Похожие записи

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *