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

时间:2019-11-21 23:47:54

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

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

我已经在FIFO和非FIFO布局中的SQS中设置了基本队列。我每次都有同样的问题。我对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网关创建了一个角色,在其中分配了上述策略。这是我分配给该角色的政策:

{
    "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'的映射来源

在映射模板中,我已将传递设置为never,并将Content-Type设置为application/json,并且还包含了模板Action=SendMessage&MessageBody=$input.body,可根据演练将其从正文转换为url我找到了。

我在API网关测试区域遇到以下错误

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

外面有一个AWS专家可以指导我正确的方向吗?

要澄清我的问题是它应该添加我的测试正文

{"peanutbutter":"jelly"}

进入SQS队列,但是没有运气。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我选择替代路径,并在其中拥有我的SQS队列的完整https URL

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

此外,fifo队列需要MessageGroupId,如果未启用ContentBasedDeduplication,则也需要MessageDeduplicationId

映射模板示例:

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

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

答案 1 :(得分:0)

对于遇到相同问题的任何人,都可以从API Gateway中的集成请求中删除所有设置,并使用Lambda作为“中间人”。对于几乎所有的AWS服务,Lambda都是一个很好的选择。我宁愿拥有一个API Gateway-> SQS堆栈,而不是使用API​​ Gateway-> Lambda-> SQS,但是无论出于何种原因,lambda处理HTTP请求的方式都与尝试配置API Gateway的方式相反没有问题。

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

希望这可以帮助遇到相同问题的任何人。