【问题标题】:Access Denied Error when trying to post messages to SQS尝试将消息发布到 SQS 时访问被拒绝错误
【发布时间】:2019-12-13 00:44:28
【问题描述】:

我正在尝试创建一个在 SQS 队列中记录 JSON 请求主体的 API。

我在 SQS 中设置了 FIFO 和非 FIFO 布局的基本队列。我每次都有同样的问题。我对 SQS 队列的策略如下:

{
  "Version": "2012-10-17",
  "Id": "arn:aws:sqs:us-east-1:2222222222222:API-toSQS.fifo/SQSDefaultPolicy",
  "Statement": [
    {
      "Sid": "Sid22222222222",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "SQS:*",
      "Resource": "arn:aws:sqs:us-east-1:2222222222222:API-toSQS.fifo"
    }
  ]
}

我制定了一项政策,我授予所有对 SQS 的写作能力访问权限。我已经为 API Gateway 创建了一个角色,我在其中分配了上述策略。这是我分配给此角色的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sqs:DeleteMessage",
                "sqs:ChangeMessageVisibility",
                "sqs:DeleteMessageBatch",
                "sqs:SendMessageBatch",
                "sqs:PurgeQueue",
                "sqs:DeleteQueue",
                "sqs:SendMessage",
                "sqs:CreateQueue",
                "sqs:ChangeMessageVisibilityBatch",
                "sqs:SetQueueAttributes"
            ],
            "Resource": "*"
        }
    ]
}

我已经设置了一个 API 网关。我创建了一个 POST 方法。我已经尝试启用 CORS 选项(它创建一个 OPTIONS 方法)并且我在没有启用 CORS 的情况下完成了它。我的安全策略的 ARN 是正确的,我已对其进行了三次检查。我选择了覆盖路径并在那里拥有我的 SQS 队列的完整 https URL,我也对此进行了三次检查。我的终点当然是 SQS。

对于集成请求,我有一个 Content-Type 的 HTTP 标头,然后是 'application/x-www-form-urlencoded' 的映射自

在映射模板中,我将 passthrough 设置为 never,并将 Content-Type 设置为 application/json,还包括模板 Action=SendMessage&MessageBody=$input.body,根据我找到的演练从 body 转换为 url。

我在 API Gateway 测试区收到以下错误

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

是否有 AWS 专家可以引导我朝着正确的方向前进?

澄清我的问题是它应该添加我的测试体

{"peanutbutter":"jelly"}

到 SQS 队列,但没有运气。

我可以整天从邮递员向 SQS 发送 url 编码的消息,但我希望我的业务合作伙伴能够通过 http(邮递员、节点等,等等)发送一个干净的 JSON 对象。

谢谢!

【问题讨论】:

  • @KenWhite 可以。现在改变

标签: aws-api-gateway amazon-iam amazon-sqs


【解决方案1】:

我选择覆盖路径,并在那里拥有我的 SQS 队列的完整 https URL

在路径覆盖中,仅输入 SQS 队列 URL 2222222222222/API-toSQS.fifo 的路径部分。

此外,先进先出队列需要MessageGroupId,如果未启用ContentBasedDeduplication,则还需要MessageDeduplicationId

映射模板示例:

Action=SendMessage&amp;MessageGroupId=$input.params('MessageGroupId')&amp;MessageDeduplicationId=$input.params('MessageDeduplicationId')&amp;MessageBody=$input.body

在这种情况下,您需要在 Method Request 中将 MessageGroupIdMessageDeduplicationId 定义为必需的查询字符串参数,并且显然将它们传递给 API 端点的请求。

【讨论】:

  • 太棒了,这就是我要找的东西
【解决方案2】:

对于遇到同样问题的任何人,从 API Gateway 中的集成请求中删除所有设置并使用 Lambda 作为“中间人”是可行的。 Lambda 是几乎所有 AWS 服务的绝佳中间人。我希望有一个 API Gateway -> SQS 堆栈而不是使用 API Gateway -> Lambda -> SQS,但是无论出于何种原因,lambda 处理 HTTP 请求的方式而不是尝试配置 API Gateway 来做同样的事情,都可以没有问题。

您在 Lambda 中不需要任何外部资源,因此无需导入 Zip 文件。只需导入 AWS 和 SQS。使用基本结构来接受事件,然后将正文(在我的情况下为 JSON)和sqs.sendMessage 带到您的队列中。

希望这对遇到同样问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多