配置DSW实例RAM角色

当您在DSW实例内访问其他云资源时,必须配置访问密钥来验证身份信息。通过为DSW实例关联RAM角色,您可以在实例内基于STS临时凭证访问其他云资源,无需再配置长期AccessKey,降低密钥泄露的风险。本文为您介绍如何创建可信实体为阿里云服务的RAM角色并授权给DSW实例,以及如何基于实例RAM角色获取STS临时访问凭证。

背景信息

实例RAM角色是一种可信实体为阿里云服务的RAM角色,即允许云服务扮演的角色,用于解决跨服务访问的问题。关于RAM角色的详细说明,请参见什么是RAM角色

基于实例RAM角色获取临时访问凭证来验证身份信息和访问权限控制,具有以下优势:

  • 安全保密

    无需在实例内管理凭据,使用STS临时访问凭证替代长期AccessKey,降低密钥泄露风险。

  • 便捷可控

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

使用限制

一个DSW实例现只能关联一个RAM角色。

步骤一:DSW实例配置RAM角色

场景一:为实例授权PAI默认角色

PAI默认角色仅拥有访问PAI内部产品、MaxComputeOSS的权限,且权限更加精细。基于PAI默认角色签发的临时访问凭证,在访问PAI内部产品、MaxCompute表时,将拥有等同于DSW实例所有者的权限;在访问OSS时,仅能访问当前工作空间配置的默认存储路径Bucket。

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

为实例授权PAI默认角色后,以下场景的用户可以免配置AK:

  • 通过PAI SDK创建训练任务提交至当前工作空间。

  • 通过DLC SDK创建训练任务提交至当前工作空间。

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

  • 通过OSS SDK访问当前工作空间配置的默认存储路径Bucket中的数据。

  • WebIDE中使用通义灵码服务。

image

场景二:为实例授权自定义角色

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

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

    • 角色类型阿里云服务

    • 角色类型普通服务角色

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

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

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

    (可选)PAI默认角色的RAM策略如下,您可以基于该策略进行添加或修改。

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "oss:GetObject",
                    "oss:PutObject",
                    "oss:DeleteObject",
                    "oss:ListParts",
                    "oss:AbortMultipartUpload",
                    "oss:ListObjects",
                    "oss:ListBuckets",
                    "oss:PutBucketCors",
                    "oss:GetBucketCors",
                    "oss:DeleteBucketCors",
                    "oss:GetBucketInfo"
                ],
                "Resource": [
                    "acs:oss:*:*:${bucketName}",
                    "acs:oss:*:*:${bucketName}/*"
                ],
                "Effect": "Allow"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "odps:ActOnBehalfOfAnotherUser"
                ],
                "Resource": "acs:odps:*:*:users/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "pai:AssumeUser"
                ],
                "Resource": "acs:pai:*:*:users/*"
            }
        ]
    }
    
    说明

    若您使用的是RAM用户(子账号),请联系阿里云账号(主账号)为您授予使用该实例RAM角色的权限。

    权限策略请参见如下代码,其中,需要将${RoleName}替换为DSW实例RAM角色的名称。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ram:PassRole",
          "Resource": "acs:ram::*:role/${RoleName}"
        }
      ]
    }
  3. 创建DSW实例并关联实例RAM角色。具体操作,请参见创建DSW实例

    image

场景三:实例不关联RAM角色

如果您的实例设置为工作空间公开可见,建议不要为实例关联RAM角色,避免权限泄露。您可以在新建实例或变更实例配置时,将高级信息区域的实例RAM角色设置为不关联角色

image

更新实例RAM角色配置

  1. 进入DSW页面。

    1. 登录PAI控制台

    2. 概览页面选择目标地域。

    3. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    4. 在工作空间页面的左侧导航栏选择模型开发与训练>交互式建模(DSW),进入DSW页面。

  2. 单击DSW实例右侧的变更配置

  3. 高级信息区域配置实例RAM角色。

    说明

    当实例RAMPAI默认角色/自定义角色切换为不关联角色,或由不关联角色切换为PAI默认角色/自定义角色时,如果实例正在运行中,更新操作会立即重启实例。请确保您已及时保存实例。

  4. 完成配置后,单击确定

步骤二:基于实例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角色访问ODPS

  1. 执行如下命令,安装Credentials工具和ODPS SDK。

    # 安装credentials工具
    pip install alibabacloud_credentials
    # 安装odps sdk
    pip install odps
  2. 使用实例RAM角色的临时凭证访问ODPS,并获取指定项目的table列表。

    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)

示例二:基于实例RAM角色访问OSS

  1. 执行如下命令,安装Credentials工具和OSS SDK。

    # 安装credentials工具
    pip install alibabacloud_credentials
    # 安装oss sdk
    pip install oss2
  2. 使用实例RAM角色的临时凭证访问OSS,并列举指定Bucket下的10个文件。

    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)

示例三:基于实例RAM角色访问DLC

  1. 执行如下命令,安装Credentials工具、OpenAPI SDKDLC SDK。

    # 安装credentials工具
    pip install alibabacloud_credentials
    # 安装阿里云openapi sdk
    pip install alibabacloud-tea-util alibabacloud_tea_openapi
    # 安装pai-dlc sdk
    pip install alibabacloud_pai_dlc20201203
  2. 使用实例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}' #需替换为您所在regionendpoint
    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])

常见问题

选择自定义角色时,创建实例报错PassRoleFailedError,应如何解决?

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

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

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

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

选择自定义角色时,创建实例报错AssumeRoleFailedError,应如何解决?

该问题的原因,一般由于是您的角色未配置信任策略。请按照如下步骤进行操作:

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