当您需要跨项目(包含跨账号)访问资源(对象)时,如果未被加入目标资源所属项目,您无法直接访问资源。MaxCompute提供了Package授权机制,可以将资源及相应权限打包为Package,其他项目安装此Package后,即可解决跨项目访问资源问题。本文为您介绍Package授权操作并提供示例供参考。
背景信息
假设某个阿里云账号下有多个MaxCompute项目,其中项目A里有一批表、资源文件、自定义函数需要分享给其他项目使用,或需要分享给其他阿里云账号内的项目使用。通常您可以使用如下方法实现资源分享:
将其他项目中需要使用资源的用户都添加到A项目,并逐个执行授权操作。但该方法比较繁琐,不推荐在跨项目访问资源场景下使用。仅当需要精细控制资源由单人使用,且申请人是本业务项目团队成员时,建议使用该方式。更多授权语法信息,请参见ACL权限控制。
基于Package实现跨项目资源分享。
Package是一种跨项目共享数据及资源的机制。A项目的所有者对其他项目需要使用的资源进行打包(也就是创建Package),然后许可其他项目安装此Package。其他项目的所有者安装Package之后,就可以自行管理Package是否需要进一步授权给自己项目下的用户。完整实现流程如下。
由上述流程可知,使用Package涉及两个主体,Package主体信息及主体可执行的操作如下。
主体 | 说明 | 可执行的操作 | 主体角色 | 操作入口 |
Package创建者 | 所在的项目是资源提供方。将需要分享的资源及其操作权限进行打包,然后许可Package使用者安装使用。 | 资源所属项目的项目所有者(Project Owner)或具备资源所属项目的项目级别Super_Administrator角色的用户。 | ||
Package使用者 | 所在的项目是资源使用方。安装了资源提供方创建的Package之后,便可以直接跨项目访问资源。 | 使用资源的项目的所有者(Project Owner)或具备使用资源项目的项目级别Super_Administrator和Admin角色的用户。 | ||
使用限制
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客户端操作为例,操作流程如下:
Bob进入项目test_project_a中创建Package。
--Bob进入项目test_project_a。 use test_project_a; --创建Package。 create package datashare;
Bob为新创建的Package添加资源。
--将资源添加至Package。 add Resource udtf.jar to package datashare; add Table sale_detail to package datashare;
Bob允许项目test_project_b安装Package。
--许可test_project_b安装Package。 allow project test_project_b to install package datashare;
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 | +--------------+------------------------------------------+------------------+
Amy为Bella授予访问Package的权限。
-授权Bella访问Package。 grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella;
后续指引
完成Package创建及安装后,您可以根据实际业务需要执行如下操作:
相关文档
使用CLONE TABLE实现不同账号同地域的MaxCompute跨项目数据迁移,请参见使用CLONE TABLE实现同地域MaxCompute跨项目数据迁移。
不同地域间MaxCompute项目数据迁移(包含同账号和不同账号两种场景),请参见通过跨项目数据访问实现不同地域MaxCompute项目数据迁移。
使用DataWorks实现所有场景的MaxCompute跨项目数据迁移,请参见MaxCompute数据源。