为降低权限判断复杂度,提升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权限。
联系我们
给您带来的不便敬请谅解,如遇问题,请提交工单联系我们。