Как вызвать DynamoDB Scan API напрямую, используя API-шлюз в качестве прокси-сервера сервиса? - PullRequest
0 голосов
/ 19 апреля 2020

У меня возникла проблема при вызове API GET REST (Regional), который затем вызывает API-интерфейс сканирования DynamoDB для получения всех элементов таблицы с именем City-Temperature.

В качестве параметра запроса я m добавление только '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 "City-Temperature" содержит пять элементов с каждым элементом 'City' ( первичный ключ - String), содержащий один атрибут (строку) «Temperature».

Мои шаги для создания прокси службы API:

  1. Создан новый API REST.
  2. Создан ресурс с именем "get-towns-temp"
  3. Создан дочерний ресурс с именем 'table-name' с путем {tablename}
  4. Создан метод GET для дочернего ресурса с:
    • Тип интеграции: AWS Служба
    • Регион: такой же, как регион DynamoDB
    • Служба: DynamoDB
    • Действие: Сканирование
    • Метод HTTP : POST (поскольку все запросы к DynamoDB выполняются с использованием POST)
    • Роль выполнения ARN: (Предполагается, что роль создана для API-шлюза и прикреплена политика, которая допускает только одно действие «DynamoDB: Сканирование» с указанием ресурса ARN). в таблицу DyanmoDB "Город-температура". * 10 29 *
  5. На панели Integration-Method я оставил «Обработка контента» в «passthrough» и добавил шаблон отображения с типом контента «application / json» для преобразования запроса с одним параметр 'tablename' должен быть совместим с DynamoDB следующим образом:

Для добавления здесь: 'Request Body Passthrough' установлен на 'Когда шаблоны не определены (рекомендуется)'

{
    "tableName": "$input.params('tablename')"
}

Наконец, в разделе теста я добавляю tablename = City-Temperature в качестве строки запроса, чтобы передать имя таблицы для Scan API, и нажимаю «Test». Но в ответ выдается ошибка, как упомянуто выше.

Обновление:

В журналах после преобразования правильно выглядит тело запроса: { "tablename": "City-Temperature" }. Но все же ошибка та же, что и выше

1 Ответ

2 голосов
/ 19 апреля 2020

На основании https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/, tableName не относится к типу объекта атрибута, а является простым string. РЕДАКТИРОВАТЬ: также свойство должно быть pascal в кейсе. Таким образом, следующее изменение должно сделать

{
    "TableName":"$input.params('tablename')"
}
...