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

Aws api gateway 尝试将消息发布到SQS时出现拒绝访问错误,aws-api-gateway,amazon-iam,amazon-sqs,Aws Api Gateway,Amazon Iam,Amazon Sqs,我试图创建一个API,将JSON请求主体记录在SQS队列中 我在SQS中设置了FIFO和非FIFO布局的基本队列。我每次都有同样的问题。我对SQS队列的策略如下: { "Version": "2012-10-17", "Id": "arn:aws:sqs:us-east-1:2222222222222:API-toSQS.fifo/SQSDefaultPolicy", "Statement": [ { "Sid": "Sid22222222222",

我试图创建一个API,将JSON请求主体记录在SQS队列中

我在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网关创建了一个角色,在其中我将上述策略分配给它。以下是我分配给此角色的策略:

{
    "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选项来创建一个选项方法,但我没有启用CORS。我的安全策略的ARN是正确的,我已经进行了三次检查。我选择了覆盖路径,并在那里有我的SQS队列的完整https URL,我也对其进行了三次检查。我的终点当然是SQS

对于集成请求,我有一个内容类型的HTTP头,然后映射为“application/x-www-form-urlencoded”

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

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

无法确定要授权的服务/操作名称

有没有一位AWS大师可以指引我走向正确的方向

澄清我的问题是,它应该添加我的测试机构

{花生酱:果冻}

到SQS队列,但没有运气

我可以整天从postman向SQS发送url编码的消息,但我希望我的业务合作伙伴能够通过http postman、node等发送干净的JSON对象


谢谢大家!

对于任何有同样问题的人来说,在API网关中从集成请求中删除所有设置并使用Lambda作为中间人是可行的。Lambda是几乎所有AWS服务的中间人。我更喜欢使用API网关->SQS堆栈,而不是使用API网关->Lambda->SQS,但无论出于何种原因,Lambda处理HTTP请求的方式,而不是试图配置API网关来执行相同的操作,都可以正常工作

在Lambda中不需要任何外部资源,因此不需要导入Zip文件。只需导入AWS和SQS。使用基本结构接受事件,然后在我的示例中将主体作为JSON,并将sqs.sendMessage发送到队列


希望这能帮助有相同问题的人。

对于有相同问题的人,在API网关中删除集成请求中的所有设置,并使用Lambda作为中间人。Lambda是几乎所有AWS服务的中间人。我更喜欢使用API网关->SQS堆栈,而不是使用API网关->Lambda->SQS,但无论出于何种原因,Lambda处理HTTP请求的方式,而不是试图配置API网关来执行相同的操作,都可以正常工作

在Lambda中不需要任何外部资源,因此不需要导入Zip文件。只需导入AWS和SQS。使用基本结构接受事件,然后在我的示例中将主体作为JSON,并将sqs.sendMessage发送到队列

希望这能帮助有同样问题的人

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

在路径覆盖类型中,仅SQS队列URL 22222/API-toSQS.fifo的路径部分

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

映射模板的示例:

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

在这种情况下,您需要将MessageGroupId和MessageDeduplicationId定义为方法请求中所需的查询字符串参数,并在请求时将它们传递给API端点

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

在路径覆盖类型中,仅SQS队列URL 22222/API-toSQS.fifo的路径部分

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

映射模板的示例:

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


在这种情况下,您需要将MessageGroupId和MessageDeduplicationId定义为方法请求中所需的查询字符串参数,并在请求时将它们传递给API端点

@KenWhite就行了。改变now@KenWhite行。现在改变辉煌这是我一直在寻找的辉煌这是我一直在寻找的