DSW/DLC/EAS 挂载跨主账号 OSS

更新时间:
复制 MD 格式

PAI DSW/DLC/EAS 实例可挂载其他阿里云主账号的 OSS Bucket。通过 Bucket Policy(OSS 侧授权)或 RAM 角色(RAM 侧授权)实现。本文说明两种方案的配置步骤和差异。

说明

本文以 DSW 为例,DLC/EAS 的操作方式相同。EAS 信任的云服务为eas.pai.aliyuncs.com

方案概述

场景:主账号 A 拥有 OSS Bucket,主账号 B 的 PAI DSW 实例需挂载该 Bucket。

核心原理:跨账号挂载的本质是让 B 的 DSW 实例有权限访问 A 的 OSS。两种方案都通过 RAM 角色实现:创建 DSW 实例时指定一个角色,DSW 服务扮演该角色访问 OSS。差异在于角色由谁创建以及权限授予方式

  • 方案一:Bucket Policy 授权(推荐)——B 创建角色,A 在 OSS 侧通过 Bucket Policy 允许该角色访问。

  • 方案二:RAM 角色授权——A 创建角色并授予 OSS 权限,同时信任 B 的 PAI 服务扮演。

具体差异对比如下:

方案一:Bucket Policy 授权(推荐)

方案二:RAM 角色授权

角色创建

账号 B 创建

账号 A 创建

权限配置

A 在 OSS 控制台配置 Bucket Policy

A 在 RAM 控制台给 RAM 角色授予 OSS 权限

授权粒度

单个 Bucket 维度,多 Bucket 需逐个配置

角色维度,一条权限策略可覆盖多个 Bucket

适用场景

Bucket 数量少,A 希望在 OSS 侧直接管理访问授权

Bucket 数量多,或需要多账号复用同一角色集中管理权限

操作步骤

一、创建 RAM 角色并授权

方案一:Bucket Policy 授权(推荐)

1. 账号 B 创建 RAM 角色

账号 B 创建可信实体为云服务的 RAM 角色。DSW 服务将扮演该角色访问 A 的 OSS。

  1. 登录RAM控制台,在左侧导航栏,选择身份管理 > 角色

  2. 单击创建角色

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

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

  3. 单击确定,填写角色名称(如oss-access),再次确定

生成的信任策略允许 PAI 服务扮演该角色:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": ["pai.aliyuncs.com"]
      }
    }
  ],
  "Version": "1"
}

2. 账号 A 配置 Bucket Policy 授权

操作步骤如下,详细说明参考 OSS 文档:Bucket Policy

  1. 账号 A 登录OSS管理控制台,在Bucket 列表中单击目标 Bucket。

  2. 在左侧菜单栏单击权限控制 > Bucket 授权策略

  3. 选择按图形策略添加,单击新增授权,按实际需要添加授权规则。注意:

    • 授权用户:选择其他账号

    • 在文本框中填写 PAI 服务扮演 RAM 角色后获得的临时身份 ARN,格式:

      arn:sts::<B的阿里云UID>:assumed-role/<B角色名称>/*

方案二:RAM 角色授权

1. 账号 A 创建 RAM 角色

账号 A 创建信任账号 B 下 PAI 服务的 RAM 角色。B 的 DSW 服务将扮演该角色访问 A 的 OSS。

  1. 登录RAM控制台,在左侧导航栏,选择身份管理 > 角色

  2. 单击创建角色,在页面右上角选择切换编辑器

  3. 可视化编辑模式下,主体选择云服务,单击编辑添加主体:

    • 云账号选择其他云账号,并输入 B 账号的 UID。

    • 云服务选择人工智能平台 PAI / PAI pai.aliyuncs.com。(在 EAS 中挂载请选择 eas.pai.aliyuncs.com)

  4. 单击确定,填写角色名称(如oss-access-for-B),再次确定

  5. 创建完成后,在角色详情页复制 ARN 给账号 B。B 将使用该 ARN 挂载 OSS。格式为:

    acs:ram::<A-账号UID>:role/<角色名>

生成的信任策略如下:

{
  "Statement": [
    {
      "Action": [
        "sts:AssumeRole"
      ],
      "Effect": "Allow",
      "Principal": {
        "Service": "<B-账号UID>@pai.aliyuncs.com"
      }
    }
  ]
}
可按需添加其他主体。

2. 账号 A 为角色授予 OSS 权限

为刚创建的角色 oss-access-for-B 添加如下权限策略:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:GetObject",
        "oss:ListObjects",
        "oss:PutObject",
        "oss:DeleteObject"
      ],
      "Resource": [
        "acs:oss:*:<A-账号UID>:<bucket名称>",
        "acs:oss:*:<A-账号UID>:<bucket名称>/*"
      ]
    }
  ]
}
按实际需要调整 Action 范围。只读场景只保留 GetObjectListObjects

二、创建 DSW 实例并挂载 OSS

  1. 授权(仅适用 RAM 用户)

    如果使用 RAM 用户(阿里云子账号)创建 DSW 实例,请让阿里云主账号为其授权。RAM 用户默认没有将角色交给云服务扮演的权限。

    具体操作请参见管理RAM用户的权限。自定义权限策略示例如下:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ram:PassRole",
          "Resource": "acs:ram::<角色所属的主账号id>:role/<角色名称>"
        }
      ]
    }

    其中,<角色所属的主账号id><角色名称> 替换为刚创建的 RAM 角色名称和所属主账号 ID。

  2. 创建 DSW 实例并挂载 OSS

    方式一:通过 PAI 控制台(推荐)

    1. 登录PAI控制台,在左侧导航栏,选择模型开发与训练 > 交互式建模(DSW)

      如有多个工作空间,请选择目标工作空间。
    2. 单击新建实例,在环境信息区域的存储挂载选择 OSS。

    3. 选择 OSS 挂载,填入 A 的 Bucket 路径:

      • Uri:填入 A 的 Bucket 路径,格式为 oss://{bucket-name}.oss-{region}-internal.aliyuncs.com/{path}/

      • 挂载路径:如 /mnt/data

      • RAM 角色选择已被 A 授权的角色。该角色决定 DSW 以谁的权限访问 A 的 OSS。

        若下拉列表无选项,请手动输入 ARN。

    方式二:通过 API / CLI 创建

    调用 CreateInstance API,在 Datasets 参数中指定 RoleArn

    aliyun pai-dsw create-instance \
      --region cn-hangzhou \
      --workspace-id {B的工作空间ID} \
      --instance-name cross-account-oss-demo \
      --ecs-spec ecs.gn6v-c8g1.2xlarge \
      --image-url registry.cn-hangzhou.aliyuncs.com/pai-dlc/pytorch-training:2.0-gpu-py310-cu118-ubuntu20.04 \
      --accessibility PRIVATE \
      --datasets '[{
        "Uri": "oss://{ABucket名称}.oss-cn-hangzhou-internal.aliyuncs.com/data/",
        "MountPath": "/mnt/data",
        "MountAccess": "RO",
        "RoleArn": "<有OSS访问权限的RAM角色>" 
      }]'
    

    关键参数说明

    参数

    说明

    Uri

    账号 A 的 OSS Bucket 路径。使用 内网域名oss-{region}-internal.aliyuncs.com),内网传输免流量费。

    MountPath

    容器内挂载路径,如 /mnt/data

    MountAccess

    RO = 只读,RW = 读写。

    RoleArn

    DSW 服务要扮演的角色 ARN。

    • 方案一:账号 B 下的 RAM 角色 ARN,如acs:ram::<B的阿里云UID>:role/<角色名称>

    • 方案二:账号 A 下的 RAM 角色 ARN,如acs:ram::<A的阿里云UID>:role/<角色名称>

三、验证

DSW 实例启动后,进入 Terminal,检查挂载是否成功:

ls /mnt/data

如果能看到 A 账号 OSS Bucket 中的文件,跨账号挂载成功。

注意事项

  • 最小权限:只授予必要的 Bucket 和 Action 权限。只读场景只给 GetObjectListObjects

  • 使用内网域名:Uri 中使用 -internal 域名,避免公网流出流量费用。

  • RoleArn 也可用于更新:已有实例可通过 UpdateInstance 修改 Datasets 配置来添加 RoleArn。

  • 与 Options 的关系:如需配置 JindoFuse 参数(如缓存策略),可通过 Options 字段设置,与 RoleArn 可同时使用。

  • 定期审计:在 RAM 控制台查看角色的访问记录,确认无异常使用。

常见问题

问题

原因

解决

挂载后 ls 报 Permission Denied

Bucket Policy 未正确配置,或 Principal 写错

检查 Bucket Policy 中 Principal 是否精确指向 B 的角色 ARN

DSW 实例启动失败,报 RoleArn 相关错误

B 的角色信任策略未包含 pai.aliyuncs.com

在角色信任策略中添加 PAI 服务

只能读不能写

OSS 权限只给了 GetObject

添加 PutObject、DeleteObject 等写入 Action

挂载路径为空

Uri 路径不存在,或没有对应前缀对象

确认 OSS 中该路径下确实有文件,且路径以 / 结尾