調用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:公網訪問地址格式為
http(s)://<OwnerId>.mns.<region>.aliyuncs.com,內網訪問地址格式為http(s)://<OwnerId>.mns.<region>-internal.aliyuncs.com。 -
檢查生產端和消費端使用的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地址。