我正在尝试创建一个在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对象。
谢谢!
答案 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
在这种情况下,您需要在“方法请求”中定义MessageGroupId
和MessageDeduplicationId
作为必需的查询字符串参数,并且显然在请求时将它们传递给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
放入队列。
希望这可以帮助遇到相同问题的任何人。