当您在DSW实例内访问其他云资源时,必须配置访问密钥来验证身份信息。通过为DSW实例关联RAM角色,实例即可使用该角色的STS临时身份凭证访问其他云资源,无需再配置长期AccessKey,降低了密钥泄露的风险。
什么是实例RAM角色
实例RAM角色是指:允许实例扮演某个RAM角色,之后实例将获得角色的临时身份凭证,即安全令牌(STS Token),使用该安全令牌就能以该角色的身份访问被授权的资源,用于解决跨服务访问的问题。其具有以下优势:
安全保密:无需在实例内管理凭据,使用STS临时访问凭证替代长期AccessKey,降低密钥泄露风险。
便捷可控:通过修改实例RAM角色的权限策略,可更便捷、更精细地控制各开发者在DSW实例内访问云资源时的权限。
使用限制
一个DSW实例现只能关联一个RAM角色。
步骤一:为DSW实例配置RAM角色
场景一:PAI默认角色
PAI默认角色仅拥有访问PAI内部产品、MaxCompute和OSS的权限,且权限更加精细。基于PAI默认角色签发的临时访问凭证,在访问PAI内部产品、MaxCompute表时,将拥有等同于DSW实例所有者的权限;在访问OSS时,仅能访问当前工作空间配置的默认存储路径Bucket。
为实例授权PAI默认角色后,用户在以下场景中无需配置AccessKey:
通过PAI SDK创建训练任务提交至当前工作空间。
通过DLC SDK创建训练任务提交至当前工作空间。
通过ODPS SDK提交任务到实例所有者有执行权限的MaxCompute项目中。
通过OSS SDK访问当前工作空间配置的默认存储路径Bucket中的数据。
在WebIDE中使用通义灵码服务。
场景二:自定义角色
登录RAM控制台,创建RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色。
其中,关键参数配置如下:
信任主体类型:云服务
信任主体名称:人工智能平台PAI / PAI (pai.aliyun.cs.com)
为已创建的实例RAM角色授权。
单击新增授权,将系统策略或者自定义权限策略授权给RAM角色,使其拥有相关的资源访问或操作权限,例如添加AliyunOSSFullAccess策略。详情请参见步骤三:为RAM角色授权。
说明若您使用的是RAM子账号操作DSW实例,请联系阿里主账号创建如下权限策略,并授权给您的RAM子账号,使子账号具有使用该实例RAM角色的权限。
需要创建的权限策略请参见如下代码,其中,需要将
${RoleName}
替换为DSW实例RAM角色的名称。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
创建DSW实例并关联实例RAM角色。具体操作,请参见创建DSW实例。
场景三:不关联RAM角色
如果您的实例设置为工作空间公开可见,建议不要为实例关联RAM角色,避免权限泄露。您可以在新建实例或变更实例配置时,将高级信息区域的实例RAM角色设置为不关联角色。
更新实例RAM角色配置
进入DSW页面。
登录PAI控制台。
在概览页面选择目标地域。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择模型开发与训练>交互式建模(DSW),进入DSW页面。
单击DSW实例右侧的变更配置。
在角色与权限区域配置实例RAM角色。
说明当实例RAM由PAI默认角色/自定义角色切换为不关联角色,或由不关联角色切换为PAI默认角色/自定义角色时,如果实例正在运行中,更新操作会立即重启实例。请确保您已及时保存实例。
完成配置后,单击确定。
步骤二:基于实例RAM角色获取临时访问凭证
您可在授权过RAM角色的DSW实例中通过以下方式获取临时访问凭证。
方式一:通过Credentials工具获取
Credentials工具会调用实例本地的服务(实例创建时已自动注入)获取STS临时访问凭证,该凭证会周期性更新。
通过Credentials工具获取实例RAM角色的访问凭证,需要执行如下命令安装阿里云Credentials工具(以Python为例)。
pip install alibabacloud_credentials
Credentials工具使用示例如下,更多语言SDK示例,请参见使用访问凭据访问阿里云OpenAPI最佳实践。
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
credentialsConfig = CredConfig(
type='credentials_uri' # 选填。若您未配置其他“默认凭据链”访问方式,您无需再显式指定,Credentials SDK会通过uri方式获取临时凭证
)
credentialsClient = CredClient(CredConfig)
方式二:直接访问DSW实例本地服务获取
在DSW实例内,您可在Terminal执行如下命令,访问本地自动注入的server直接获取。
# 获取实例RAM角色的临时授权访问凭证
curl $ALIBABA_CLOUD_CREDENTIALS_URI
返回示例如下,其中:
SecurityToken:实例RAM角色的临时Token。
Expiration:实例RAM角色的临时授权访问凭证的有效期。
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******"
"Expiration": "2024-05-21T10:39:29Z"
}
方式三:直接访问实例本地内文件获取
您可在DSW实例内访问指定路径的文件(由PAI自动注入并周期性刷新),获取实例RAM角色的临时访问凭证。该文件所在的路径为/mnt/.alibabacloud/credentials
,文件内容如下:
{
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******"
"Expiration": "2024-05-21T10:39:29Z"
}
步骤三:基于实例RAM角色访问其他云产品
示例一:基于实例RAM角色访问MaxCompute
执行如下命令,安装Credentials工具和ODPS SDK。
# 安装credentials工具 pip install alibabacloud_credentials # 安装odps sdk pip install odps
使用实例RAM角色的临时凭证访问MaxCompute,并获取指定项目的table列表。查询MaxCompute不同地域endpoint,请参见Endpoint。
from alibabacloud_credentials import providers from odps.accounts import CredentialProviderAccount from odps import ODPS if __name__ == '__main__': account = CredentialProviderAccount(providers.DefaultCredentialsProvider()) o = ODPS( account=account, project="{odps_project}", #需替换为您的project名称 endpoint="{odps_endpoint}"#需替换为您的project所在region的endpoint ) for t in o.list_tables(): print(t)
示例二:基于实例RAM角色访问对象存储OSS
执行如下命令,安装Credentials工具和OSS SDK。
# 安装credentials工具 pip install alibabacloud_credentials # 安装oss sdk pip install oss2
使用实例RAM角色的临时凭证访问OSS,并列举指定Bucket下的10个文件。查询OSS不同地域endpoint,请参见OSS地域和访问域名。
import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials import providers from itertools import islice auth = oss2.ProviderAuth(providers.DefaultCredentialsProvider()) bucket = oss2.Bucket(auth, '{oss_endpoint}',#需替换为您的oss bucket所在region的endpoint '{oss_bucket}'#需替换为您的oss bucket名称 ) for b in islice(oss2.ObjectIterator(bucket), 10): print(b.key)
示例三:基于实例RAM角色访问DLC
执行如下命令,安装Credentials工具、OpenAPI SDK和DLC SDK。
# 安装credentials工具 pip install alibabacloud_credentials # 安装阿里云openapi sdk pip install alibabacloud-tea-util alibabacloud_tea_openapi # 安装pai-dlc sdk pip install alibabacloud_pai_dlc20201203
使用实例RAM角色的临时凭证访问PAI-DLC,并列举指定工作空间下的DLC任务。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_tea_openapi.models import Config from alibabacloud_pai_dlc20201203.client import Client as pai_dlc20201203Client from alibabacloud_pai_dlc20201203 import models as pai_dlc_20201203_models from alibabacloud_tea_util.models import RuntimeOptions # 使用Credentials工具初始化DLC client credentialsClient = CredClient() config = Config(credential=credentialsClient) config.endpoint = '{dlc_endpoint}' #需替换为您所在region的endpoint client = pai_dlc20201203Client(config) # 初始化请求,并调用ListJobs API list_jobs_request = pai_dlc_20201203_models.ListJobsRequest() list_jobs_request.workspace_id = '{workspace_id}' #需替换为您的工作空间ID runtime_options = RuntimeOptions() headers = {} resp = client.list_jobs_with_options(list_jobs_request, headers, runtime_options) jobs = resp.to_map()['body']['Jobs'] print(jobs[0])
常见问题
1. 选择自定义角色时,创建实例报错PassRoleFailedError,应如何解决?
登录RAM控制台,确认该角色是否存在。
若角色不存在,您需将实例RAM角色修改为已存在的角色。
若角色存在,您需联系主账号,为您的子账号授予使用该角色的权限。权限策略如下(需将
${RoleName}
替换为RAM角色的名称):{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
2. 选择自定义角色时,创建实例报错AssumeRoleFailedError,应如何解决?
该问题的原因,一般由于是您的角色未配置信任策略。请按照如下步骤进行操作:
使用RAM管理员登录RAM控制台。
在左侧导航栏,选择身份管理 > 角色。
在角色页面,单击目标RAM角色名称。
在信任策略页签,单击编辑信任策略。
修改信任策略内容,然后单击确定。
例如,角色原始的信任策略为:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::aaa:root" ], "Service": [ "xxx.aliyuncs.com" ] } } ], "Version": "1" }
新的策略需要修改为:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::aaa:root" ], "Service": [ "xxx.aliyuncs.com", "pai.aliyuncs.com" ] } } ], "Version": "1" }