我想使用AWS SQS队列,并通过PHP脚本访问它。 PHP脚本安装在EC2实例上。
出于测试目的,我现在正在EC2实例上使用curl请求,例如:
curl https://sqs.ap-southeast-2.amazonaws.com/1234567890/Integration_Order_In?Action=ReceiveMessage
如果不配置任何权限,请求将失败:
<?xml version="1.0"?><ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"><Error><Type>Sender</Type><Code>AccessDenied</Code><Message>Access to the resource https://sqs.ap-southeast-2.amazonaws.com/123456789/Integration_Order_In is denied.</Message><Detail/></Error><RequestId>d47c06d5-a36b-5cac-aedb-54996975844f</RequestId></ErrorResponse>
这完全可以理解:如果未配置访问权限,则拒绝请求。浏览标题会显示底层的403错误。
可以理解的是,一切都适用于以下队列策略(队列 - &gt;权限 - &gt;编辑策略文档(高级)):
{
"Version": "2012-10-17",
"Id": "sqspolicy",
"Statement": [
{
"Sid": "Sid1506985964774",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:*",
"Resource": "arn:aws:sqs:ap-southeast-2:644393699576:Magento_Integration_Order_In_Tmall_ShippingLabelDownload__tmall",
"Condition": {
"StringEquals": {
"aws:SourceIp": "12.34.56.78"
}
}
}
]
}
结果很有希望:
<?xml version="1.0"?><ReceiveMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"><ReceiveMessageResult/><ResponseMetadata><RequestId>788aeac3-de4d-5d4c-85ad-b88f101f164e</RequestId></ResponseMetadata></ReceiveMessageResponse>
但是这会将权限绑定到IP地址,而我更愿意将其绑定到实例(ip地址可能会更改)。不幸的是,我添加我的实例的arn或其IAM角色的实验并未导致对SQS网址的任何访问。
情景似乎有点具体。例如,在其他方案中,将访问权限添加到EC2实例的IAM角色可能是可行的。由于几个原因,这在我的案例中效果不佳。我真的更愿意在队列级别上使用权限。
有什么想法吗?