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

resources screenshot

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

enter image description here

И шаблон сопоставления выглядит следующим образом: введите здесь описание изображения

Но когда я тестирую 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
alejandro correa 1 Май 2020 в 01:56

1 ответ

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

Моя таблица имеет имя первичного ключа "pk". Учебники: видео и Блог

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

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

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

Я получаю желаемый ответ от DynamoDB.

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

Это гарантирует, что ваши выходные данные DynamoDB будут отправлены без изменений в ваш браузер/выходные данные.

  1. Я преобразовал свой вывод динамо, используя следующий шаблон сопоставления в ответе на интеграцию.
#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"
    }
  ]
}

P.S. у меня была таблица динамо с именем «apiG» с основным ключом «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"

Ура!

3
vijtrip2 1 Май 2020 в 09:48