1

Использование AWS CLIAccessDeniedException: Невозможно определить службы/имя операции будет разрешено

aws --version 
aws-cli/1.11.21 Python/2.7.12 Darwin/15.3.0 botocore/1.4.78 

Создание метода POST для API шлюза, как описано в https://github.com/arun-gupta/serverless/tree/master/aws/microservice#post-method. Этот метод можно успешно использовать с помощью test-invoke-method и AWS Console.

Создание метода GET с использованием AWS CLI https://github.com/arun-gupta/serverless/tree/master/aws/microservice#get-method. Вызов этого метода с использованием test-invoke-method и AWS Console дает следующее сообщение об ошибке:

{ 
    "status": 500, 
    "body": "{\"message\": \"Internal server error\"}", 
    "log": "Execution log for request test-request\nThu Dec 29 00:58:56 UTC 2016 : Starting execution for request: test-invoke-request\nThu Dec 29 00:58:56 UTC 2016 : HTTP Method: GET, Resource Path: /books\nThu Dec 29 00:58:56 UTC 2016 : Method request path: {}\nThu Dec 29 00:58:56 UTC 2016 : Method request query string: {}\nThu Dec 29 00:58:56 UTC 2016 : Method request headers: {}\nThu Dec 29 00:58:56 UTC 2016 : Method request body before transformations: \nThu Dec 29 00:58:56 UTC 2016 : Endpoint request URI: https://lambda.us-west-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-1:598307997273:function:MicroserviceGetAll/invocations\nThu Dec 29 00:58:56 UTC 2016 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=******************************************************************************************************************************************************************************************************************************************************************************************************482377, X-Amz-Date=20161229T005856Z, x-amzn-apigateway-api-id=sofl9ilki7, X-Amz-Source-Arn=arn:aws:execute-api:us-west-1:598307997273:sofl9ilki7/null/GET/books, Accept=application/json, User-Agent=AmazonAPIGateway_sofl9ilki7, Host=lambda.us-west-1.amazonaws.com, X-Amzn-Trace-Id=Root=1-58645fd0-7d733ae3c383f4378fcc0338}\nThu Dec 29 00:58:56 UTC 2016 : Endpoint request body after transformations: \nThu Dec 29 00:58:56 UTC 2016 : Endpoint response body before transformations: <AccessDeniedException>\n <Message>Unable to determine service/operation name to be authorized</Message>\n</AccessDeniedException>\n\nThu Dec 29 00:58:56 UTC 2016 : Endpoint response headers: {x-amzn-RequestId=f95a8659-cd61-11e6-80f6-ddd6ce5b7e8b, Connection=keep-alive, Content-Length=130, Date=Thu, 29 Dec 2016 00:58:56 GMT}\nThu Dec 29 00:58:56 UTC 2016 : Lambda invocation failed with status: 403\nThu Dec 29 00:58:56 UTC 2016 : Execution failed due to configuration error: \nThu Dec 29 00:58:56 UTC 2016 : Method completed with status: 500\n", 
    "latency": 39 
} 

ARN идентифицированный в сообщении об ошибке является arn:aws:execute-api:us-west-1:598307997273:sofl9ilki7/null/GET/books. Интересно, если null вместо test заставляет это терпеть неудачу?

ответ

8

Я думаю, что вы используете «GET» для вашей конечной точки функции Lambda по вашему методу GET. Пожалуйста, измените его, чтобы использовать «POST» для HTTP-метода интеграции Lambda.

+0

Это сделало трюк, спасибо большое! Почему метод «POST» необходим для HTTP? GET? –

+0

Интеграция - это API, для которого вы хотите прокси-сервер, а метод - это API, который вы собираетесь предоставить своему клиенту. Поскольку Lambda определяет свой API-интерфейс вызова с помощью метода POST, вы должны следить за тем, что они определяют API. –

+0

Я смущен этим. В документах AWS приведен пример вызова лямбда через GET: http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html и, как указано на AWS форум, это возможно сделать, чтобы он работал только через консоль: https://forums.aws.amazon.com/thread.jspa?threadID=209420. – jazzbassrob

0

Нуль в исходном ARN - это потому, что test-invoke не имеет стадии для связи с вашим API. Обычно это не проблема, если только политика вашей функции лямбда не является несовместимой исходной ARN. Проверьте политику на вашей лямбда-функции и посмотрите, содержит ли она ограничение на источник ARN. Если это так, отредактируйте его, чтобы он был совместим с тестовым вызовом ARN или развернул API на этапе и сразу вызвал метод без вызова test-invoke.

-1

Обратите внимание, что шлюз API Gateway использует метод POST для вызова Lambda, позволяя любому методу называть его с помощью x-amazon-apigateway-any-method.