Как вызвать API сканирования DynamoDB напрямую, используя API-шлюз в качестве прокси-сервера?
У меня проблема при вызове GET REST (Regional) API, который затем вызывает DynamoDB Scan API для получения всех элементов таблицы с именем City-Temperature.
В качестве параметра запроса я добавляю только "tablename", так как это требуется для вызова DynamoDB:Scan API. Но при тестировании API я получаю статус 400 от DynamoDB со следующей ошибкой:
{
"__type": "com.amazon.coral.validate#ValidationException",
"message": "1 validation error detected: Value null at 'tableName' failed to satisfy constraint: Member must not be null"
}
Для простоты таблица DynamoDB "Город-Температура" содержит пять элементов, каждый из которых "Город" (первичный ключ - Строка) содержит единственный атрибут (строку) "Температура".
Мои шаги по созданию прокси службы API:
- Создал новый REST API.
- Создан ресурс с названием "get-cities-temp"
- Создан дочерний ресурс с именем 'table-name' с путем {tablename}
- Создал метод GET для дочернего ресурса с помощью:
- Тип интеграции: AWS Service
- Регион: такой же, как регион DynamoDB
- Сервис: DynamoDB
- Действие: сканирование
- Метод HTTP: POST (поскольку все запросы к DynamoDB выполняются с использованием POST)
- Роль выполнения ARN: (Предполагаемая роль, созданная для API-Gateway и присоединенная политика, которая разрешает только одно действие "DynamoDB:Scan" с ресурсом ARN, указывающим на таблицу DyanmoDB "City-Temperature".
- На панели Integration-Method я оставил "Обработку содержимого" для "сквозной передачи" и добавил шаблон сопоставления с типом содержимого "application/json" для преобразования запроса с одним параметром "tablename" для обеспечения совместимости с DynamoDB следующим образом:
Чтобы добавить сюда: для параметра "Транспортировка тела запроса" установлено значение "Когда не определены шаблоны (рекомендуется)".
{
"tableName": "$input.params('tablename')"
}
Наконец, в разделе тестирования я добавляю tablename=City-Temperature в качестве строки запроса для передачи имени таблицы для Scan API и нажимаю "Test". Но в ответ выдается ошибка, о которой говорилось выше.
Обновить:
В журналах это выглядит так, как будто тело запроса после преобразования правильно преобразовано:
{ "tablename": "City-Temperature" }
. Но все же та же ошибка, что и выше
1 ответ
На основе https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/,tableName
не относится к типу объекта атрибута, а скорее является простым string
. РЕДАКТИРОВАТЬ: также свойство должно быть в паскале. Таким образом, следующее изменение должно сделать
{
"TableName":"$input.params('tablename')"
}