調用SDK或者API,如果出現“403 AccessDenied”或“The OwnerId that your Access Key Id associated to is forbidden for this operation”錯誤時, 一般是因為跨域訪問隊列,或者是使用了錯誤的OwnerId,或者是沒有正確配置主帳號RAM資訊(使用子帳號訪問)。
問題描述
調用輕量訊息佇列(原 MNS)的SDK或者API時,出現如下錯誤。
[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,您可以登入輕量訊息佇列(原 MNS)控制台,將滑鼠懸浮在右側頭像處,在展開的浮窗中擷取帳號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使用者,請參見建立RAM使用者。"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地址。