Hadoop から権限を移行する
このドキュメントでは、Apache Hadoop Distributed File System(HDFS)、Ranger HDFS、Apache Hive から Cloud Storage または BigQuery の Identity and Access Management(IAM)ロールに権限を移行する方法について説明します。
この権限移行プロセスは以下の手順で構成されます。
- まず、プリンシパル ルールセットの YAML 構成ファイルを作成して、プリンシパル マッピング ファイルを生成します。次に、プリンシパル ルールセット YAML ファイルと HDFS または Ranger メタデータ ファイルを使用して権限移行ツールを実行し、プリンシパル マッピング ファイルを生成します。
- まず、権限ルールセットの YAML ファイルを作成して、ターゲット権限マッピング ファイルを生成します。次に、権限ルールセット YAML ファイル、テーブル マッピング構成ファイル、HDFS または Ranger メタデータ ファイルを使用して権限移行ツールを実行し、ターゲット権限マッピング ファイルを生成します。
- ターゲット権限ファイルを使用して権限移行ツールを実行し、Cloud Storage または BigQuery に権限を適用します。提供されている Python スクリプトを使用して、権限を独自に適用するために使用できる Terraform ファイルを生成することもできます。
始める前に
権限を移行する前に、次のことを行っていることを確認します。
dwh-migration-dumper
ツールをインストールします。dwh-migration-dumper
ツールを実行して、データソースに必要なメタデータを生成します。
Terraform ジェネレータ スクリプトは、リリース パッケージ内の terraform.zip
ファイルにもあります。
プリンシパル マッピング ファイルを生成する
プリンシパル マッピング ファイルは、ソースのプリンシパルを Trusted Cloud IAM プリンシパルにマッピングするマッピング ルールを定義します。
プリンシパル マッピング ファイルを生成するには、まずプリンシパル ルールセット YAML ファイルを手動で作成して、ソースから Trusted Cloud IAM プリンシパルへのプリンシパルのマッピング方法を定義する必要があります。プリンシパル ルールセット YAML ファイルで、各ソース(ranger
、HDFS
、またはその両方)のマッピング ルールを定義します。
次の例は、Apache Ranger グループを Trusted Cloud by S3NSのサービス アカウントにマッピングするプリンシパル ルールセット YAML ファイルを示しています。
ranger: user_rules: - skip: true group_rules: # Skip internal Ranger groups. - skip: true when: "group.groupSource == 0" # Map all roles to Google Cloud Platform service accounts. - map: type: value: serviceAccount email_address: expression: "group.name + 'my-service-account@my-project.s3ns-system.iam.gserviceaccount.com'" role_rules: - skip: true hdfs: user_rules: - skip: true group_rules: - skip: true other_rules: - skip: true
次の例は、HDFS ユーザーを特定の Trusted Cloud ユーザーにマッピングするプリンシパル ルールセット YAML ファイルを示しています。
ranger: user_rules: - skip: true group_rules: - skip: true role_rules: - skip: true hdfs: user_rules: # Skip user named 'example' - when: "user.name == 'example'" skip: true # Map all other users to their name at google.com - when: "true" map: type: value: user email_address: expression: "user.name + '@google.com'" group_rules: - skip: true other_rules: - skip: true
プリンシパル ルールセット YAML ファイルを作成する構文の詳細については、ルールセット YAML ファイルをご覧ください。
プリンシパル ルールセット YAML ファイルを作成したら、Cloud Storage バケットにアップロードします。また、権限を移行するソースに応じて、HDFS ファイル、dwh-migration-dumper
ツールによって生成された Apache Ranger ファイル、またはその両方を含める必要があります。その後、権限移行ツールを実行してプリンシパル マッピング ファイルを生成できます。
次の例は、権限移行ツールを実行して HDFS と Apache Ranger の両方から移行し、principals.yaml
という名前のプリンシパル マッピング ファイルを作成する方法を示しています。
./dwh-permissions-migration expand \ --principal-ruleset gs://MIGRATION_BUCKET/principals-ruleset.yaml \ --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \ --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \ --output-principals gs://MIGRATION_BUCKET/principals.yaml
MIGRATION_BUCKET
は、移行ファイルを含む Cloud Storage バケットの名前に置き換えます。
ツールを実行したら、生成された principals.yaml
ファイルを調べて、 Trusted CloudIAM プリンシパルにマッピングされたソースのプリンシパルが含まれていることを確認します。次の手順に進む前に、このファイルを編集できます。
ターゲット権限ファイルを生成する
ターゲット権限ファイルには、Hadoop クラスタで設定されたソース権限の、BigQuery または Cloud Storage マネージド フォルダの IAM ロールへのマッピングに関する情報が含まれています。ターゲット権限ファイルを生成するには、まず、Ranger または HDFS の権限を Cloud Storage または BigQuery にマッピングする方法を指定する権限ルールセット YAML ファイルを手動で作成する必要があります。
次の例では、Cloud Storage に対するすべての Ranger 権限を受け入れます。
gcs: ranger_hive_rules: - map: {} log: true
次の例では、hadoop
プリンシパルを除くすべての HDFS 権限を受け入れます。
gcs: hdfs_rules: - when: source_principal.name == 'hadoop' skip: true - map: {}
次の例では、テーブル tab0
のデフォルトのロール マッピングをオーバーライドし、他のすべての権限にデフォルトを使用します。
gcs: ranger_hive_rules: ranger_hive_rules: - when: table.name == 'tab0' map: role: value: "roles/customRole" - map: {}
権限ルールセット YAML ファイルを作成する構文の詳細については、ルールセット YAML ファイルをご覧ください。
権限ルールセット YAML ファイルを作成したら、Cloud Storage バケットにアップロードします。また、権限を移行するソースに応じて、HDFS ファイル、dwh-migration-dumper
ツールによって生成された Apache Ranger ファイル、またはその両方を含める必要があります。テーブル構成の YAML ファイルとプリンシパル マッピング ファイルも含める必要があります。
その後、権限移行ツールを実行して、ターゲット権限ファイルを生成できます。
次の例は、権限移行ツールを実行して、HDFS と Apache Ranger の両方から移行する方法を示しています。テーブル マッピング構成ファイルと principals.yaml
という名前のプリンシパル マッピング ファイルを使用して、permissions.yaml
という名前のプリンシパル マッピング ファイルを作成します。
./dwh-permissions-migration build \ --permissions-ruleset gs://MIGRATION_BUCKET/permissions-config.yaml \ --tables gs://MIGRATION_BUCKET/tables/ \ --principals gs://MIGRATION_BUCKET/principals.yaml \ --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \ --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \ --output-permissions gs://MIGRATION_BUCKET/permissions.yaml
MIGRATION_BUCKET
は、移行ファイルを含む Cloud Storage バケットの名前に置き換えます。
ツールを実行したら、生成された permissions.yaml
ファイルを調べて、Cloud Storage または BigQuery の IAM バインディングにマッピングされたソースのプリンシパルが含まれていることを確認します。次の手順に進む前に手動で編集できます。
権限を適用する
ターゲット権限ファイルを生成したら、権限移行ツールを実行して、IAM 権限を Cloud Storage または BigQuery に適用できます。
権限移行ツールを実行する前に、次の前提条件を満たしていることを確認してください。
- Trusted Cloudに必要なプリンシパル(ユーザー、グループ、サービス アカウント)を作成しました。
- 移行されたデータをホストする Cloud Storage マネージド フォルダまたはテーブルを作成しました。
- ツールを実行するユーザーには、Cloud Storage マネージド フォルダまたはテーブルのロールを管理する権限があります。
権限を適用するには、次のコマンドを実行します。
./dwh-permissions-migration apply \ --permissions gs://MIGRATION_BUCKET/permissions.yaml
ここで、MIGRATION_BUCKET
は移行ファイルを含む Cloud Storage バケットの名前です。
権限を Terraform 構成として適用する
移行した権限を適用するには、ターゲット権限ファイルを Terraform Infrastructure as Code(IaC)構成に変換して、Cloud Storage に適用することもできます。
- Python 3.7 以降がインストールされていることを確認します。
- 新しい仮想環境を作成して有効にします。
permissions-migration/terraform
ディレクトリで、次のコマンドを使用してrequirements.txt
ファイルから依存関係をインストールします。python -m pip install -r requirements.txt
生成ツールのコマンドを実行します。
python tf_generator PATH LOCATION OUTPUT
次のように置き換えます。
PATH
: 生成されたpermissions.yaml
ファイルのパス。LOCATION
: スクリプトが権限構成に基づいてフォルダをチェックし、作成する Cloud Storage バケットのロケーション。OUTPUT
: 出力ファイルmain.tf
のパス。
ルールセット YAML ファイル
ルールセット YAML ファイルは、HDFS または Apache Ranger からTrusted Cloudに権限を移行するときに、プリンシパルとロールをマッピングするために使用されます。ルールセット YAML ファイルでは、述語(結果がブール値)と式(結果が文字列)の指定に Common Expression Language(CEL)を使用します。
ルールセット YAML ファイルには、次の特性があります。
- 各タイプのマッピング ルールは、各入力オブジェクトに対して上から順に実行されます。
- CEL 式はコンテキスト変数にアクセスできます。コンテキスト変数はルールセットのセクションによって異なります。たとえば、
user
変数を使用してソース ユーザー オブジェクトにマッピングし、group
変数を使用してグループにマッピングできます。 - CEL 式または静的値を使用して、デフォルト値を変更できます。たとえば、グループをマッピングするときに、出力値
type
をデフォルト値group
からserviceAccount
などの別の値にオーバーライドできます。 - すべての入力オブジェクトに一致するルールが少なくとも 1 つ必要です。
HDFS または Apache Ranger の権限移行では、ルールセット YAML ファイルを使用して、プリンシパル マッピング ファイルまたはロール マッピング ファイルのいずれかを定義できます。
ルールセット YAML ファイルのマッピング ルール
ルールセット YAML ファイルは、権限の移行中にソースからターゲットにオブジェクトを照合する方法を指定するマッピング ルールで構成されています。マッピング ルールには、次のセクションまたは句を含めることができます。
when
: ルール- の適用範囲を制限する述語句
- 文字列はブール値の CEL 式を表します。値は
true
またはfalse
です - このルールは、
when
句がtrue
と評価された場合にのみ適用されます。 - デフォルト値は
true
です
- 文字列はブール値の CEL 式を表します。値は
map
: 結果フィールドの内容を指定する句。この句の値は、処理されるオブジェクトのタイプに応じて異なり、次のように定義できます。- 文字列として評価する
expression
- 定数文字列の
value
- 文字列として評価する
skip
: 入力オブジェクトをマッピングしないように指定します。true
かfalse
のいずれかになります
log
: ルールのデバッグまたは開発に役立つ述語句- 文字列はブール値の CEL 式を表します。値は
true
またはfalse
です - デフォルト値は
false
です true
に設定すると、出力に実行ログが含まれます。このログは、実行中の問題のモニタリングや診断に使用できます。
- 文字列はブール値の CEL 式を表します。値は
プリンシパル ルールセット YAML ファイルを作成する
プリンシパル マッピング ファイルは、email_address
と type
の値を指定してプリンシパル ID を生成するために使用されます。
email_address
を使用して、 Trusted Cloud プリンシパルのメールアドレスを指定します。type
を使用して、 Trusted Cloudでプリンシパルの性質を指定します。type
の値は、user
、group
、serviceAccount
のいずれかになります。
ルールで使用される CEL 式は、処理されたオブジェクトを表す変数にアクセスできます。変数のフィールドは、HDFS または Apache Ranger のメタデータ ファイルの内容に基づいています。使用可能な変数は、ルールセットのセクションによって異なります。
user_rules
には変数user
を使用しますgroup_rules
には変数group
を使用しますother_rules
には変数other
を使用しますrole_rules
には変数role
を使用します
次の例では、HDFS のユーザーを Trusted Cloudのユーザーにマッピングします。ユーザー名の後に @google.com
を付けてメールアドレスとして指定します。
hdfs: user_rules: # Skip user named 'example' - when: "user.name == 'example'" skip: true # Map all other users to their name at google.com - when: "true" map: type: value: user email_address: expression: "user.name + '@google.com'"
デフォルトのロール マッピングをオーバーライドする
デフォルト以外のプリンシパルを使用するには、ルールセット ファイルを使用してデフォルトのロール マッピングをスキップするか、変更します。
次の例は、ルールのセクションをスキップする方法を示しています。
hdfs: user_rules: - skip: true group_rules: - skip: true other_rules: - skip: true
権限ルールセット YAML ファイルを作成する
権限ルールセット YAML ファイルは、ターゲット権限マッピング ファイルを生成するために使用されます。権限ルールセット YAML ファイルを作成するには、権限ルールセット YAML で CEL 式を使用して、HDFS または Apache Ranger の権限を Cloud Storage または BigQuery のロールにマッピングします。
デフォルトのロール マッピング
HDFS ファイルのロールは、ソースファイルの権限によって決まります。
w
ビットが設定されている場合、デフォルトのロールはwriter
です。r
ビットが設定されている場合、デフォルトのロールはreader
です。- どちらのビットも設定されていない場合、ロールは空になります。
Ranger HDFS:
- アクセスセットに
write
が含まれている場合、デフォルトのロールはwriter
です。 - アクセスセットに
read
が含まれている場合、デフォルトのロールはreader
です。 - アクセスセットにどちらも含まれていない場合、ロールは空になります。
Ranger:
- アクセスセットに
update
、create
、drop
、alter
、index
、lock
、all
、write
、refresh
が含まれている場合、デフォルトのロールはwriter
です。 - アクセス設定に
select
またはread
が含まれている場合、デフォルトのロールはreader
です。 - アクセスセットに上記の権限が含まれていない場合、ロールは空になります。
Cloud Storage:
roles/storage.objectUser
- 書き込みroles/storage.objectViewer
- 読み取り
BigQuery:
roles/bigquery.dataOwner
- 書き込みroles/bigquery.dataViewer
- 読み取り
次の例は、ルールセット YAML ファイルを変更せずにデフォルトのマッピングを受け入れる方法を示しています。
ranger_hdfs_rules: - map: {}
デフォルトのロール マッピングをオーバーライドする
デフォルト以外のロールを使用するには、ルールセット ファイルを使用してデフォルトのロール マッピングをスキップするか、変更します。
次の例は、値の原因を使用して Role フィールドを含むマップ句を使用して、デフォルトのロール マッピングをオーバーライドする方法を示しています。
ranger_hdfs_rules: - map: role: value: "roles/customRole"
権限マッピングの統合
同じターゲット リソースに対して複数の権限マッピングが生成された場合は、最も広範なアクセス権を持つマッピングが使用されます。たとえば、HDFS ルールで HDFS ロケーションのプリンシパル pa1
に読み取りロールが付与され、Ranger ルールで同じロケーションの同じプリンシパルに書き込みロールが付与されている場合、書き込みロールが割り当てられます。
CEL 式での文字列の引用符
引用符 ""
を使用して、CEL 式全体を YAML でラップします。CEL 式内で文字列を引用するには、単一引用符 ''
を使用します。例:
"'permissions-migration-' + group.name + '@google.com'"