Cloudwatch регистрирует сбой действия PutLogEvents с помощью com.amazon.coral.service#UnknownOperationException при вызове из API Gateway

#amazon-web-services #aws-sdk #aws-api-gateway #amazon-cloudwatch

#amazon-веб-сервисы #aws-sdk #aws-api-gateway #amazon-cloudwatch

Вопрос:

Я использую тип интеграции службы AWS API Gateway для добавления журналов в службу журналов Cloudwatch с помощью действия PutLogEvents, как описано здесь: https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html

Я успешно настроил аналогичный метод для добавления элементов в таблицу DynamoDB с помощью действия PutItem, и это сработало просто отлично, поэтому я не уверен, чего мне не хватает в этом.

Я дважды проверил, нет ли опечаток и проблем с моим шаблоном. Успешно использовали PutLogEvents с помощью инструментов CLI, так что с настройкой, похоже, все в порядке.

Вот несколько скриншотов моей настройки из AWS dash:

введите описание изображения здесь

Вот шаблон сопоставления, который я использую:

 {
  "logGroupName": "FromAPI",
  "logStreamName": "$input.path('$.streamName')",
  "logEvents": [
    {
      "timestamp": $input.path('$.ts'), 
      "message": "$input.path('$.message')"
    }
  ]
}
 

Ответ, который я получаю обратно, имеет код состояния 200, но следующее тело ответа:

 {
  "Output": {
    "__type": "com.amazon.coral.service#UnknownOperationException",
    "message": null
  },
  "Version": "1.0"
}
 

Вот отредактированный (xxx) журнал выполнения:

 Execution log for request xxx
Fri Apr 19 02:28:58 UTC 2019 : Starting execution for request: xxx
Fri Apr 19 02:28:58 UTC 2019 : HTTP Method: POST, Resource Path: /log
Fri Apr 19 02:28:58 UTC 2019 : Method request path: {}
Fri Apr 19 02:28:58 UTC 2019 : Method request query string: {}
Fri Apr 19 02:28:58 UTC 2019 : Method request headers: {}
Fri Apr 19 02:28:58 UTC 2019 : Method request body before transformations: {
    "streamName": "12345",
    "ts": 1555641510000,
    "message": "help!"
}
Fri Apr 19 02:28:58 UTC 2019 : Endpoint request URI: https://logs.xxx.amazonaws.com/?Action=PutLogEvents
Fri Apr 19 02:28:58 UTC 2019 : Endpoint request headers: {Authorization=xxx, X-Amz-Date=20190419T022858Z, x-amzn-apigateway-api-id=xxx, Accept=application/json, User-Agent=AmazonAPIGateway_xxx, X-Amz-Security-Token=xxx [TRUNCATED]
Fri Apr 19 02:28:58 UTC 2019 : Endpoint request body after transformations: {
  "logGroupName": "FromAPI",
  "logStreamName": "12345",
  "logEvents": [
    {
      "timestamp": 1555641510000, 
      "message": "help!"
    }
  ]
}
Fri Apr 19 02:28:58 UTC 2019 : Sending request to https://logs.xxx.amazonaws.com/?Action=PutLogEvents
Fri Apr 19 02:28:58 UTC 2019 : Received response. Status: 200, Integration latency: 38 ms
Fri Apr 19 02:28:58 UTC 2019 : Endpoint response headers: {x-amzn-RequestId=xxx, Content-Type=application/json, Content-Length=105, Date=Fri, 19 Apr 2019 02:28:58 GMT}
Fri Apr 19 02:28:58 UTC 2019 : Endpoint response body before transformations: {"Output":{"__type":"com.amazon.coral.service#UnknownOperationException","message":null},"Version":"1.0"}
Fri Apr 19 02:28:58 UTC 2019 : Method response body after transformations: {"Output":{"__type":"com.amazon.coral.service#UnknownOperationException","message":null},"Version":"1.0"}
Fri Apr 19 02:28:58 UTC 2019 : Method response headers: {X-Amzn-Trace-Id=Root=xxx, Content-Type=application/json}
Fri Apr 19 02:28:58 UTC 2019 : Successfully completed execution
Fri Apr 19 02:28:58 UTC 2019 : Method completed with status: 200

 

В мой поток журналов Cloudwatch ничего не регистрируется — тело ответа на запрос интеграции API Gateway содержит ошибку UnknownOperationException.

Мое лучшее предположение заключается в том, что этот запрос по какой-то причине не сопоставляется с действием PutLogEvents. Странно, что в этой ситуации код состояния равен 200.

Я предполагаю, что это просто какая-то опечатка — или дополнительный заголовок, который мне нужно отправить? Есть какие-нибудь идеи?

Ответ №1:

Это должно сработать, если вы добавите следующие строки в верхней части вашего шаблона сопоставления:

 #set($context.requestOverride.header['X-Amz-Target'] = "Logs_20140328.PutLogEvents")
#set($context.requestOverride.header['Content-Type'] = "application/x-amz-json-1.1")
 

Это очень сложно и недостаточно хорошо документировано. Вы можете найти эти заголовки в образце запроса для PutLogEvents.

Комментарии:

1. Блестяще, спасибо, это решение сработало отлично.

2. каким будет значение X-Amz-Target в случае действия cognito proxy initiateAuth ?

3. Не уверен, но, возможно, что-то вроде AWSCognitoIdentityProviderService.InitiateAuth

4. Спасибо за это. Это было совсем не ясно. Я добавил пример шаблона CloudFormation для всех, кто столкнется с этим в будущем по адресу github.com/stewartcampbell /.