【问题标题】:Unable to determine service/operation name to be authorized when using API Gateway to POST to SQS使用 API Gateway POST 到 SQS 时无法确定要授权的服务/操作名称
【发布时间】:2020-09-01 16:58:08
【问题描述】:

按照接受的答案here,我尝试配置 API 网关以使用 POST 而不是 GET 将消息发送到 SQS(我能够使 GET 工作)。使用 POST 时,我收到以下响应:

<AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

这就是我的映射模板的配置方式

#set($clientKey = $input.params('clientkey'))
#set($url = "https://sqs.us-east-2.amazonaws.com/XXXXXXXX/SomeQueuePrefix-${clientKey}-SomeQueueEnvironment.fifo")
Action=SendMessage##
&QueueUrl=$util.urlEncode($url)##
&MessageGroupId=$input.params('messageGroupId')##
&MessageDeduplicationId=1##
&MessageBody=$util.urlEncode($input.body)

看起来它正确地映射了身体

Wed Nov 14 20:39:44 UTC 2018 : Endpoint request body after transformations: Action=SendMessage&QueueUrl=https%3A%2F%2Fsqs.us-east-2.amazonaws.com%2FXXXXXXXXX%2FSomeQueuePrefix-TEST-SomeQueueEnvironment.fifo&MessageGroupId=3&MessageDeduplicationId=1&MessageBody=%7B%0A++++%22configurationId%22%3A+1%0A%7D
Wed Nov 14 20:39:44 UTC 2018 : Sending request to https://sqs.us-east-1.amazonaws.com//

Screenshot of my Integration Request setup

我的 IAM 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:sqs:us-east-1:XXXXXXXXX:CADAUTO-*-DEV.fifo"
            ],
            "Action": [
                "sqs:SendMessage",
                "sqs:ReceiveMessage",
                "sqs:DeleteMessage"
            ]
        }
    ]
}

谁能明白为什么这不起作用?

【问题讨论】:

  • 验证在Integration Request中,HTTP Method设置为POST
  • 谢谢。我发布了我的集成请求的屏幕截图。 HTTP方法设置为POST;其他一切看起来都还好吗?
  • 我不认为在集成请求中定义路径参数是按照您的意图进行的,这可能是有问题的,尽管我可能弄错了。该服务也可能会因为模板前两行末尾缺少## 而感到困惑。我觉得无论是什么导致这将是一些相对轻微的/微妙的/不明显的。
  • 路径参数被正确替换,我可以看到请求是用预期的主体发送的(在这个例子中,clientKey 是'TEST',你可以在 QueueUrl 参数的值中看到在请求正文中。我想知道请求 url 中的双斜杠,但是如果我从路径覆盖中取出 / ,则请求失败。我注意到我在正文中的区域是 us-east-2 并且我们的队列在us-east-1。我以为我找到了导致错误的明显原因。但是在我将其更改为 us-east-1 后,我仍然遇到同样的问题。
  • 我添加了我的政策,以防里面有任何东西。我尝试硬编码“TEST”以及使用“*”作为资源,但都没有任何效果。

标签: amazon-web-services aws-api-gateway amazon-sqs


【解决方案1】:

SQS 期望内容类型为“Content-Type”到“application/x-www-form-urlencoded”。在 API 网关设置中的 HTTP 标头中设置此项解决了我的问题。

【讨论】:

    【解决方案2】:

    刚刚遇到同样的问题。使用@Hari Krishnan 的上述建议是解决方案的一部分;我需要为我的用例使用额外的映射模板。 Step 6 of the following tutorial 为我解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多