配置DLC RAM角色

当您在DLC任务中访问其他云资源时,必须配置访问密钥来验证身份信息。通过为DLC任务关联RAM角色,您可在任务内基于STS临时凭证访问其他云资源,无需再配置长期AccessKey,减少密钥泄漏的风险。本文主要介绍如何创建RAM角色并授权给DLC,以及如何基于RAM角色获取STS临时访问凭证。

功能优势

RAM角色是一种可信实体为阿里云服务的RAM角色,即允许云服务扮演的角色,用于解决“跨服务访问”的问题。基于RAM角色获取临时访问凭证来验证身份信息和访问权限控制,具有以下优势:

  • 安全保密:无需在任务内管理凭据,使用STS临时访问凭证替代长期AccessKey,减少密钥泄露风险。

  • 便捷可控:通过修改DLC任务的RAM角色的权限策略,可更便捷、更精细地控制各开发者在任务内访问云资源时的权限。

使用限制

目前,一个DLC任务只能关联一个RAM角色。

配置方法

在创建DLC任务时,您需要为DLC配置RAM角色,并获取STS临时访问凭证。

DLC配置RAM角色

场景一:为DLC任务授权PAI默认角色

PAI默认角色基于服务角色AliyunPAIDLCDefaultRole运作,仅拥有访问MaxComputeOSS的权限,且权限更加精细。基于PAI默认角色签发的临时访问凭证,在访问MaxCompute表时,将拥有等同于DLC实例所有者的权限;在访问OSS时,仅能访问当前工作空间配置的默认OSS存储空间(Bucket)。

DLC任务授权PAI默认角色能够让您无需额外创建RAM角色,即可在任务内获取一份可访问基本开发资源、且无越权的临时访问凭证。

  • 使用场景

    DLC任务授权PAI默认角色后,您在以下场景无需配置AccessKey:

    • 通过PyODPS SDK提交任务到任务所有者有执行权限的MaxCompute项目中。

    • 通过OSS SDK访问当前工作空间配置的默认OSS存储空间(Bucket)中的数据。如何为工作空间配置默认OSS存储空间,请参见设置工作空间存储路径

  • 配置方法

    在创建DLC任务时,您需要在角色信息区域选择PAI默认角色作为实例RAM角色。具体操作,请参见创建训练任务image

配置RAM角色后,您需要基于DLC关联的RAM角色获取临时访问凭证

场景二:为DLC任务授权自定义角色

PAI默认角色的临时访问凭证权限无法满足您的需求时,您可以自行创建RAM角色并自定义其权限策略,按需控制开发者在任务内可访问的云资源范围。具体操作步骤如下:

  1. 登录RAM控制台,创建RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色

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

    • 选择可信实体类型阿里云服务

    • 角色类型普通服务角色

    • 选择受信服务人工智能平台PAI

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

    将系统策略或者自定义策略授权给RAM角色,使其拥有相关的资源访问或操作权限。具体操作,请参见步骤三:为RAM角色授权。例如授予RAM角色访问OSS的权限AliyunOSSReadOnlyAccess。

    若您使用的是RAM用户(阿里云子账号),请联系阿里云账号(主账号)为您授予使用该RAM角色的权限,具体操作,请参见RAM用户授权。自定义权限策略内容示例如下:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ram:PassRole",
          "Resource": "acs:ram::*:role/${RoleName}"
        }
      ]
    }

    其中${RoleName}需要替换为DLC任务关联的RAM角色名称。

  3. 提交DLC任务并关联RAM角色。您只需在角色信息区域配置以下关键参数,其他参数配置说明,请参见创建训练任务image

    参数

    描述

    实例RAM角色

    选择自定义角色

    RAM角色

    选择在上述步骤中已创建的RAM角色。该任务在基于STS临时凭证访问云产品时,拥有的权限将与该自定义角色的权限保持一致。

配置RAM角色后,您需要基于DLC关联的RAM角色获取临时访问凭证

场景三:DLC任务不关联RAM角色

无需使用密钥访问数据时,建议您不关联角色。您可以在创建DLC任务时,在角色信息区域,选择不关联角色作为实例RAM角色即可。具体操作,请参见创建训练任务image

基于DLC关联的RAM角色获取临时访问凭证

在创建DLC任务时,若为任务分配了PAI默认角色或自定义角色,您可以通过以下方式便捷地获取临时访问凭证:

方式一:通过Credentials工具获取

Credentials工具会调用DLC任务本地的服务(任务创建时已自动注入)获取STS临时访问凭证,该凭证会周期性更新。

在创建DLC任务时,完成以下关键配置,更多配置说明,请参见创建训练任务

  • 安装阿里云Credentials工具。

    三方库配置参数中,选中三方库列表,并在编辑框中配置alibabacloud_credentials,来安装阿里云Credentials工具。

    说明

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

  • 配置脚本文件。

    Python为例,脚本内容示例如下,更多语言SDK示例,请参见使用访问凭据访问阿里云OpenAPI最佳实践。您可以通过代码配置挂载配置,将脚本文件上传至DLC环境中。

    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_credentials.models import Config as CredConfig
    
    credentialsConfig = CredConfig(
        type='credentials_uri'
    )
    credentialsClient = CredClient(credentialsConfig)
    

方式二:直接访问DLC任务本地服务获取

在创建DLC任务时,您可以在启动命令中配置以下命令,访问本地自动注入的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角色的临时授权访问凭证的有效期。

方式三:直接访问任务本地内文件获取

DLC容器中访问指定路径的文件(由PAI自动注入并周期性刷新),获取RAM角色的临时访问凭证。该文件所在的路径为/mnt/.alibabacloud/credentials,文件内容示例如下:

{
	"AccessKeyId": "STS.N*********7",
	"AccessKeySecret": "3***************d",
	"SecurityToken": "DFE32G*******"
	"Expiration": "2024-05-21T10:39:29Z"
}

使用示例

示例一:基于DLCRAM角色访问ODPS

在创建DLC任务时,完成以下关键配置,更多配置说明,请参见创建训练任务

  • 安装阿里云Credentials工具。

    三方库配置参数中,配置以下三方库列表,来安装阿里云Credentials工具和ODPS SDK。

    alibabacloud_credentials
    pyodps
    说明

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

  • 配置脚本文件。

    Python为例,脚本内容示例如下。您可以通过代码配置挂载配置,将脚本文件上传至DLC环境中,并配置挂载路径,例如/mnt/data/

    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所在regionEndpoint
        )
    
        for t in o.list_tables():
            print(t)
    
  • 配置执行命令。

    启动命令配置为执行脚本的命令。例如python /mnt/data/xx.py

  • 配置角色信息。

    实例RAM角色选择PAI默认角色

示例二:基于DLCRAM角色访问OSS

在创建DLC任务时,完成以下关键配置,更多配置说明,请参见创建训练任务

  • 安装阿里云Credentials工具。

    三方库配置参数中,配置以下三方库列表,来安装阿里云Credentials工具和OSS SDK。

    alibabacloud_credentials
    oss2
    说明

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

  • 配置脚本文件。

    Python为例,脚本内容示例如下。您可以通过代码配置挂载配置,将脚本文件上传至DLC环境中,并配置挂载路径,例如/mnt/data/

    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所在regionendpoint
                         '{oss_bucket}'  # 需替换为您的oss bucket名称
             )
    for b in islice(oss2.ObjectIterator(bucket), 10):
        print(b.key)
    
  • 配置执行命令。

    启动命令配置为执行脚本的命令。例如python /mnt/data/xx.py

  • 配置角色信息。

    实例RAM角色选择PAI默认角色

常见问题

创建DLC任务时选择自定义角色报错,应如何解决?

  • 报错信息为check permission for ram role failedcheck permission for sub user failed

    您可以登录RAM控制台,确认该角色是否存在。

    • 若角色不存在,您需将实例RAM角色修改为已存在的角色。

    • 若角色存在,您需联系主账号,为您的子账号授予使用该角色的权限,详情请参见RAM用户授权。自定义权限策略如下(需将${RoleName}替换为RAM角色的名称):

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "ram:PassRole",
            "Resource": "acs:ram::*:role/${RoleName}"
          }
        ]
      }
  • 报错信息为Failed to assume role for user

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

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

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

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

    4. 信任策略页签,单击编辑信任策略

    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",
                "pai.aliyuncs.com" 
              ]
            }
          }
        ],
        "Version": "1"
      }