E-MapReduce (EMR) では、作成するすべてのクラスターに対して、MetaService と呼ばれる ECS アプリケーションロールが自動的にバインドされます。クラスター上で実行されるジョブおよびアプリケーションは、このロールを利用して Alibaba Cloud リソースにアクセスします。構成ファイルやコード内に AccessKey ペアを記述する必要はなく、認証情報の不正公開リスクを完全に排除できます。
MetaService は、AccessKey ペアを用いずに以下のサービスへのアクセスをサポートします。
| サービス | デフォルトで有効 |
|---|---|
| Object Storage Service (OSS) | はい |
| Log Service | いいえ — 追加の RAM 権限が必要 |
| Message Service (MNS) | いいえ — 追加の RAM 権限が必要 |
Log Service または MNS へのアクセスを有効化するには、RAM コンソールで AliyunEmrEcsDefaultRole ロールに必要な権限を付与してください。詳細については、「RAM ロールへの権限付与」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
ロールの承認が完了していること。詳細については、「Alibaba Cloud アカウントへのロールの割り当て」をご参照ください。
MetaService の仕組み
ジョブまたはアプリケーションが対応する Alibaba Cloud サービスを呼び出すと、MetaService はバックグラウンドでセキュリティトークンサービス (STS) の一時的な認証情報を提供します。コードや構成ファイル内に AccessKey ペアを記述する必要はありません。
STS 認証情報のローテーション: 現在の STS 認証情報の有効期限が切れる 30 分前に、新しい一時的認証情報が生成されます。この 30 分間の重複ウィンドウ期間中は、両方の認証情報が有効です。
デフォルトの権限
AliyunEmrEcsDefaultRole ロールには、AliyunEmrECSRolePolicy ポリシーが設定されており、以下の権限が付与されています。
OSS の権限
| 権限(操作) | 説明 |
|---|---|
| oss:PutObject | ファイルまたはフォルダをアップロードします。 |
| oss:GetObject | ファイルまたはフォルダを照会します。 |
| oss:ListObjects | ファイルを照会します。 |
| oss:DeleteObject | ファイルを削除します。 |
| oss:ListBuckets | バケットを照会します。 |
| oss:AbortMultipartUpload | マルチパートアップロードイベントを中止します。 |
| oss:ListMultipartUploads | 進行中のすべてのマルチパートアップロードイベントを照会します。 |
| oss:RestoreObject | Archive または コールドアーカイブオブジェクトを復元します。 |
| oss:GetBucketInfo | バケットに関する情報を照会します。 |
| oss:ListObjectVersions | バケット内のすべてのオブジェクトのバージョン(削除マーカーを含む)を照会します。 |
| oss:DeleteObjectVersion | 特定のオブジェクトの特定のバージョンを削除します。 |
| oss:PostDataLakeStorageFileOperation | OSS-HDFS にアクセスします。 |
Tablestore の権限
| 権限(操作) | 説明 |
|---|---|
| ots:CreateTable | 指定されたテーブルスキーマに基づいてテーブルを作成します。 |
| ots:DeleteTable | 現在のインスタンスから特定のテーブルを削除します。 |
| ots:GetRow | 特定のプライマリキーに基づいて単一行のデータを読み取ります。 |
| ots:PutRow | 特定の行にデータを挿入します。 |
| ots:UpdateRow | 特定の行のデータを更新します。 |
| ots:DeleteRow | 1 行のデータを削除します。 |
| ots:GetRange | プライマリキーの特定の値範囲内にあるデータを読み取ります。 |
| ots:BatchWriteRow | 1 つ以上のテーブルから同時に複数行のデータを挿入、変更、または削除します。 |
| ots:BatchGetRow | 1 つ以上のテーブルから同時に複数行のデータを読み取ります。 |
| ots:ComputeSplitPointsBySize | テーブル内のデータを論理的に分割し、各シャードのサイズが指定サイズに近くなるように分割ポイントを計算して返します。また、シャードのホストに関するプロンプトも返します。 |
| ots:StartLocalTransaction | 指定されたパーティションキー値に基づいてローカルトランザクションを作成し、その ID を照会します。 |
| ots:CommitTransaction | ローカルトランザクションをコミットします。 |
| ots:AbortTransaction | ローカルトランザクションを中止します。 |
Data Lake Formation (DLF) の権限
| 権限(操作) | 説明 |
|---|---|
| dlf:BatchCreatePartitions | 複数のパーティションを一度に作成します。 |
| dlf:BatchCreateTables | 複数のテーブルを一度に作成します。 |
| dlf:BatchDeletePartitions | 複数のパーティションを一度に削除します。 |
| dlf:BatchDeleteTables | 複数のテーブルを一度に削除します。 |
| dlf:BatchGetPartitions | 複数のパーティションに関する情報を一度に照会します。 |
| dlf:BatchGetTables | 複数のテーブルに関する情報を一度に照会します。 |
| dlf:BatchUpdatePartitions | 複数のパーティションを一度に更新します。 |
| dlf:BatchUpdateTables | 複数のテーブルを一度に更新します。 |
| dlf:CreateDatabase | データベースを作成します。 |
| dlf:CreateFunction | 関数を作成します。 |
| dlf:CreatePartition | パーティションを作成します。 |
| dlf:CreateTable | テーブルを作成します。 |
| dlf:DeleteDatabase | データベースを削除します。 |
| dlf:DeleteFunction | 関数を削除します。 |
| dlf:DeletePartition | パーティションを削除します。 |
| dlf:DeleteTable | テーブルを削除します。 |
| dlf:GetDatabase | データベースに関する情報を照会します。 |
| dlf:GetFunction | 関数に関する情報を照会します。 |
| dlf:GetPartition | パーティションに関する情報を照会します。 |
| dlf:GetTable | テーブルに関する情報を照会します。 |
| dlf:ListCatalogs | カタログを照会します。 |
| dlf:ListDatabases | データベースを照会します。 |
| dlf:ListFunctionNames | 関数名を照会します。 |
| dlf:ListFunctions | 関数を照会します。 |
| dlf:ListPartitionNames | パーティション名を照会します。 |
| dlf:ListPartitions | パーティションを照会します。 |
| dlf:ListPartitionsByExpr | 条件に基づいてメタデータテーブルのパーティションを照会します。 |
| dlf:ListPartitionsByFilter | 条件に基づいてメタデータテーブルのパーティションを照会します。 |
| dlf:ListTableNames | テーブル名を照会します。 |
| dlf:ListTables | テーブルを照会します。 |
| dlf:RenamePartition | パーティションの名前を変更します。 |
| dlf:RenameTable | テーブルの名前を変更します。 |
| dlf:UpdateDatabase | データベースを更新します。 |
| dlf:UpdateFunction | 関数を更新します。 |
| dlf:UpdateTable | テーブルを更新します。 |
| dlf:UpdateTableColumnStatistics | メタデータテーブルの統計情報を更新します。 |
| dlf:GetTableColumnStatistics | メタデータテーブルの統計情報を照会します。 |
| dlf:DeleteTableColumnStatistics | メタデータテーブルの統計情報を削除します。 |
| dlf:UpdatePartitionColumnStatistics | パーティションの統計情報を更新します。 |
| dlf:GetPartitionColumnStatistics | パーティションの統計情報を照会します。 |
| dlf:DeletePartitionColumnStatistics | パーティションの統計情報を削除します。 |
| dlf:BatchGetPartitionColumnStatistics | 複数のパーティションの統計情報を一度に照会します。 |
| dlf:CreateLock | メタデータロックを作成します。 |
| dlf:UnLock | 特定のメタデータロックを解除します。 |
| dlf:AbortLock | メタデータロックを中止します。 |
| dlf:RefreshLock | メタデータロックを更新します。 |
| dlf:GetLock | メタデータロックに関する情報を照会します。 |
| dlf:GetAsyncTaskStatus | 非同期タスクのステータスを照会します。 |
| dlf:DeltaGetPermissions | 権限を照会します。 |
| dlf:GetPermissions | データ権限に関する情報を照会します。 |
| dlf:GetServiceInfo | サービスに関する情報を照会します。 |
| dlf:GetRoles | データ権限におけるロールに関する情報を照会します。 |
| dlf:CheckPermissions | データ権限を検証します。 |
MetaService の利用方法
ワークロードに合ったアプローチを選択してください。
| シナリオ | アプローチ | 得られるもの |
|---|---|---|
| クラスター上で実行されるジョブ(Hadoop、Hive、Spark) | 簡易 OSS パスの利用 | パス内に認証情報を含めずに OSS にアクセス可能 |
| 自己管理型サービスまたはカスタムアプリケーション | MetaService の HTTP API を呼び出し | OSS、Log Service、MNS 用の STS 一時的認証情報 |
クラスター上のジョブから OSS にアクセス
MetaService が有効な場合、任意のクラスター上のジョブで簡易パス形式を使用します。
oss://<bucket-name>/<object-path>
MetaService が認証を自動的に処理します。パス内に認証情報を埋め込む必要はありません。また、OSS リソースとの連携体験も向上し、入力する OSS パスが大幅に短縮されます。
Hadoop — オブジェクトの一覧表示:
# MetaService を使用しない場合(パス内に認証情報が埋め込まれている)
hadoop fs -ls oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c
# MetaService を使用した場合(簡易パス)
hadoop fs -ls oss://bucket/a/b/c
Hive — OSS をバックエンドとする外部テーブルの作成:
-- MetaService を使用しない場合(パス内に認証情報が埋め込まれている)
CREATE EXTERNAL TABLE test_table(id INT, name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
LOCATION 'oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c';
-- MetaService を使用した場合(簡易パス)
CREATE EXTERNAL TABLE test_table(id INT, name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
LOCATION 'oss://bucket/a/b/c';
Spark — OSS データの読み込み:
// MetaService を使用しない場合(パス内に認証情報が埋め込まれている)
val data = sc.textFile("oss://ZaH******As1s:Ba23N**************sdaBj2@bucket.oss-cn-hangzhou-internal.aliyuncs.com/a/b/c")
// MetaService を使用した場合(簡易パス)
val data = sc.textFile("oss://bucket/a/b/c")
自己管理型サービスから STS 認証情報の取得
MetaService は、各クラスターノードの http://localhost:10011 で HTTP API を提供しています。これらのエンドポイントを呼び出すことで、AccessKey ペアを用いずに Alibaba Cloud リソースにアクセスするための STS 一時的認証情報をアプリケーションが取得できます。
例 — クラスターのリージョンを取得:
curl http://localhost:10011/cluster-region
利用可能なエンドポイント:
| エンドポイント | 返却内容 |
|---|---|
/cluster-region |
クラスターが配置されているリージョン |
/cluster-role-name |
ロール名 |
/role-access-key-id |
STS 認証情報の AccessKey ID |
/role-access-key-secret |
STS 認証情報の AccessKey Secret |
/role-security-token |
STS 認証情報のセキュリティトークン |
/cluster-network-type |
ネットワークタイプ |
注意事項
AliyunEmrEcsDefaultRole ロールの変更または削除は、慎重に行ってください。このロールを誤って削除または誤設定すると、クラスターの作成失敗やジョブの失敗が発生します。セキュリティリスクを最小限に抑えるため、RAM コンソールで権限を設定する際は、最小権限の原則に従ってください。