Вступление
В этой статье я рассмотрю полный (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. Нажмите Создать функцию
После создания функции мы собираемся протестировать ее с помощью консоли 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
Ссылка: | Интеграция шлюзов AWS Lambda / Java, DynamoDB и Api от нашего партнера по JCG |