為降低許可權判斷複雜度,提升RAM使用者及角色調用介面時的許可權管理體驗,阿里雲ECS將於北京時間 2025年12月20日對查詢(Describe)類介面的鑒權機制進行升級,統一OpenAPI無許可權調用時的返回標準,包括不限於SDK、CLI以及Terraform等調用方式。
變更時間
北京時間 2025年12月20日
影響地區
全部地區
變更內容
對於ECS產品的查詢(Describe)類介面,在使用RAM使用者及角色調用時,如缺乏對應的資源操作介面許可權,介面返回將由HttpCode:200(OK)的空資源清單升級為HttpCode:403(Forbidden)的錯誤響應(鑒權不通過)。
變更前後對比
對比項 | 升級前 | 升級後 |
返回結果 | 空資源清單(HTTP 200) | 鑒權失敗(HTTP 403) |
錯誤碼 | 無 | 返回 |
錯誤資訊 | 無 |
|
診斷資訊 | 無 |
|
以DescribeInstances介面為例,如無ecs:DescribeInstances許可權調用時,升級前後返回結果如下:
升級前 | 升級後 |
| |
涉及API清單
產品 | API版本 | 介面名稱 |
Ecs | 2014-05-26 | |
Ecs | 2014-05-26 |
SDK調用適配
在代碼中捕獲該異常進行相應的處理:Exception中會包含一個欄位AccessDeniedDetail,用來描述許可權失敗的詳細原因,可以通過getAccessDeniedDetail()方法擷取。以Java語言為例:
V1.0 Java SDK樣本
// 產生的 SDK 的 Request
DescribeXXXRequest request = new DescribeXXXRequest();
try {
DescribeXXXResponse response = client.getAcsResponse(request);
} catch (ServerException e) {
// 列印錯誤碼
System.out.println(e.getErrCode());
} catch (ClientException e) {
// 列印錯誤碼,無許可權報錯此次輸出為“Forbidden.RAM”
System.out.println(e.getErrCode());
// 擷取許可權失敗的詳細原因
System.out.println(e.getAccessDeniedDetail());
}V2.0 Java SDK樣本
DescribeXXXRequest request = new DescribeXXXRequest();
try {
client.describeXXX(request);
} catch (TeaException e) {
// 列印錯誤碼,無許可權報錯此次輸出為“Forbidden.RAM”
System.out.println(e.getErrCode());
// 擷取許可權失敗的詳細原因
System.out.println(e.getAccessDeniedDetail());
}其他語言及不同版本SDK調用適配:
語言 | 版本 | 適配文檔連結 |
Python | V1.0 | |
V2.0 | ||
PHP | V1.0 | |
V2.0 | ||
Node.js | V1.0 | |
V2.0 | ||
.NET | V1.0 | |
V2.0 | ||
Go | V2.0 |
V1.0 Go SDK已停止支援,詳情請參考宣布將於 2025 年 3 月 1 日終止對阿里雲 V1.0 Golang SDK 支援,請使用V2.0 Go SDK。
解決方案與支援
許可權診斷排查
在許可權報錯時,返回結果中會帶有AccessDeniedDetail欄位,通過該欄位可以獲得許可權拒絕的詳細資料,可通過下面任意一個途徑進行解析:
通過調用“存取控制”產品中的DecodeDiagnosticMessage介面進行解析。
在OpenAPI Troubleshoot輸入請求
RequestId即可獲得許可權報錯和解決方案。通過控制台許可權診斷頁面進行診斷。
更多資訊,請參見如何排查無許可權的訪問錯誤。
許可權配置建議
必要操作許可權
如果確認此許可權為必要操作許可權,請聯絡您的主帳號或許可權管理員,對上述診斷結果涉及的許可權(AuthAction)進行為RAM使用者授權或者為RAM角色授權。
相容性處理
如果需要對報錯請求進行捕獲識別,請try...catch對應的異常,判斷錯誤碼是否為Forbidden.RAM,此錯誤碼代表子帳號缺少RAM許可權。