あるプロジェクトのメンバーでない場合、プロジェクトをまたいで (アカウントをまたぐ場合も含む) リソースに直接アクセスすることはできません。この問題を解決するため、MaxCompute はパッケージベースのアクセス制御メカニズムを提供しています。このメカニズムでは、リソースと権限をパッケージにバンドルし、他のプロジェクトがそのパッケージをインストールすることで、クロスプロジェクトアクセスが可能になります。このトピックでは、パッケージアクセス制御の使用方法と使用例について説明します。
背景情報
本トピックでは、ある Alibaba Cloud アカウントが複数の MaxCompute プロジェクトを所有し、プロジェクト A の特定のテーブル、リソースファイル、ユーザー定義関数 (UDF) を、そのアカウントの他のプロジェクトや、別の Alibaba Cloud アカウントのプロジェクトと共有する必要があるケースについて説明します。以下のいずれかの方法で、リソースを他のプロジェクトと共有できます:
-
他のプロジェクトのユーザーをプロジェクト A に追加し、各ユーザーにリソースへのアクセス権限を付与します。この方法は複雑です。プロジェクト間のリソースアクセスシナリオでは、この方法を使用しないことを推奨します。プロジェクトチームのメンバーに対してきめ細かいリソースのアクセスコントロールが必要な場合にのみ、この方法を使用することを推奨します。認可コマンドの構文の詳細については、「ACL ベースのアクセスコントロール」をご参照ください。
-
パッケージベースのアクセスコントロールメカニズムを使用します。
パッケージベースのアクセスコントロールメカニズムは、プロジェクト間でデータとリソースを共有するために使用されます。プロジェクト A の所有者は、他のプロジェクトが必要とするリソースとそれらのリソースに対する操作権限をパッケージ化し、他のプロジェクトの所有者にパッケージをインストールする権限を付与します。パッケージがインストールされると、他のプロジェクトの所有者は、自プロジェクトのユーザーにパッケージ内のリソースへのアクセスを許可するかどうかを決定できます。次の図は、パッケージベースのアクセスコントロールメカニズムの実装方法を示しています。

上の図は、パッケージベースのアクセスコントロールメカニズムには、パッケージ作成者とパッケージユーザーという 2 つのエンティティが関与することを示しています。次の表では、各エンティティと、そのエンティティが実行できる操作について説明します。
|
エンティティ |
説明 |
実行可能な操作 |
エンティティのロール |
操作プラットフォーム |
|
パッケージ作成者 |
パッケージ作成者が所属するプロジェクトは、共有するリソースを提供します。パッケージ作成者は、共有するプロジェクトリソースとそれらのリソースに対する操作権限をパッケージ化し、他のプロジェクトにパッケージのインストールとパッケージ内のリソースにアクセスする権限を付与します。 |
リソースが属するプロジェクトの所有者、またはそのプロジェクトのプロジェクトレベルロールであるスーパー管理者が割り当てられているユーザー |
||
|
パッケージユーザー |
パッケージユーザーが所属するプロジェクトは、パッケージ内のリソースを使用します。パッケージをインストールした後、パッケージユーザーは自プロジェクト内のユーザーまたはロールに対して、パッケージ内のリソースへのアクセス権限を付与できます。 |
リソースを使用するプロジェクトの所有者、またはそのプロジェクトのプロジェクトレベルロールであるスーパー管理者または Admin が割り当てられているユーザー |
||
制限
パッケージベースのアクセス制御メカニズムを使用する前に、次の制限に注意してください。
-
パッケージに追加できるリソースは最大 1,000 です。
-
1 つのパッケージは、最大 100,000 の MaxCompute プロジェクトにインストールできます。
-
1 つの MaxCompute プロジェクトから別の MaxCompute プロジェクトにインストールできるパッケージは、最大 100 個です。
-
1 つの MaxCompute プロジェクトに作成できるパッケージは、最大 100,000 個です。
-
1 つの MaxCompute プロジェクトにインストールできるパッケージは、最大 100,000 個です。
パッケージの作成
MaxCompute プロジェクト内にパッケージを作成します。
-
構文
create package <package_name>; -
パラメーター
パラメーター
必須
説明
package_name
はい
パッケージの名前です。プロジェクト内で一意である必要があります。名前の長さは 1~128 文字で、英字、数字、アンダースコア (_) が使用可能です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
この例では、test_project_a プロジェクトの所有者である Alibaba Cloud アカウント Bob@aliyun.com が、test_project_a プロジェクト内の特定のリソースへのアクセスを他のプロジェクトに認可するためにパッケージを作成します。サンプルコマンド:
-- test_project_a プロジェクトに切り替えます。 use test_project_a; -- パッケージを作成します。 create package datashare;
パッケージへのリソースの追加
パッケージ作成者は、作成したパッケージに、パッケージユーザーが必要とするリソースを追加します。
-
構文
add <object_type> <object_name> to package <package_name> [with privileges <privileges>]; -
制限
プロジェクトをパッケージに追加することはできません。
-
注意事項
パッケージにリソースを追加する際、リソースはスナップショットとしてパッケージ化されません。リソースがパッケージに追加された後にリソースデータが更新された場合、パッケージユーザーは最新のリソースデータにアクセスします。
-
パラメーター
パラメーター
必須
説明
object_type
はい
パッケージに追加するオブジェクトのタイプです。一度に指定できるオブジェクトタイプは 1 つだけです。
オブジェクトタイプの詳細については、「権限」をご参照ください。
object_name
はい
パッケージに追加するオブジェクトの名前です。オブジェクト名は、次のいずれかの方法で取得できます:
-
テーブルまたはビュー名:MaxCompute クライアント で
show tables;コマンドを実行します。 -
リソースファイル名:MaxCompute クライアント で
list resources;コマンドを実行します。 -
関数名:MaxCompute クライアント で
list functions;コマンドを実行します。 -
インスタンス名:MaxCompute クライアント で
show instances;コマンドを実行します。
説明-
リソースを追加する際に、ワイルドカード (*) を使用できます。たとえば、
add table * to package package_name;は、すべてのテーブルをパッケージに追加します。 -
パッケージにリソースを追加する際、リソース名を「プロジェクト名.リソース名」のフォーマットで指定しないでください。たとえば、プロジェクト A の table という名前のテーブルをパッケージに追加する場合、リソース名として A.table を指定しないでください。リソース名として table を指定する必要があります。
package_name
はい
パッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。privileges
いいえ
パッケージ内のリソースに対する操作権限です。このパラメーターを指定しない場合、デフォルトでリソースに対する読み取り、Describe、Select 権限がパッケージに追加されます。リソースとリソースに対する操作権限は不可分であり、パッケージに追加した後は更新できません。パッケージ内のリソースまたはこれらのリソースに対する操作権限を更新する場合は、パッケージ内のリソースを削除してから、更新されたリソースとリソースに対する操作権限を再度パッケージに追加する必要があります。
操作権限の詳細については、「権限」をご参照ください。
-
-
使用例
作成したパッケージに、test_project_a プロジェクトのリソースファイル udtf.jar とテーブル sale_detail および bank_data を追加します。コマンドの例:
-- パッケージにリソースを追加します。 add resource udtf.jar to package datashare; add table sale_detail to package datashare; add table bank_data to package datashare;
パッケージからのリソースの削除
パッケージ作成者は、作成したパッケージからリソースを削除します。
-
構文
remove <object_type> <object_name> from package <package_name>; -
パラメーター
パラメーター
必須
説明
object_type
はい
パッケージから削除するオブジェクトのタイプ。一度に 1 つのオブジェクトのみを削除できます。
オブジェクトタイプの詳細については、「権限」をご参照ください。
object_name
はい
パッケージから削除するオブジェクトの名前。オブジェクト名は、次のいずれかの方法で取得できます。
-
テーブルまたはビュー名:MaxCompute クライアント で
show tables;コマンドを実行します。 -
リソースファイル名:MaxCompute クライアント で
list resources;コマンドを実行します。 -
関数名:MaxCompute クライアント で
list functions;コマンドを実行します。 -
インスタンス名:MaxCompute クライアント で
show instances;コマンドを実行します。
package_name
はい
パッケージの名前。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
-
例
datashare パッケージから sale_detail テーブルを削除します。サンプルコマンド:
-- パッケージからリソースを削除 remove Table sale_detail from package datashare;
プロジェクトへのパッケージ使用の承認
プロジェクトのパッケージ作成者は、作成したパッケージを他のプロジェクトが使用できるように承認します。
-
構文
allow project <project_name> to install package <package_name> [using label <number>]; -
パラメーター
パラメーター
必須
説明
project_name
はい
パッケージの使用を許可する MaxCompute プロジェクトの名前です。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。number
いいえ
このパラメーターを使用して、ラベルベースのアクセス制御ポリシーを追加します。このパラメーターは、パッケージユーザーがアクセスできるデータの秘密度レベルを指定します。承認された MaxCompute プロジェクトは、number で指定されたレベル以下の秘密度レベルを持つパッケージデータにのみアクセスできます。このパラメーターを指定しない場合、秘密度レベルはデフォルトで 0 になります。
ラベルベースのアクセス制御の詳細については、「ラベルベースのアクセス制御」をご参照ください。
-
例
test_project_a プロジェクトで作成された datashare パッケージを、test_project_b がインストールできるように承認します。コマンドの例:
-- test_project_b プロジェクトにパッケージのインストールを許可します。 allow project test_project_b to install package datashare;
プロジェクトからのパッケージに対するアクセス権限の取り消し
パッケージ作成者は、プロジェクトからパッケージに対するアクセス権限を取り消します。
-
構文
disallow project <project_name> to install package <package_name>; -
パラメーター
パラメーター
必須
説明
project_name
はい
パッケージへのアクセス権限を取り消す対象となる MaxCompute プロジェクトの名前。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_b プロジェクトが test_project_a プロジェクトの datashare パッケージをインストールする権限を取り消します。サンプルコマンド:
-- パッケージの認可を取り消します。 disallow project test_project_b to install package datashare;
パッケージの削除
パッケージの作成者は、パッケージを削除します。
-
構文
delete|drop package <package_name>; -
注意事項
パッケージを削除すると、このパッケージで付与された権限に関する情報がクリアされます。
-
パラメーター
パラメーター
必須
説明
package_name
はい
削除するパッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_a プロジェクトで作成した datashare パッケージを削除します。コマンド例:
-- パッケージを削除します。 drop package datashare;
パッケージの表示
パッケージ作成者は、MaxCompute プロジェクトで作成またはインストールされたパッケージを表示します。
-
構文
show packages; -
例
test_project_a プロジェクトで作成またはインストールされたパッケージの情報を表示します。コマンド例:
-- パッケージのリストを表示します。 show packages;返される結果には、次の情報が含まれます:
-
パッケージ名:作成またはインストールされたパッケージの名前。
-
作成時刻:パッケージの作成時刻。
-
ソースプロジェクト:パッケージが属する MaxCompute プロジェクトの名前。
-
インストール時刻:パッケージのインストール時刻。
-
ステータス:パッケージの状態。
+-------------+--------------------------+ | PackageName | CreateTime | +-------------+--------------------------+ | datashare | 2021-12-28T18:10:39+0800 | +-------------+--------------------------+ +-------------+--------------------+--------------------------+--------+ | PackageName | SourceProject | InstallTime | Status | +-------------+--------------------+--------------------------+--------+ | systables | information_schema | 2020-11-24T14:11:23+0800 | OK | +-------------+--------------------+--------------------------+--------+ -
パッケージの詳細の表示
パッケージ作成者は、MaxCompute プロジェクトで作成したパッケージの詳細を表示します。
-
構文
describe package <package_name>; -
パラメーター
パラメーター
必須
説明
package_name
必須
パッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_a プロジェクトの datashare パッケージのリソースと権限を表示します。コマンド例:
-- datashare パッケージの詳細を表示します。 describe package datashare;返される結果には、次の情報が含まれます:
-
CreateTime:パッケージが作成された時刻。
-
PackageName:パッケージの名前。
-
SourceProject:パッケージが属する MaxCompute プロジェクトの名前。
-
ObjectType:パッケージ内のオブジェクトのタイプ。
-
ObjectName:パッケージ内のオブジェクトの名前。
-
ObjectPrivileges:パッケージ内のオブジェクトに対する権限。
-
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 | +-----------------+-----------+ -
パッケージのインストール
パッケージユーザーは、MaxCompute プロジェクトにパッケージをインストールします。
-
構文
install package <project_name>.<package_name>; -
注意事項
パッケージはインストール時に展開されます。インストール後、
show packages;コマンドでインストール済みのパッケージを、describe package <package_name>;コマンドでそのリソースと権限を表示できます。 -
パラメーター
パラメーター
必須
説明
プロジェクト名
はい
パッケージが属する MaxCompute プロジェクトの名前。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_b プロジェクトに、 test_project_a プロジェクトの datashare パッケージをインストールします。この例では、Alibaba Cloud アカウント Amy@aliyun.com が test_project_b プロジェクトの所有者です。サンプルコマンド:
-- test_project_b プロジェクトに切り替えます。 use test_project_b; -- パッケージをインストールします。 install package test_project_a.datashare;
インストール済みパッケージの詳細の表示
パッケージユーザーは、MaxCompute プロジェクトにインストールされているパッケージの詳細を表示できます。
-
構文
describe package <project_name>.<package_name>; -
パラメーター
パラメーター
必須
説明
project_name
はい
パッケージが属する MaxCompute プロジェクトの名前です。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_a プロジェクトにインストールされている datashare パッケージ内のリソースと権限を表示します。コマンドの例:
-- パッケージの詳細を表示します。 describe package test_project_a.datashare;返される結果には、次の情報が含まれます:
-
CreateTime:パッケージが作成された時刻。
-
PackageName:パッケージの名前。
-
SourceProject:パッケージが属する MaxCompute プロジェクトの名前。
-
ObjectType:パッケージ内のオブジェクトのタイプ。
-
ObjectName:パッケージ内のオブジェクトの名前。
-
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 | +--------------+------------------------------------------+------------------+ -
ユーザーまたはロールへのパッケージアクセス権限の付与
パッケージユーザーは、パッケージがインストールされている MaxCompute プロジェクトで、ユーザーまたはロールにパッケージへのアクセス権限を付与します。
インストールされたパッケージは、MaxCompute の独立したオブジェクトの一種です。パッケージ内のリソースにアクセスするには、パッケージの読み取り権限が必要です。読み取り権限がない場合、プロジェクトオーナー、およびスーパー管理者または管理者ロールが割り当てられたユーザーが、アクセスコントロールリスト (ACL) を使用して読み取り権限を付与できます。ACL ベースのアクセスコントロールの詳細については、「ACL ベースのアクセスコントロール」をご参照ください。
-
構文
grant <actions> on package <project_name>.<package_name> to {USER|ROLE} <name>; -
注意事項
ユーザーまたはロールに読み取り権限が付与された後、そのユーザーまたはロールは、パッケージがインストールされているプロジェクト内でのみパッケージ内のリソースにアクセスできます。パッケージの権限をきめ細かく管理する方法の詳細については、「パッケージのアクセスコントロール」をご参照ください。
-
パラメーター
パラメーター
必須
説明
actions
はい
パッケージ内のリソースの操作権限です。値には
Readを設定します。project_name
はい
パッケージが属する MaxCompute プロジェクトの名前です。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前です。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。name
はい
アクセス権限を付与するユーザーアカウントまたはロールの名前です。1 回の権限付与操作で指定できるユーザーアカウントまたはロールは 1 つだけです。
MaxCompute クライアントで
list users;またはlist roles;コマンドを実行して、ユーザーアカウントまたはロール名を取得できます。 -
例
この例では、Bella は Alibaba Cloud アカウント Amy@aliyun.com の RAM ユーザーです。Bella に datashare パッケージへのアクセス権限を付与します。コマンドの例:
-- Bella にパッケージへのアクセス権限を付与します。 grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella;
ユーザーまたはロールのパッケージアクセス権限の取り消し
パッケージユーザーは、パッケージがインストールされている MaxCompute プロジェクトで、ユーザーまたはロールからパッケージへのアクセス権限を取り消します。
-
構文
revoke <actions> on package <project_name>.<package_name> from {USER|ROLE} <name>; -
パラメーター
パラメーター
必須
説明
actions
はい
パッケージ内のリソースに対する操作権限。値を
Readに設定します。project_name
はい
パッケージが属する MaxCompute プロジェクトの名前。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。name
はい
パッケージへのアクセス権限を取り消す対象のユーザーアカウントまたはロールの名前。1 回の取り消し操作で指定できるユーザーアカウントまたはロールは 1 つのみです。
MaxCompute クライアントで
list users;またはlist roles;コマンドを実行すると、ユーザーアカウントまたはロール名を確認できます。 -
例
Bella からパッケージへのアクセス権限を取り消します。サンプルコマンド:
-- ユーザー RAM$Amy@aliyun.com:Bella からパッケージへのアクセスを取り消します。 revoke Read on package test_project_a.datashare from user RAM$Amy@aliyun.com:Bella;
パッケージのアンインストール
MaxCompute プロジェクトにインストールされているパッケージをアンインストールします。
-
構文
uninstall package <project_name>.<package_name>; -
パラメーター
パラメーター
必須
説明
プロジェクト名
はい
パッケージが属する MaxCompute プロジェクトの名前。
MaxCompute コンソールにログインし、左上でリージョンを選択してから、プロジェクト管理 タブでプロジェクト名を見つけます。
package_name
はい
パッケージの名前。
MaxCompute クライアントで
show packages;コマンドを実行すると、作成されたすべてのパッケージを表示できます。 -
例
test_project_a プロジェクトにインストールされている datashare パッケージをアンインストールするコマンド例を次に示します。
-- パッケージをアンインストールします。 uninstall package test_project_a.datashare;
使用例
この例では、Alibaba Cloud アカウント Bob@aliyun.com が test_project_a プロジェクトの所有者です。 Alibaba Cloud アカウント Amy@aliyun.com が test_project_b プロジェクトの所有者です。 業務要件により、test_project_a プロジェクト内のリソースファイル udtf.jar とテーブル sale_detail を test_project_b と共有したいとします。 また、test_project_b プロジェクト内の RAM ユーザー Amy@aliyun.com:Bella がこれらのリソースにアクセスできるようにします。 MaxCompute クライアントで次の手順を実行します:
-
test_project_a プロジェクトに切り替え、Alibaba Cloud アカウント Bob@aliyun.com を使用してパッケージを作成します。
-- test_project_a プロジェクトに切り替えます。 use test_project_a; -- パッケージを作成します。 create package datashare; -
Alibaba Cloud アカウント Bob@aliyun.com を使用して、作成したパッケージにリソースを追加します。
-- パッケージにリソースを追加します。 add resource udtf.jar to package datashare; add table sale_detail to package datashare; add table bank_data to package datashare; -
Alibaba Cloud アカウント Bob@aliyun.com を使用して、test_project_b プロジェクトにパッケージのインストールを認可します。
-- test_project_b プロジェクトにパッケージのインストールを許可します。 allow project test_project_b to install package datashare; -
test_project_b プロジェクトに切り替え、Alibaba Cloud アカウント Amy@aliyun.com を使用してパッケージをインストールします。
-- test_project_b プロジェクトに切り替えます。 use test_project_b; -- パッケージをインストールします。 install package test_project_a.datashare; -- パッケージ内のリソースのリストを表示します。 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 | +--------------+------------------------------------------+------------------+ -
Alibaba Cloud アカウント Amy@aliyun.com を使用して、Bella にパッケージへのアクセスを認可します。
-- Bella にパッケージへのアクセスを認可します。 grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella; -
Bella が sale_detail テーブルをクエリします。
SELECT * FROM test_project_a.sale_detail;
関連ドキュメント
-
パッケージを作成してインストールした後、次の操作を実行できます:
-
プロジェクト間のデータアクセスを使用して、異なるリージョンにある MaxCompute プロジェクト間でデータを移行する (単一の Alibaba Cloud アカウント内または複数のアカウント間での移行)。
-
DataWorks を使用して、プロジェクト間で MaxCompute データを移行できます。詳細については、「MaxCompute データソース」をご参照ください。