Как вызвать 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:

  1. Создал новый REST API.
  2. Создан ресурс с названием "get-cities-temp"
  3. Создан дочерний ресурс с именем 'table-name' с путем {tablename}
  4. Создал метод GET для дочернего ресурса с помощью:
    • Тип интеграции: AWS Service
    • Регион: такой же, как регион DynamoDB
    • Сервис: DynamoDB
    • Действие: сканирование
    • Метод HTTP: POST (поскольку все запросы к DynamoDB выполняются с использованием POST)
    • Роль выполнения ARN: (Предполагаемая роль, созданная для API-Gateway и присоединенная политика, которая разрешает только одно действие "DynamoDB:Scan" с ресурсом ARN, указывающим на таблицу DyanmoDB "City-Temperature".
  5. На панели 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')"
}
Другие вопросы по тегам