当您需要跨项目访问资源(对象)时,如果未被加入目标资源所属项目,您无法直接访问资源。MaxCompute提供了Package授权机制,可以将资源及相应权限打包为Package,其他项目安装此Package后,即可解决跨项目访问资源问题。本文为您介绍Package授权操作并提供示例供参考。

背景信息

假设某个阿里云账号下有多个MaxCompute项目,其中项目A里有一批表、资源文件、自定义函数需要分享给其他项目使用。通常您可以使用如下方法实现资源分享:
  • 将其他项目中需要使用资源的用户都添加到A项目,并逐个执行授权操作。但该方法比较繁琐,不推荐在跨项目访问资源场景下使用。仅当需要精细控制资源由单人使用,且申请人是本业务项目团队成员时,建议使用该方式。更多授权语法信息,请参见ACL权限控制
  • 基于Package实现跨项目资源分享。

    Package是一种跨项目共享数据及资源的机制。A项目的所有者对其他项目需要使用的资源进行打包(也就是创建Package),然后许可其他项目安装此Package。其他项目的所有者安装Package之后,就可以自行管理Package是否需要进一步授权给自己项目下的用户。完整实现流程如下。

    Package使用流程
由上述流程可知,使用Package涉及两个主体,Package主体信息及主体可执行的操作如下。
主体 说明 可执行的操作 主体角色 操作入口
Package创建者 所在的项目是资源提供方。将需要分享的资源及其操作权限进行打包,然后许可Package使用者安装使用。 创建Package 资源所属项目的项目所有者(Project Owner)或具备资源所属项目的项目级别Super_Administrator角色的用户。
将资源添加至Package
删除Package中的资源
许可其他项目使用Package
撤销其他项目使用Package的许可
删除Package
查看Package列表
查看Package的详细信息
Package使用者 所在的项目是资源使用方。安装了资源提供方创建的Package之后,便可以直接跨项目访问资源。 安装Package 使用资源的项目的所有者(Project Owner)或具备使用资源项目的项目级别Super_Administrator和Admin角色的用户。
查看安装的Package的详细信息
为用户或角色授予访问Package的权限
卸载Package

使用限制

Package的使用限制如下:
  • 一个Package中最多可以包含1000个资源。
  • 一个Package最多允许安装至10万个MaxCompute项目中。
  • 一个MaxCompute项目最多可以从另外一个MaxCompute项目安装100个Package。
  • 一个MaxCompute项目最多可以创建10万个Package。
  • 一个MaxCompute项目最多可以安装10万个Package。

创建Package

资源提供方在MaxCompute项目中创建Package。

  • 命令格式
    create package <package_name>;
  • 参数说明
    参数名称 是否必填 说明
    package_name 指定Package的名称,项目内唯一。长度不超过128个字符,可以包含字母、下划线(_)或数字。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    假设Bob@aliyun.com是test_project_a的项目所有者,现需要允许其他项目访问test_project_a中的部分资源。创建Package,命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --创建Package。
    create package datashare;

将资源添加至Package

将资源使用方需要的资源添加至创建的Package中。

  • 命令格式
    add <object_type> <object_name> to package <package_name> [with privileges <privileges>];
  • 使用限制

    不支持添加Project类型对象至Package。

  • 注意事项

    资源添加到Package时,并非是以快照形式打包。后续资源数据变更时,通过Package访问的是资源的最新数据。

  • 参数说明
    参数名称 是否必填 说明
    object_type 指定待添加的资源类型,即对象类型。单次添加只能指定一个对象。

    对象取值请参见权限列表

    object_name 指定资源的名称。获取方式如下:
    • 表名称:您可以通过MaxCompute客户端执行show tables;命令获取表或视图名称。
    • 资源文件名称:您可以通过MaxCompute客户端执行list resources;命令获取资源名称。
    • 函数名称:您可以通过MaxCompute客户端执行list functions;命令获取函数名称。
    • 实例名称:您可以通过MaxCompute客户端执行show instances;命令获取实例名称。
    说明
    • 添加资源时,支持使用通配符星号(*)。例如add table * to package package_name;表示将所有表添加至Package。
    • 添加资源时,资源名称不能加项目名前缀。例如,项目为A,需要添加A中的表table到某个Package中,则执行添加操作时,资源名不能写为A.table,应该直接写为table。
    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

    privileges 指定对资源的操作权限。当未指定操作权限时,默认为Read、Describe、Select权限。资源及其权限被看作一个整体,添加后不可更新。如果需要更新,只能删除Package关联的资源后重新添加资源及权限。

    操作取值请参见权限列表

  • 使用示例

    将test_project_a项目中的资源udtf.jar、表sale_detail和bank_data添加至Package中。命令示例如下。

    --将资源添加至Package。
    add Resource udtf.jar to package datashare;
    add Table sale_detail to package datashare;

删除Package中的资源

删除Package中已添加的资源。

  • 命令格式
    remove <object_type> <object_name> from package <package_name>; 
  • 参数说明
    参数名称 是否必填 说明
    object_type 指定待删除的资源类型,即对象类型。单次删除只能指定一个对象。

    对象取值请参见权限列表

    object_name 指定资源的名称。获取方式如下:
    • 表名称:您可以通过MaxCompute客户端执行show tables;命令获取表或视图名称。
    • 资源文件名称:您可以通过MaxCompute客户端执行list resources;命令获取资源名称。
    • 函数名称:您可以通过MaxCompute客户端执行list functions;命令获取函数名称。
    • 实例名称:您可以通过MaxCompute客户端执行show instances;命令获取实例名称。
    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    删除Package datashare中已添加的表sale_detail,命令示例如下。

    --删除Package中的资源。
    remove Table sale_detail from package datashare;

许可其他项目使用Package

资源提供方授予其他项目使用Package的权限。

  • 命令格式
    allow project <project_name> to install package <package_name> [using label <number>];
  • 参数说明
    参数名称 是否必填 说明
    project_name 指定可使用Package的MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

    number 用于增加一个Label权限控制策略,指定允许资源使用方访问的敏感数据等级。被授权的MaxCompute项目可以访问Package,但仅能访问敏感等级小于等于number的数据。不指定时,默认为0级。

    更多Label权限控制信息,请参见Label权限控制

  • 使用示例

    允许test_project_b项目安装test_project_a中已创建的Package datashare。命令示例如下。

    --许可test_project_b安装Package。
    allow project test_project_b to install package datashare;

撤销其他项目使用Package的许可

资源提供方撤销授予其他项目使用Package的权限。

  • 命令格式
    disallow project <project_name> to install package <package_name>;
  • 参数说明
    参数名称 是否必填 说明
    project_name 指定待撤销访问Package权限的MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    撤销test_project_b项目可以安装test_project_a中的Package datashare的权限。命令示例如下。

    --撤销Package授权许可。
    disallow project test_project_b to install package datashare;

删除Package

删除已创建的Package。

  • 命令格式
    delete|drop package <package_name>;
  • 注意事项

    删除Package会清除通过这个Package授予的权限信息。

  • 参数说明
    参数名称 是否必填 说明
    package_name 指定待删除Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    删除test_project_a中已创建的Package datashare。命令示例如下。

    --删除Package。
    drop package datashare;

查看Package列表

在MaxCompute项目中查看已创建或已安装的Package列表。

  • 命令格式
    show packages;
  • 使用示例

    查看test_project_a项目中创建或安装的Package信息。命令示例如下。

    --查看Package列表。
    show packages;
    返回结果如下。包含如下信息:
    • 创建或安装Package的名称(PackageName)
    • 创建时间(CreateTime)
    • Package所属MaxCompute项目(SourceProject)
    • 安装时间(InstallTime)
    • 状态(Status)
    +-------------+--------------------------+
    | PackageName | CreateTime               |
    +-------------+--------------------------+
    | datashare   | 2021-12-28T18:10:39+0800 |
    +-------------+--------------------------+
    +-------------+--------------------+--------------------------+--------+
    | PackageName | SourceProject      | InstallTime              | Status |
    +-------------+--------------------+--------------------------+--------+
    | systables   | information_schema | 2020-11-24T14:11:23+0800 | OK     |
    +-------------+--------------------+--------------------------+--------+

查看Package的详细信息

在MaxCompute项目中查看已创建的Package详细信息。

  • 命令格式
    describe package <package_name>;
  • 参数说明
    参数名称 是否必填 说明
    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    查看test_project_a项目中Package datashare包含的资源及权限信息。命令示例如下。

    --查看Package详情。
    describe package datashare;
    返回结果如下。包含如下信息:
    • Package创建时间(CreateTime)
    • Package的名称(PackageName)
    • Package所属MaxCompute项目(SourceProject)
    • Package资源类型(ObjectType)
    • Package资源名称(ObjectName)
    • Package资源权限(ObjectPrivileges)
    • 允许安装Package的项目(ProjectName)
    • 许可访问等级(UserLabel)
    CreateTime:         2021-12-28T18:10:39+0800
    PackageName:        datashare
    SourceProject:      test_project_a
    
    Object List
    +--------------+------------------------------------------+------------------+
    | ObjectType   | ObjectName                               | ObjectPrivileges |
    +--------------+------------------------------------------+------------------+
    | RESOURCE     | udtf.jar                                 | Read             |
    +--------------+------------------------------------------+------------------+
    | TABLE        | sale_detail                              | Describe,Select  |
    +--------------+------------------------------------------+------------------+
    
    Allowed Project List
    +-----------------+-----------+
    | ProjectName     | UserLabel |
    +-----------------+-----------+
    | test_project_b  | 0         |
    +-----------------+-----------+

安装Package

在目标MaxCompute项目中安装Package。

  • 命令格式
    install package <project_name>.<package_name>;
  • 注意事项

    Package会展开安装,安装完成后,您可以执行show packages; 命令查询到安装的Package,通过describe package <package_name>; 命令查看Package内的资源及权限信息。

  • 参数说明
    参数名称 是否必填 说明
    project_name 指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    在test_project_b项目中安装test_project_a项目的Package datashare,假设Amy@aliyun.com为test_project_b的项目所有者。命令示例如下。

    --Amy进入项目test_project_b。
    use test_project_b; 
    --安装Package。
    install package test_project_a.datashare;

查看安装的Package的详细信息

在MaxCompute项目中查看已安装的Package详细信息。

  • 命令格式
    describe package <project_name>.<package_name>;
  • 参数说明
    参数名称 是否必填 说明
    project_name 指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    查看test_project_b项目中安装的Package datashare包含的资源及权限信息。命令示例如下。

    --查看Package详情。
    describe package test_project_a.datashare;
    返回结果如下。包含如下信息:
    • Package创建时间(CreateTime)
    • Package的名称(PackageName)
    • Package所属MaxCompute项目(SourceProject)
    • Package资源类型(ObjectType)
    • Package资源名称(ObjectName)
    • Package资源权限(ObjectPrivileges)
    CreateTime:         2021-12-28T18:10:39+0800
    PackageName:        datashare
    SourceProject:      test_project_a
    
    Object List
    +--------------+------------------------------------------+------------------+
    | ObjectType   | ObjectName                               | ObjectPrivileges |
    +--------------+------------------------------------------+------------------+
    | RESOURCE     | udtf.jar                                 | Read             |
    +--------------+------------------------------------------+------------------+
    | TABLE        | sale_detail                              | Describe,Select  |
    +--------------+------------------------------------------+------------------+

为用户或角色授予访问Package的权限

在安装Package的MaxCompute项目中为用户或角色授予访问Package的权限。

被安装的Package是一种独立的MaxCompute对象类型。如果要访问Package里的资源,您必须拥有该Package的Read权限。如果请求者没有Read权限,可以由项目所有者、具备Super_Administrator或Admin角色的用户通过ACL权限控制方案完成授权。

  • 命令格式
    grant <actions> on package <project_name>.<package_name> to {USER|ROLE} <name>;
  • 注意事项

    授权后,用户或角色仅在安装Package的项目中有权限访问Package中的资源。如果需要精细化管控Package的权限,请参见Package的权限控制

  • 参数说明
    参数名称 是否必填 说明
    actions 指定对资源的操作权限。固定取值为Read。
    project_name 指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

    name 指定被授权的用户账号或角色名称。单次授权只能指定一个用户或角色。

    您可以通过MaxCompute客户端执行list users;list roles;命令获取用户账号或角色名称。

  • 使用示例

    假设Bella为隶属于Amy@aliyun.com的RAM用户,现需要为Bella授予Package的访问权限。命令示例如下。

    --允许Bella访问Package。
    grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella;

撤销为用户或角色授予的访问Package的权限

在安装Package的MaxCompute项目中撤销为用户或角色授予的访问Package的权限。

  • 命令格式
    revoke <actions> on package <project_name>.<package_name> from {USER|ROLE} <name>;
  • 参数说明
    参数名称 是否必填 说明
    actions 指定对资源的操作权限。固定取值为Read。
    project_name 指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

    name 指定待撤销授权的用户账号或角色名称。单次撤销授权只能指定一个用户或角色。

    您可以通过MaxCompute客户端执行list users;list roles;命令获取用户账号或角色名称。

  • 使用示例

    撤销为Bella授予的Package访问权限。命令示例如下。

     --撤销允许Bella访问Package的权限。
    revoke Read on package test_project_a.datashare from user RAM$Amy@aliyun.com:Bella;

卸载Package

为目标MaxCompute项目卸载已安装的Package。

  • 命令格式
    uninstall package <project_name>.<package_name>;
  • 参数说明
    参数名称 是否必填 说明
    project_name 指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name 指定Package的名称。

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

  • 使用示例

    卸载test_project_b项目中已安装的Package datashare。命令示例如下。

    --卸载Package。
    uninstall package test_project_a.datashare;

Package使用示例

假设Bob是项目test_project_a的所有者。Amy是项目test_project_b的所有者。由于业务需要,Bob希望将其项目test_project_a中的某些资源(例如udtf.jar及表sale_detail)分享给Amy的项目test_project_b。且项目test_project_b的用户RAM$Amy@aliyun.com:Bella需要访问这些资源。以MaxCompute客户端操作为例,操作流程如下:
  1. Bob进入项目test_project_a中创建Package。
    --Bob进入项目test_project_a。
    use test_project_a; 
    --创建Package。
    create package datashare;
  2. Bob为新创建的Package添加资源。
    --将资源添加至Package。
    add Resource udtf.jar to package datashare;
    add Table sale_detail to package datashare;
  3. Bob允许项目test_project_b安装Package。
    --许可test_project_b安装Package。
    allow project test_project_b to install package datashare;
  4. Amy进入项目test_project_b中安装Package。
    --进入test_project_b。
    use test_project_b;
    --安装Package。
    install package test_project_a.datashare; 
    --查看Package中的资源列表。
    describe package test_project_a.datashare; 
    --返回结果如下。
    CreateTime:         2021-12-28T18:10:39+0800
    PackageName:        datashare
    SourceProject:      test_project_a
    
    Object List
    +--------------+------------------------------------------+------------------+
    | ObjectType   | ObjectName                               | ObjectPrivileges |
    +--------------+------------------------------------------+------------------+
    | RESOURCE     | udtf.jar                                 | Read             |
    +--------------+------------------------------------------+------------------+
    | TABLE        | sale_detail                              | Describe,Select  |
    +--------------+------------------------------------------+------------------+
  5. Amy为Bella授予访问Package的权限。
    -授权Bella访问Package。
    grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella; 

后续指引

完成Package创建及安装后,您可以根据实际业务需要执行如下操作: