【问题标题】:AccessDeniedException: Unable to determine service/operation name to be authorizedAccessDeniedException:无法确定要授权的服务/操作名称
【发布时间】:2016-12-29 01:19:11
【问题描述】:

使用 AWS CLI

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

https://github.com/arun-gupta/serverless/tree/master/aws/microservice#post-method 中所述,为 API 网关创建 POST 方法。使用test-invoke-method和AWS Console可以成功调用该方法。

使用 AWS CLI https://github.com/arun-gupta/serverless/tree/master/aws/microservice#get-method 创建 GET 方法。使用 test-invoke-method 和 AWS 控制台调用此方法会出现以下错误:

{
    "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 是否会导致此操作失败?

【问题讨论】:

  • 我在遇到类似问题时遇到了一些麻烦。看看我今天刚发的帖子。此外,我刚刚投票支持您的问题,让您超过 3000 分。祝您朋友 3000 分快乐。

标签: aws-lambda aws-api-gateway aws-cli serverless-architecture


【解决方案1】:

我认为您也在 GET 方法上为您的 Lambda 函数端点使用“GET”。请将其更改为对 Lambda 集成 HTTP 方法使用“POST”。

【讨论】:

  • 成功了,非常感谢!为什么 GET HTTP 需要 POST 集成方法?
  • 集成是您要代理的 API,方法是您要向客户公开的 API。由于 Lambda 使用 POST 方法定义了他们的调用 API,因此您必须遵循他们定义的 API。
  • 我对此感到困惑。 AWS 文档提供了一个通过 GET 调用 lambda 的示例:docs.aws.amazon.com/apigateway/latest/developerguide/…,正如 AWS 论坛上所述,可以仅通过控制台使其工作:forums.aws.amazon.com/thread.jspa?threadID=209420
  • 当您从 cli 进行集成设置时,例如当您需要自动部署脚本时,您需要为 GET 方法指定 --integration-http-method POST。我不相信这在 aws 官方文档中的任何地方都有记录。 aws cli 命令应如下所示: aws apigateway put-integration --rest-api-id xxxx --resource-id xxx --http-method GET --integration-http-method POST --type AWS_PROXY --uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/[lambda function arn]/invocations
  • GET 是您的 API 网关 Http 方法。 POST 是 API Gateway 用来调用 Lambda 服务的 http 方法。这就是为什么对于您的“GET”方法,您仍然需要将集成 HTTP 方法设置为“POST”。
【解决方案2】:

要调用 lambda 函数,http 方法应该是 POST 根据 lambda API

访问http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html

【讨论】:

    【解决方案3】:

    源 ARN 中的 null 是因为 test-invoke 没有与您的 API 关联的阶段。这通常不是问题,除非您的 Lambda 函数的策略需要不兼容的源 ARN。检查您的 Lambda 函数的策略,看看它是否包含对源 ARN 的限制。如果是这样,请将其编辑为与 test-invoke ARN 兼容,或者将 API 部署到阶段并直接调用该方法而不使用 test-invoke。

    【讨论】:

      【解决方案4】:

      注意 API Gateway 使用 POST 方法调用 Lambda,同时允许任何方法通过 x-amazon-apigateway-any-method 调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2015-07-27
        相关资源
        最近更新 更多