尝试将消息发布到 SQS 时出现访问被拒绝错误

sao*_*sao 2 amazon-sqs amazon-iam aws-api-gateway

我正在尝试创建一个在 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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我制定了一项政策,允许所有人员访问 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": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

在映射模板中,我将 passthrough 设置为never并将 Content-Type 设置为application/json还包含Action=SendMessage&MessageBody=$input.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 对象

谢谢你!

Kam*_*him 6

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

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

此外,MessageGroupId对于 fifo 队列是必需的,如果未启用 ContentBasedDeduplication,MessageDeduplicationId则也需要。

映射模板示例:

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

在这种情况下,您需要在方法请求中MessageGroupId根据MessageDeduplicationId需要定义查询字符串参数,并显然将它们传递到 API 端点的请求中。