在EAS服务中访问其他云资源时,需配置访问密钥进行身份验证。通过关联RAM角色,您可在EAS服务实例内基于STS临时凭证访问其他云资源,无需再配置长期AccessKey,减少密钥泄漏风险。本文介绍如何创建RAM角色并授权给EAS,以及如何基于RAM角色获取STS临时访问凭证。
功能优势
RAM角色是一种允许云服务扮演的可信实体角色,用于解决“跨服务访问”的问题。基于RAM角色获取临时访问凭证来验证身份信息和访问权限控制,具有以下优势:
安全保密:无需在服务内管理凭据,使用STS临时访问凭证替代长期AccessKey,减少密钥泄露风险。
便捷可控:通过修改RAM角色权限策略,可更便捷、更精细地控制各开发者在服务内访问云资源的权限。
使用限制
目前,一个EAS服务只能关联一个RAM角色。
配置方法
在创建EAS服务时为其配置RAM角色,并获取STS临时访问凭证。
为EAS配置RAM角色
支持以下两种配置方式:
配置方式 | 适用场景 |
方式一:为EAS服务授权PAI默认角色 说明 PAI默认角色基于服务角色AliyunServiceRoleForPaiEas运作,仅拥有访问MaxCompute和OSS的权限。 | 无需额外创建RAM角色,适用于访问MaxCompute和OSS的基本开发资源。为EAS服务授权PAI默认角色,在以下场景中无需配置AccessKey:
|
方式二:为EAS服务授权自定义角色 | 当PAI默认角色权限不足时,您可以创建RAM角色并自定义其权限策略,按需控制开发者在EAS服务内可访问的云资源范围。 为EAS服务授权自定义角色后,通过STS临时凭证访问云产品时,所拥有的权限将与该自定义角色的权限保持一致。在部署服务时,系统将基于自定义角色的权限访问挂载的数据源并拉取自定义镜像。 |
具体配置方法如下:
方式一:为EAS服务授权PAI默认角色
在部署EAS服务时,在服务配置区域的JSON中添加以下配置:
"options": {
"enable_ram_role": true
}
如果使用JSON直接部署,并且希望通过PAI默认角色调用OSS SDK时,需要确保服务配置中包含metadata.workspace_id
字段。
方式二:为EAS服务授权自定义角色
其中,关键参数配置如下:
信任主体类型:选择云服务。
信任主体名称:选择人工智能平台PAI/PAI(eas.pai.aliyuncs.com)。
为已创建的RAM角色授权。
将系统策略或者自定义策略授权给RAM角色,使其拥有相关的资源访问或操作权限。例如给RAM角色授予访问OSS的权限AliyunOSSReadOnlyAccess。
在部署EAS服务时,关联RAM角色。
在服务配置区域的JSON中配置以下内容,其中role_arn需替换为上述步骤已创建的RAM角色的ARN,如何获取ARN,请参见查看RAM角色。
"options": { "enable_ram_role": true }, "role_arn": "acs:ram::111*************:role/${RoleName}"
(可选)若您使用RAM用户(阿里云子账号)部署EAS服务,请联系阿里云账号(主账号)为您授予如下权限策略,以获得将RAM角色传递给EAS实例的权限。具体操作,请参见创建自定义权限策略和为RAM用户授权。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
其中${RoleName}需要替换为EAS服务关联的RAM角色名称。
基于EAS服务关联的RAM角色获取临时访问凭证
为EAS服务分配了PAI默认角色或自定义角色后,您可以通过以下方式获取临时访问凭证:
方式一:通过Credentials工具获取
Credentials工具会调用EAS服务实例内的本地服务(EAS服务创建时已自动注入)获取STS临时访问凭证,该凭证会周期性更新。
在部署EAS服务时,完成以下关键配置:
安装阿里云Credentials工具。
在三方库配置参数中,选中三方库列表,并在编辑框中配置alibabacloud_credentials,来安装阿里云Credentials工具。
说明如果镜像中已预装此库,该配置步骤可省略。
配置脚本文件。
以Python为例,脚本内容示例如下,更多语言SDK示例,请参见使用访问凭据访问阿里云OpenAPI最佳实践。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_credentials.models import Config as CredConfig credentialsConfig = CredConfig( type='credentials_uri' ) credentialsClient = CredClient(credentialsConfig)
方式二:直接访问EAS服务实例内的本地服务获取
在EAS服务实例内,执行以下命令,可访问本地自动注入的Server获取临时访问凭证。
# 获取实例RAM角色的临时授权访问凭证
curl $ALIBABA_CLOUD_CREDENTIALS_URI
返回示例如下所示:
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
其中:
SecurityToken:表示RAM角色的临时Token。
Expiration:表示RAM角色的临时授权访问凭证的有效期。
方式三:直接访问EAS服务实例的本地内文件获取
在EAS服务实例中访问指定路径的文件(由PAI-EAS自动注入并周期性刷新),获取RAM角色的临时访问凭证。该文件所在的路径为/etc/ram/credentials
,文件内容示例如下:
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
使用示例
介绍如何基于EAS的RAM角色访问PyODPS或OSS。您可以将代码集成到服务镜像中,也可以通过模型配置将其挂载到服务实例中。本示例将以挂载方式为例介绍,具体操作步骤如下:
进入自定义部署页面,详情请参见服务部署。
在自定义部署页面,配置以下关键参数,更多参数配置说明,请参见控制台自定义部署参数说明。
参数
描述
环境信息
运行命令
增加执行代码的命令,例如
python /mnt/data/xx.py
。模型配置
将代码文件
xx.py
通过模型配置挂载到EAS服务实例中。选择代码文件所在目录,并配置挂载路径/mnt/data/
。代码文件内容示例如下:示例1:基于RAM角色访问OSS数据
import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials import providers from itertools import islice if __name__ == '__main__': auth = oss2.ProviderAuth(providers.DefaultCredentialsProvider()) # <oss_endpoint>需替换为您的OSS Bucket名称;<oss_bucket>需替换为您的OSS Bucket所在region的Endpoint。 bucket = oss2.Bucket(auth, '<oss_endpoint>', '<oss_bucket>' ) for b in islice(oss2.ObjectIterator(bucket), 10): print(b.key)
其中:
<oss_bucket>需替换为您的OSS Bucket名称,并确保其为当前工作空间中预设的默认OSS存储空间(Bucket)。
<oss_endpoint>需替换为您的OSS Bucket所在region的Endpoint。因EAS默认不通公网,此处应配置内网Endpoint地址(例如
oss-cn-hangzhou-internal.aliyuncs.com
)。如果需要使用公网Endpoint(例如oss-cn-hangzhou.aliyuncs.com
),则需为EAS配置具有公网访问能力的专有网络,详情请参见配置网络连通。
示例2:基于RAM角色访问PyODPS数据
from alibabacloud_credentials import providers from odps.accounts import CredentialProviderAccount from odps import ODPS if __name__ == '__main__': account = CredentialProviderAccount(providers.DefaultCredentialsProvider()) # <odps_project>需替换为您的Project名称;<odps_endpoint>需替换为您的Project所在region的Endpoint。 o = ODPS( account=account, project="<odps_project>", endpoint="<odps_endpoint>" ) for t in o.list_tables(): print(t)
其中:
<odps_project>需替换为您的Project名称。您可以登录MaxCompute控制台,在指定地域的 中,查看具体的Project名称。
说明如果您使用RAM用户,请确保该用户已具备项目的操作权限,详情请参见授权给其他用户。
<odps_endpoint>需替换为您的Project所在Region的Endpoint。因EAS默认不通公网,此处应配置内网Endpoint地址(例如
https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api
)。如果需要使用公网Endpoint(例如https://service.cn-hangzhou.maxcompute.aliyun.com/api
),则需为EAS配置具有公网访问能力的专有网络,详情请参见配置网络连通。
三方库配置
配置以下三方库列表,来安装阿里云Credentials工具、PyODPS SDK和OSS SDK。
alibabacloud_credentials pyodps oss2
说明如果镜像中已预装此库,该配置步骤可省略。
服务配置
以PAI默认角色为例,在服务配置区域JSON中添加以下配置:
"options": { "enable_ram_role": true }
说明如果使用JSON直接部署,并且希望通过PAI默认角色调用OSS SDK时,需要确保服务配置中包含
metadata.workspace_id
字段。参数配置完成后,单击部署。
服务部署成功后,您可以在服务日志中查看运行结果。
常见问题
部署EAS服务时配置自定义RAM角色报错,应如何解决?
报错信息:
登录RAM控制台,确认角色是否存在。
若角色不存在,请将实例自定义RAM角色修改为已存在的角色。
若角色存在,请联系主账号为子账号授予如下自定义权限策略(需将
${RoleName}
替换为RAM角色名称),以获得将RAM角色传递给EAS实例的权限,详情请参见为RAM用户授权。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
部署事件报错信息为
unable to render, error: failed to assume role for user, reason: You are not authorized to do this action. You should be authorized by RAM.
。可在模型在线服务(EAS)页面,单击服务名称,然后切换到部署事件页签进行查看。如下图所示:
该问题一般是由于您的角色未配置信任策略。您可以按照以下操作步骤为您的角色添加信任策略:
使用RAM管理员登录RAM控制台。
在左侧导航栏,选择 。
在角色页面,单击目标RAM角色名称。
在信任策略页签,单击编辑信任策略,添加信任"eas.pai.aliyuncs.com"。
在编辑器中修改信任策略内容,然后单击确定。
假设该角色原始的信任策略为:
{ "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", "eas.pai.aliyuncs.com" ] } } ], "Version": "1" }