調(diào)用MNS SDK或者API,如果出現(xiàn)“403 AccessDenied”或“The OwnerId that your Access Key Id associated to is forbidden for this operation”錯誤時, 一般是因為跨域訪問隊列,或者是使用了錯誤的OwnerId,或者是沒有正確配置主賬號RAM信息(使用子賬號訪問)。
問題描述
調(diào)用消息服務(wù)MNS的SDK或者API時,出現(xiàn)如下錯誤。
[Error Code]:403 AccessDenied [Message]:The OwnerId that your Access Key Id associated to is forbidden for this operation.
問題原因
引發(fā)該報錯的可能性如下。
- 跨地域訪問MNS隊列。
- 使用私網(wǎng)隊列地址時,生產(chǎn)端、消費端必須部署在相應(yīng)地域的ECS上,否則會報上述錯誤。
- 使用公網(wǎng)隊列地址時,生產(chǎn)端、消費端可以部署在本地,也可以部署在任意地域且開通公網(wǎng)訪問的ECS上。
- OwnerId配置錯誤。OwnerId指阿里云賬號的賬號ID,您可以在阿里云控制臺選擇 查看。
- 錯誤的RAM賬號或者RAM賬號權(quán)限配置異常。
- 調(diào)用HTTP API時,使用的URL地址與標志頭不對應(yīng)。詳情請參考更多信息。
- 使用了非阿里云官方的SDK。
解決方案
請參考如下步驟進行排查。
- 登錄消息服務(wù)MNS控制臺,切換到MNS實例所在的地域,單擊隊列列表,確認存在您創(chuàng)建的MNS實例。在操作列單擊詳情,在詳情頁的接入點區(qū)域獲取Endpoint信息。
說明 獲取的Endpoint地址中,以數(shù)字開頭的信息即為OwnerId。
- 檢查生產(chǎn)端和消費端使用的Endpoint地址和OwnerId是否正確。
- 檢查生產(chǎn)端和消費端是否符合如下原則。如果不符合,需要參考如下原則進行調(diào)整。
- 使用私網(wǎng)隊列地址時,生產(chǎn)端、消費端必須部署在相應(yīng)地域的ECS上。
- 使用公網(wǎng)隊列地址時,生產(chǎn)端、消費端可以部署在本地,也可以部署在任意地域且開通公網(wǎng)訪問的ECS上。
- 如果使用RAM賬號訪問MNS實例,請檢查主賬號的RAM配置是否正確。例如,主賬號RAM配置中授權(quán)的資源如下,RAM子賬號實際訪問的隊列是
/queues/busi-msn/messages
,那么也會由于不匹配,導致報錯。關(guān)于如何配置RAM賬號,請參見創(chuàng)建RAM用戶。"Resource": [ "acs:mns:*:*:/queues", "acs:mns:*:*:/queues/busi-test", "acs:mns:*:*:/queues/busi-test/*"
- 如果排查完以上幾點后,該報錯仍然存在,可能是因為您使用了非官方的SDK或者調(diào)用HTTP API時,使用的URL地址與標志頭不對應(yīng)。詳情請參考更多信息。
更多信息
消息服務(wù)MNS在正式商用前,名為MQS。正式商用前后,獲取Endpoint中顯示的信息是不同的。
- 正式商用前,Endpoint地址為
http://y9g.mqs-cn-beijing.aliyuncs.com/
。 - 正式商用后,Endpoint地址為
http://44404.mns.cn-beijing.aliyuncs.com/
。
說明 上述Endpoint地址僅為示例,現(xiàn)場以實際情況為準。后文中舊Endpoint地址指
http://y9g.mqs-cn-beijing.aliyuncs.com/
;新Endpoint地址指http://44404.mns.cn-beijing.aliyuncs.com/
。
消息服務(wù)MNS正式商用后,在兼容舊協(xié)議規(guī)則的同時,啟用了新協(xié)議規(guī)則。
http header x-mns-version
就是服務(wù)端用來識別新舊協(xié)議的標志頭。
- 如果用戶發(fā)送的請求包含
x-mns-version: 2015-06-06
,服務(wù)端將使用新協(xié)議規(guī)則解析。 - 如果用戶發(fā)送的請求包含
x-mqs-version: xxxx-xx-xx
,服務(wù)端將使用舊協(xié)議規(guī)則解析
因此,您需要參考如下規(guī)范來使用消息服務(wù)MNS。
- 調(diào)用HTTP API時,請求中的URL地址必須和標志頭對應(yīng)。如果URL使用新地址,標志頭卻用
x-mqs-version:xxxx-xx-xx
,那么還是會報錯。 - 使用SDK時,如果使用非官方SDK,非官方SDK可能沒有新舊Endpoint地址識別的功能,當用戶使用新Endpoint地址時,可能會出現(xiàn)問題。建議使用阿里云官方SDK,一方面能夠得到有保證的支持,另一方面官方SDK提供了BatchSendMessage、BatchReceiveMessage等批量操作,可以帶來更高的消息處理效率,而這些功能是沒有包含在非官方SDK包里的。如果不想更改已有代碼,堅持使用非官方SDK(不推薦),則可以聯(lián)系阿里云技術(shù)支持獲取舊Endpoint地址。