Рубрики
Uncategorized

Начало работы с серверусными AWS (3/3) — микросервисы с помощью Lambda, DynamOdb и Gateway API

Разверните статический сайт S3, распределите ваше ведро S3 с Cloudfront и добавьте домен Micro Servi … Tagged webdev, AWS, DEVOPS, Учебник.

  1. Разверните статический сайт S3
  2. Распространите свое ведро S3 с Cloudfront и добавьте домен
  3. Микросервисы с помощью Lambda, Dynamodb и Gateway API

В этой части мы создаем динамодб. Затем мы создаем Lambda для создания, чтения, обновления и удаления записей в этой базе данных. И последний мы создаем шлюз API, чтобы вызвать эти лямбдас.

Динамодб

Сначала откройте сервис Dynamodb. Dynamodb — это база данных NoSQL. Базы данных NoSQL предназначены для конкретных моделей данных и имеют гибкие схемы.

Затем нажмите Создать таблицу и укажите имя и основной ключ вашей таблицы. Я буду звонить мою Сообщения с первичным ключом ID Отказ Этот первичный ключ должен быть уникальным для всех ваших предметов в таблице.

Вы также можете указать клавишу сортировки, чтобы обеспечить больше гибкости запроса. Я пропущу это для простоты.

Теперь вы должны увидеть обзор вашего свежего созданного стола. Вы можете перейти к предметам, чтобы иметь возможность увидеть все элементы в вашем столе. Вы также можете вручную добавить их здесь.

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

Добавление роли лямбда IAM

Для функции лямбда, чтобы иметь возможность получить доступ к dynamodb Это нужны разрешения для этого. Таким образом, нам нужно отправиться в службу IAM и создать новую роль.

Перейдите в роль в левом меню и нажмите Создать роль Отказ

Теперь вы должны выбрать услугу, которая будет использовать роль. Нажмите на Лямбда а потом Далее: Разрешения Отказ

На этом этапе нам нужно указать разрешения нашу лямбда. Мы хотим, чтобы наша лямбда сможет получить доступ к dynamodb. Так тип Динамо и выберите Amazondynamodbfullaccess. .

Пропустить шаг тегов на настройку. На последнем этапе выберите имя для новой роли. Я назову это lambda_dynamo. . Затем нажмите Создать роль Отказ

Создание функции лямбда

Теперь мы готовы создать функцию лямбда. Перейдите в службу лямбда и нажмите Создать функцию Отказ

Я создаю лямбда для создания записей dynamodb сначала. Я назову функцию CreatePost Отказ Затем внизу щелчок Выберите или создайте роль выполнения И выберите роль IAM, которую мы только что создали. После этого нажмите Создать функцию Отказ

В представлении функции прокрутите вниз, чтобы добраться до редактора. Код для добавления элемента на Dynamodb выглядит так:

const AWS = require("aws-sdk");
const crypto = require("crypto");

// Initialising DynamoDB SDK
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async body => {
  const params = {
    TableName: "posts", // name of your DynamoDB table
    Item: { // Creating an Item with a unique id, the created date and the passed title
      id: crypto.randomBytes(16).toString("hex"),
      created_at: new Date().toISOString(),
      title: body.title,
    }
  };
  try {
    // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html#GettingStarted.NodeJs.03.01
    const data = await documentClient.put(params).promise();
    return {
      statusCode: 201
    };
  } catch (e) {
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
};

После этого нажмите Тест , чтобы проверить, работает ли ваша функция.

Потому что мы еще не указали никаких тестов, модал откроется.

На этом тестовом модале нам нужно указать имя теста и тело, которое передается функции. В моем случае это ожидается только Название Отказ Таким образом, ящу следующую JSON.

{
  "title": "my awesome post"
}

Теперь вы можете нажать Тест Опять же, чтобы выполнить тестовый вызов.

Если все работало правильно, вы должны увидеть сообщение успеха с кодом состояния 201 Отказ Вы также можете вернуться к своей динамике, чтобы убедиться, что элемент был успешно создан.

Разверните лямбду с местной машины

Развертывание с вашей машины имеет смысл, если вы хотите расширить эту функцию в будущем. Этот раздел является необязательным, и вы можете пропустить его, если вы не заинтересованы в развертывании с вашей машины.

Так что откройте пустую рабочую область в своем предпочтительном редакторе кода. Затем создайте новый файл под названием index.js Отказ В этом файле добавьте следующий контент.

const AWS = require("aws-sdk");
const { v4: uuidv4 } = require('uuid');

// Initialising the DynamoDB SDK
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async body => {
  const params = {
    TableName: "posts", // name of your DynamoDB table
    Item: { // create item with a unique id, the created date and the passed title
      id: uuidv4(),
      created_at: new Date().toISOString(),
      title: body.title,
    }
  };
  try {
    // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html
    const data = await documentClient.put(params).promise();
    return  {
      statusCode: 201
    };
  } catch (e) {
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
};

Это почти та же функция, которую мы использовали раньше для нашей лямбда. Единственное отличие в том, что я использовал пакет UUID Для генерации уникального i d.

Это потому, что я также хочу пройти процесс добавления узлов модулей на нашу лямбду. Так что откройте терминал и перейдите к вашей рабочей области. Затем введите:

npm i --save uuid

Чтобы иметь возможность развернуть нашу функцию для AWS, нам нужно сначала застеживать на молнии.

zip -r function.zip .

Это создаст новый файл .zip в нашем корневом корне со всем содержимым рабочего пространства.

Теперь наша функция готова к развернутую. Для этого вам нужно иметь AWS-Shell настраивать. Если вы еще этого не сделали, вы можете вернуться к Часть 1 Из этой серии и поиск AWS-Shell Отказ

Для развертывания aws введите следующую команду:

aws lambda update-function-code --function-name yourFunctionName --zip-file fileb://function.zip

Вы должны заменить YourFunctedName с именем вашей ламбда.

Если вы не уточняли регион на AWS Configure Вам нужно добавить регион в вашу команду с - Регион вашего мероприятия . Вы можете найти свой регион в правом праве консоли управления AWS.

Теперь вы можете вернуться к консоли управления AWS и проверьте, был ли код обновлен. Кроме того, не стесняйтесь запустить тест снова, чтобы увидеть, все еще работает.

Создайте API для вашей лямбда

Чтобы иметь возможность называть свою лямбда, перейдите на сервис API Gateway Отказ Затем прокрутите вниз и нажмите Построить карты Отдых API Отказ

Затем выберите Новый API и введите имя для вашего. Чтобы сохранить это просто, используйте тип Региональный Отказ Затем ударил Создать API Отказ

Затем нажмите на Действия и Создать метод Отказ Теперь выберите свою функцию лямбда, которая в моем случае Postlambda и нажмите Сохранить Отказ

Вы должны увидеть модал, который просит вас дать разрешения для ваших API Gateway. Нажмите Хорошо Чтобы ваш API Gateway получить доступ к вашей функции лямбда.

Чтобы иметь возможность позвонить нашему API, нам нужно сначала развернуть его. Так что иди в Действия и нажмите Развертывать API. . Затем создайте новый этап. Я назову мой Производство , но это может быть что угодно.

В верхней части страницы вы увидите Вызывать URL Отказ Если вы нажмете на него, вы получите Отсутствует токен аутентификации ошибка. Не путайтесь этим. Это потому, что мы еще не указали получаемое конечную точку. Вы должны быть в состоянии вызвать конечную точку сообщения этого URL. По почтенам, это будет выглядеть так.

Или вы также можете вызвать эту конечную точку с вашего терминала с завитым

curl --location --request POST 'https://your-invoke-url'  --header 'Content-Type: text/plain'  --data-raw '{ "title": "post from API" }'

В следующем этапе создайте LAMBDAS для чтения, обновления и удаления записей в DynamOdb.

Также можно сделать все в одной функции лямбда. ( Смотрите здесь ). Это имеет свой преимущества и недостатки.

Но я пойду на подход с отдельными лямбдами для отдельных конечных точек.

Читать, обновлять и удалять лямбдас

Вернитесь к Lambda Service и создайте другие четыре лямбда с одинаковыми шагами, как описано ранее в этом посте. Не забудьте использовать лямбда-динамо роль.

Используйте следующий код для лямбдаса

const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async () => {
  const params = {
    TableName: "posts" // name of your DynamoDB table
  };
  try {
    // use the scan method to get all items in the table
    const data = await documentClient.scan(params).promise();
    const response = {
      statusCode: 200,
      body: JSON.stringify(data.Items)
    };
    return response;
  } catch (e) {
    return {
      statusCode: 500
    };
  }
};
const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async event => {
  const {
    pathParameters: { id }
  } = event; // Extracting the id from the request path
  const params = {
    TableName: "posts", // name of your DynamoDB table
    Key: { id } // key of the item you want to find.
  };
  try {
    // use the get method to fetch an indvidual item
    const data = await documentClient.get(params).promise();
    const response = {
      statusCode: 200,
      body: JSON.stringify(data.Item)
    };
    return response;
  } catch (e) {
    return {
      statusCode: 500
    };
  }
};
const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async event => {
  const {
    pathParameters: { id }
  } = event; // get id from path
  const { title } = JSON.parse(event.body);
  const params = {
    TableName: "posts",
    Item: {
      id: id,
      title: title
    }
  };
  try {
    // use put method to find and update
    const data = await documentClient.put(params).promise();
    const response = {
      statusCode: 200
    };
    return response;
  } catch (e) {
    return {
      statusCode: 500
    };
  }
};
const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async event => {
  const {
    pathParameters: { id }
  } = event; // get id from path
  const params = {
    TableName: "posts",
    Key: { id }
  };
  try {
    // use delete method the remove item
    const data = await documentClient.delete(params).promise();
    const response = {
      statusCode: 200
    };
    return response;
  } catch (e) {
    return {
      statusCode: 500
    };
  }
};

Обновление шлюза API

После того, как вы создали все эти лямбдаса, перейдите к сервису Gateway API. Откройте свой до созданного API.

Создайте конечную точку для получения всех постов в таблице.

Для получения, обновления или удаления одного элемента мы получаем идентификатор элемента из URI. Чтобы обеспечить этот идентификатор, создать новый ресурс.

После этого добавьте получение, поставку и метод удаления на этот подпунктивный путь. Для тех, вам нужно включить Используйте Lambda Proxy Integration Чтобы иметь возможность получить доступ к идентификатору от URL.

Когда вы закончите создание конечных точек, ваша API должна выглядеть так:

В последний шаг снова разверните ваш API, нажав Действия а потом Развертывать API Отказ Выберите одну и ту же сцену, чтобы перезаписать его с новым состоянием.

Поздравляю. Ваш отдых API теперь работает и работает. Вот звонки для вашей оболочки, чтобы позвонить с этими конечными точками:

Получить все

curl --location --request GET 'https://your-invoke-url'

Получить по ID

curl --location --request GET 'https://your-invoke-url/some-id'

Обновление по ID.

curl --location --request PUT 'https://your-invoke-url/some-id'  --header 'Content-Type: text/plain'  --data-raw '{ "title": "updated title from API" }'

Удалить по ID.

curl --location --request DELETE 'https://your-invoke-url/some-id

Спасибо за чтение этого учебника:) Если у вас возникли проблемы, следующие в какой-то момент, пожалуйста, дайте мне знать.

Оригинал: «https://dev.to/vincenius/getting-started-with-serverless-aws-3-3-micro-services-using-lambda-dynamodb-api-gateway-32ae»