Статьи

Интеграция AWS Lambda / Java, DynamoDB и Api-шлюза

Вступление

В этой статье я рассмотрю полный (Java) пример интеграции AWS Lambda, DynamoDb и Api Gateway для создания функции и предоставления этой функции в качестве ресурса HTTP для использования другими сторонами.

Прежде чем мы углубимся в детали, я дам краткий обзор сервисов AWS, использованных в этом примере (как взято из документации AWS):

  • AWS Lambda. AWS Lambda — это вычислительный сервис, который запускает код разработчиков в ответ на события и автоматически управляет вычислительными ресурсами для них, упрощая создание приложений, которые быстро реагируют на новую информацию.
  • DynamoDB: быстрая и гибкая управляемая база данных NoSql.
  • Api Gateway: Amazon API Gateway — это полностью управляемый сервис, который позволяет разработчикам легко создавать, публиковать, поддерживать, отслеживать и защищать API-интерфейсы в любом масштабе.

В этом примере мы собираемся создать лямбда-функцию, которая отслеживает местоположение (широту и долготу) конкретного мобильного устройства. Поток данных выглядит так:

мобильное устройство -> HTTP POST -> Api Gateway -> recordLocation (функция Lambda) -> DynamoDb (местоположение магазина)

Создание приложения

Предпосылки:

  • IntelliJ Idea используется для этого примера, но подойдет любая IDE. Gradle используется для системы сборки.
  • Учетная запись AWS для фактического развертывания и запуска примера.
  • После того, как вы закончили с примером, удалите все созданные вами ресурсы AWS, чтобы избежать ненужного выставления счетов.

Для реализации функции Lambda мы используем AWS Java SDK.

1. В IntelliJ выберите Файл -> Новый проект и выберите Gradle с библиотекой Java. Нажмите «Далее

2. groupId = com.example, artifactId = locationpersister. Нажмите «Далее.

3. Выберите Java 8 IDE и нажмите «Далее», нажмите «Готово».

4. Создайте папку src / main / java, если она еще не существует.

5. Откройте файл de build.gradle и добавьте следующие зависимости:

1
2
compile 'com.amazonaws:aws-lambda-java-core:1.1.0'
compile 'com.amazonaws:aws-lambda-java-events:1.1.0'

6. Добавьте следующий код в файл build.gradle:

1
2
3
4
5
6
7
8
task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtime
    }
}
build.dependsOn buildZip

Приведенный выше код создает zip-архив при запуске задачи сборки. Этот zip-файл можно загрузить непосредственно в AWS Lambda.

7. Создайте класс com.example.persister.DeviceLocation с членами: lat (double), lng (double) и deviceId (string). Этот класс содержит данные, которые передаются в функцию Lambda.

8. Создайте новый класс com.example.persister.LocationPersisterFunction. Этот класс будет содержать реализацию функции Lambda.

9. Сделайте так, чтобы функция LocationPersister реализовала com.amazonaws.services.lambda.runtime.RequestHandler

интерфейс.

Этот интерфейс определяет функцию handleRequest, которая выполняется при запуске функции Lambda. Функция handleRequest принимает два параметра: вход (который имеет тип DeviceLocation и передается, когда функция вызывается объектом Context).

Создание таблицы DynamoDb

Для хранения данных в DynamoDB нам нужно создать таблицу.

1. Откройте консоль AWS и перейдите в раздел DynamoDB.

2. Нажмите «Создать таблицу» и в качестве имени используйте «DeviceLocation». Введите id (строковое поле) для использования в качестве ключа раздела и не указывайте ключ сортировки. Оставьте все по умолчанию и нажмите «Создать».

3. Обратите внимание, что таблица создается в выбранном регио. Если вы нажмете на таблицу и посмотрите на детали, вы увидите область таблицы.

Создайте класс DeviceLocation

Класс DeviceLocation содержит входные данные, которые передаются в функцию Lambda.

1. Создайте новый класс с именем DeviceLocation со следующими полями: id (строка), lat (double) и lng (double)

2. Убедитесь, что класс содержит как сеттеры, так и геттеры. Сеттеры используются AWS Lambda для заполнения этого объекта на основе переданного в JSON при вызове функции Lambda.

Реализация лямбда-функции

1. Откройте функцию LocationPersister

2. Добавьте следующий код в тело метода handleRequest:

01
02
03
04
05
06
07
08
09
10
11
final AmazonDynamoDBClient client = new AmazonDynamoDBClient(new EnvironmentVariableCredentialsProvider());
        client.withRegion(Regions.EU_WEST_1); // specify the region you created the table in.
        DynamoDB dynamoDB = new DynamoDB(client);
        Table table = dynamoDB.getTable("DeviceLocation");
        final Item item = new Item()
                .withPrimaryKey("id", UUID.randomUUID().toString()) // Every item gets a unique id
                .withString("deviceId", input.getDeviceId())
                .withDouble("lat", input.getLat())
                .withDouble("lng", input.getLng());
        table.putItem(item);
        return null;

3. Убедитесь, что вы изменили регион в соответствии с регионом, в котором вы создали таблицу.

4. Приведенный выше код получает ссылку на таблицу DeviceLocation DynamoDB, создает элемент и сохраняет его.

5. Выполните задачу сборки Gradle, чтобы создать zip-архив или наш код.

5. Теперь, когда реализация завершена, мы готовы создать нашу функцию AWS Lambda.

Создание лямбда-функции
1. Откройте консоль AWS и перейдите к разделу Lambda.

2. Выберите функцию «Пробел» и нажмите «Далее» (на этом этапе мы не создаем триггер).

3. В качестве имени выберите: persistDeviceLocation и выберите Java 8 в качестве среды выполнения.

4. Загрузите файл /build/distributions/locationpersister-1.0-SNAPSHOT.zip.

5. В поле «Обработчик» укажите полное имя класса, которое реализует наш обработчик: com.example.persister.LocationPersisterFunction

6. В поле Роль выберите, чтобы создать пользовательскую роль. Форма создания роли открыта. Используйте lambda_location_persister в качестве имени роли и нажмите «Разрешить». Роль создается и выбирается в поле «Существующая роль». Смотрите скриншот «lambda_role»

7. Оставьте все по умолчанию и нажмите Далее

8. Нажмите Создать функцию

Экран-выстрел-2016-12-02-на-16-30-52

Тестирование функции в консоли de AWS

После создания функции мы собираемся протестировать ее с помощью консоли AWS.

1. Нажмите Тест

2. Откроется диалоговое окно, в котором можно указать данные, отправляемые в функцию Lambda. Используйте следующие тестовые данные:

1
2
3
4
5
{
  "deviceId": "deviceId",
  "lat": 52.5,
  "lng": 5.5
}

3. Вы можете изменить тестовые данные в любое время, щелкнув Действия -> настроить тестовое событие.

4. Когда закончите, нажмите Test

5. Если все прошло по плану, вы должны получить сообщение об ошибке, в котором говорится следующее: Код состояния: 400; Код ошибки: AccessDeniedException

6. Это верно до этого момента. Хотя мы создали пользовательскую роль, мы не дали этой роли разрешения на доступ к нашей таблице DynamoDB.

Добавить разрешения DynamoDB в нашу роль

1. Откройте консоль AWS и перейдите в раздел IAM.

2. Нажмите на Роли

3. Нажмите на lambda_location_persister, чтобы открыть его.

4. Нажмите Присоединить политику

5. В поле фильтра найдите DynamoDB

6. Выберите политику AmazonDynamoDBFullAccess и нажмите «Вложить».

7. Вернитесь к AWS Lambda и снова протестируйте функцию. Функция должна быть успешной.

8. Перейдите к DynamoDB, выберите таблицу DeviceLocation и нажмите на элементы. Вы должны увидеть один элемент, добавленный в таблицу.

9 Если вы получите код состояния: 400; Код ошибки: ошибка ResourceNotFoundException. Убедитесь, что область, указанная в реализации Lambda, соответствует области таблицы DynamoDB.

Создание API-шлюза

Шлюз API используется для создания конечной точки HTTP, которая является триггером для функции Lambda. Приложения могут связываться с этой конечной точкой по HTTP.

1. Откройте консоль de AWS и перейдите к API Gateway.

2. Создайте новый API. В качестве названия используйте: LocationPersisterApi

3. Нажмите Создать API

4. Выберите Действия -> и нажмите Создать ресурс, см. Screenshot_create_resource

5. В качестве имени ресурса используйте: расположение устройства и нажмите Создать ресурс

6. Выберите Actions ->, нажмите Create Method и выберите POST.

7. В подробностях метода выберите Тип интеграции: Лямбда-функция, Лямбда-регион (регион, в котором вы создали Лямбда-функцию, и Лямбда-функция: persistDeviceLocation (имя лямбда-функции))

8. Нажмите Сохранить и затем ОК

9. Нажмите Тест и вставьте тестовое сообщение в тело. Это может быть то же сообщение, что и в разделе «Тест» функции Lambda. После того, как тело заполнено, нажмите Test. Если все в порядке, вы должны увидеть код состояния HTTP 200.

10. Выберите Действия -> Развернуть API и выберите [Новый этап]. Укажите prod в качестве сценического имени.

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

12. Перейдите к этапу prod, разверните ресурсы и выберите метод POST. Скопируйте URL-адрес после текста «Invoke URL», например, в «Почтальон». Выполните HTTP-пост с телом тестового сообщения. Вы должны увидеть код состояния HTTP 200 (успех).

13. Если вы сейчас откроете таблицы DynamoDB и перечислите элементы, вы должны увидеть несколько элементов, добавленных в таблицу.

ресурс

Вывод

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

Ресурсы

— Полный исходный код примера проекта можно найти на Github .
AWS Lambda
AWS DynamoDB
AWS Api Gateway