消息服务MNS报“[Error Code]:403 AccessDenied [Message]:The OwnerId that your Access Key Id associated to is forbidden for this operation.”的错误,如何解决?
问题原因 引发该报错的可能性如下。 跨地域访问MNS队列。 使用私网队列地址时,生产端、消费端必须部署在相应地域的ECS上,否则会报上述错误。 使用公网队列地址时,生产端、消费端可以部署在本地,也可以部署在任意地域且开通公网访问的ECS上。 OwnerId配置错误。OwnerId指阿里云账号的账号ID,您可以在阿里云控制台选择 账号管理 > 安全设置 查看。
错误的RAM账号或者RAM账号权限配置异常。 调用HTTP API时,使用的URL地址与标志头不对应。详情请参考更多信息。 使用了非阿里云官方的SDK。
解决方案 请参考如下步骤进行排查。 登录消息服务MNS的控制台,切换到MNS实例所在的地域,单击 队列,确认存在您创建的MNS实例。单击 获取Endpoint。 注:获取的Endpoint地址中,以数字开头的信息即为OwnerId。
检查生产端和消费端使用的Endpoint地址和OwnerId是否正确。 检查生产端和消费端是否符合如下原则。如果不符合,需要参考如下原则进行调整。 使用私网队列地址时,生产端、消费端必须部署在相应地域的ECS上。 使用公网队列地址时,生产端、消费端可以部署在本地,也可以部署在任意地域且开通公网访问的ECS上。 如果使用RAM账号访问MNS实例,请检查主账号的RAM配置是否正确。例如,主账号RAM配置中授权的资源如下,RAM子账号实际访问的队列是/queues/busi-msn/messages,那么也会由于不匹配,导致报错。关于如何配置RAM账号,请参见子账号访问MNS。
"Resource": [ "acs:mns:::/queues", "acs:mns:::/queues/busi-test", "acs:mns:::/queues/busi-test/*" 如果排查完以上几点后,该报错仍然存在,可能是因为您使用了非官方的SDK或者调用HTTP API时,使用的URL地址与标志头不对应。详情请参考更多信息。
更多信息 消息服务MNS在正式商用前,名为MQS。正式商用前后,获取Endpoint中显示的信息是不同的。 正式商用前,Endpoint地址为http://y9g.mqs-cn-beijing.aliyuncs.com/。 正式商用后,Endpoint地址为http://44404.mns.cn-beijing.aliyuncs.com/。 注:上述Endpoint地址仅为示例,现场以实际情况为准。后文中旧Endpoint地址指http://y9g.mqs-cn-beijing.aliyuncs.com/;新Endpoint地址指http://44404.mns.cn-beijing.aliyuncs.com/。
消息服务MNS正式商用后,在兼容旧协议规则的同时,启用了新协议规则。http header x-mns-version就是服务端用来识别新旧协议的标志头。
如果用户发送的请求包含x-mns-version: 2015-06-06,服务端将使用新协议规则解析。 如果用户发送的请求包含x-mqs-version: xxxx-xx-xx,服务端将使用旧协议规则解析。
因此,您需要参考如下规范来使用消息服务MNS。 调用HTTP API时,请求中的URL地址必须和标志头对应。如果URL使用新地址,标志头却用x-mqs-version:xxxx-xx-xx,那么还是会报错。 使用SDK时,如果使用非官方SDK,非官方SDK可能没有新旧Endpoint地址识别的功能,当用户使用新Endpoint地址时,可能会出现问题。建议使用阿里云官方SDK,一方面能够得到有保证的支持,另一方面官方SDK提供了BatchSendMessage、BatchReceiveMessage等批量操作,可以带来更高的消息处理效率,而这些功能是没有包含在非官方SDK包里的。如果不想更改已有代码,坚持使用非官方SDK(不推荐),则可以联系阿里云技术支持获取旧Endpoint地址。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。