Api-шлюз получить элемент конфигурации DynamodB - PullRequest
0 голосов
/ 01 мая 2020

Привет, мне нужно получить элемент из DynamodB через шлюз API, и я настраиваю ресурсы следующим образом:

resources screenshot

Я настраиваю метод интеграции, как следующее изображение:

enter image description here

и шаблон отображения выглядит так: enter image description here

, но когда я test apigateway запустить эту ошибку

Execution failed due to configuration error:
No match for output mapping and no default output mapping configured.
Endpoint Response Status Code: 200
Gateway response type: API_CONFIGURATION_ERROR with status code: 500

1 Ответ

1 голос
/ 01 мая 2020

Я следовал этим двум урокам и выполнил свою задачу в таблице DynamoDB.

Моя таблица имеет имя первичного ключа "pk". Обучающие программы: Видео & Блог

  1. Если я напишу свое тело запроса динамо, как ваше, оно не получит никакой записи
{
    "TableName": "apiG",
    "Key": {
    "pk": {
    "S": "key1"
    }
    }
}

Но если я сформирую свой запрос как

{
    "TableName": "apiG",
    "PrimaryKey": "pk",
    "KeyConditionExpression": "pk = :v1",
    "ExpressionAttributeValues": {
        ":v1": {
            "S": "key1"
        }
    }
}

, я получу желаемый ответ от DynamoDB.

Ваша ошибка выглядит так, как будто вы перепутали ответ интеграции и ответ метода. В простейшей форме оставьте свой ответ метода по умолчанию, например «HTTP Status: 200 Models: application / json => Empty», и оставьте свой интеграционный ответ, поскольку консоль API Gateway создаст его для вас.

Это обеспечит отправку вывода DynamoDB без изменений в ваш браузер / вывод.

Я преобразовал свой вывод динамо с помощью следующего шаблона отображения в ответе интеграции.
#set($inputRoot = $input.path('$'))
{
    "content": [
        #foreach($elem in $inputRoot.Items) {
            "key": "$elem.pk.S",
            "value": "$elem.pv.S"
        }#if($foreach.hasNext),#end
    #end
    ]
}

, и он выдал следующий вывод.

{
  "content": [
    {
      "key": "key1",
      "value": "val1"
    }
  ]
}

PS У меня была таблица динамо с именем 'apiG' с primaryKey 'pk' и после экспортированного чванства из моего эксперимента. Надеюсь, это поможет.

openapi: "3.0.1"
info:
  title: "dynamoProxy"
  version: "2020-05-01T06:45:38Z"
servers:
- url: "https://aaaaaaaaaa.execute-api.us-east-2.amazonaws.com/{basePath}"
  variables:
    basePath:
      default: "/test"
paths:
  /db:
    get:
      responses:
        200:
          description: "200 response"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Empty"
      x-amazon-apigateway-integration:
        credentials: "arn:aws:iam::111111111111:role/apiGddbRole"
        uri: "arn:aws:apigateway:us-east-2:dynamodb:action/Query"
        responses:
          default:
            statusCode: "200"
            responseTemplates:
              application/json: "#set($inputRoot = $input.path('$'))\n{\n    \"content\"\
                : [\n        #foreach($elem in $inputRoot.Items) {\n            \"\
                key\": \"$elem.pk.S\",\n            \"value\": \"$elem.pv.S\"\n  \
                \      }#if($foreach.hasNext),#end\n\t#end\n    ]\n}"
        passthroughBehavior: "when_no_templates"
        httpMethod: "POST"
        requestTemplates:
          application/json: "{\n    \"TableName\": \"apiG\",\n    \"PrimaryKey\":\
            \ \"pk\",\n    \"KeyConditionExpression\": \"pk = :v1\",\n    \"ExpressionAttributeValues\"\
            : {\n        \":v1\": {\n            \"S\": \"key1\"\n        }\n    }\n\
            }"
        type: "aws"
components:
  schemas:
    Empty:
      title: "Empty Schema"
      type: "object"

Ура!

...