配置EAS RAM角色

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运作,仅拥有访问MaxComputeOSS的权限。

无需额外创建RAM角色,适用于访问MaxComputeOSS的基本开发资源。为EAS服务授权PAI默认角色,在以下场景中无需配置AccessKey:

  • 通过PyODPS SDK访问EAS服务所有者有执行权限的MaxCompute项目中的数据。

  • 通过OSS SDK访问当前工作空间预设的默认OSS存储空间(Bucket)中的数据。

方式二:为EAS服务授权自定义角色

PAI默认角色权限不足时,您可以创建RAM角色并自定义其权限策略,按需控制开发者在EAS服务内可访问的云资源范围。

EAS服务授权自定义角色后,通过STS临时凭证访问云产品时,所拥有的权限将与该自定义角色的权限保持一致。在部署服务时,系统将基于自定义角色的权限访问挂载的数据源并拉取自定义镜像。

具体配置方法如下:

方式一:为EAS服务授权PAI默认角色

在部署EAS服务时,在服务配置区域的JSON中添加以下配置:

"options": {
  "enable_ram_role": true
}
说明

如果使用JSON直接部署,并且希望通过PAI默认角色调用OSS SDK时,需要确保服务配置中包含metadata.workspace_id字段。

方式二:为EAS服务授权自定义角色

  1. 登录RAM控制台创建RAM角色

    其中,关键参数配置如下:

    • 信任主体类型:选择云服务

    • 信任主体名称:选择人工智能平台PAI/PAI(eas.pai.aliyuncs.com)。

    image

  2. 为已创建的RAM角色授权。

    将系统策略或者自定义策略授权给RAM角色,使其拥有相关的资源访问或操作权限。例如给RAM角色授予访问OSS的权限AliyunOSSReadOnlyAccess。

    重要

    若在部署服务时挂载了数据源或使用了自定义镜像,系统将基于RAM角色的权限访问数据源和拉取镜像。因此需要为RAM角色授予访问数据源(NASOSS)和容器镜像服务的权限。

  3. 在部署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"
}

使用示例

介绍如何基于EASRAM角色访问PyODPSOSS。您可以将代码集成到服务镜像中,也可以通过模型配置将其挂载到服务实例中。本示例将以挂载方式为例介绍,具体操作步骤如下:

  1. 进入自定义部署页面,详情请参见服务部署

  2. 自定义部署页面,配置以下关键参数,更多参数配置说明,请参见控制台自定义部署参数说明

    参数

    描述

    环境信息

    运行命令

    增加执行代码的命令,例如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所在regionEndpoint。
        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所在regionEndpoint。因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所在regionEndpoint。
        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所在RegionEndpoint。因EAS默认不通公网,此处应配置内网Endpoint地址(例如https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api)。如果需要使用公网Endpoint(例如https://service.cn-hangzhou.maxcompute.aliyun.com/api),则需为EAS配置具有公网访问能力的专有网络,详情请参见配置网络连通

    三方库配置

    配置以下三方库列表,来安装阿里云Credentials工具、PyODPS SDKOSS SDK。

    alibabacloud_credentials
    pyodps
    oss2
    说明

    如果镜像中已预装此库,该配置步骤可省略。

    服务配置

    PAI默认角色为例,在服务配置区域JSON中添加以下配置:

    "options": {
            "enable_ram_role": true
        }
    说明

    如果使用JSON直接部署,并且希望通过PAI默认角色调用OSS SDK时,需要确保服务配置中包含metadata.workspace_id字段。

  3. 参数配置完成后,单击部署

    服务部署成功后,您可以在服务日志中查看运行结果。

常见问题

部署EAS服务时配置自定义RAM角色报错,应如何解决?

  • 报错信息:image

    登录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)页面,单击服务名称,然后切换到部署事件页签进行查看。如下图所示:image

    该问题一般是由于您的角色未配置信任策略。您可以按照以下操作步骤为您的角色添加信任策略:

    1. 使用RAM管理员登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 角色

    3. 角色页面,单击目标RAM角色名称。

    4. 信任策略页签,单击编辑信任策略,添加信任"eas.pai.aliyuncs.com"

    5. 在编辑器中修改信任策略内容,然后单击确定

      假设该角色原始的信任策略为:

      {
        "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"
      }