AWS Glue データカタログのリソースへのクロスアカウントアクセスを提供するにはどうすればよいですか?

所要時間4分
0

Amazon EMR、Amazon Athena、AWS Glue などのサービスを別のアカウントの AWS Glue データカタログとともに使用したいと考えています。

解決方法

AWS Glue データカタログのクロスアカウントリソースにアクセスする方法は、接続に使用する AWS のサービスによって異なります。そのアクセス方法は、データカタログへのアクセスを制御するのに AWS Lake Formation を使用するかどうかによっても異なります。

Lake Formation を使用しているかどうかわからず、テーブルを共有したい場合は、次の AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行します。

aws glue get-table --database-name DOC-EXAMPLE-DB --name DOC-EXAMPLE-TABLE --query 'Table.IsRegisteredWithLakeFormation'

このコマンドの各値を次のように置き換えてください。

  • DOC-EXAMPLE-DB をデータベース名に置き換えます
  • DOC-EXAMPLE-TABLE をテーブル名に置き換えます

コマンドが true を返す場合、Lake Formation を使用しています。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

データカタログは、Lake Formation を使用するいくつかのテーブルと AWS Glue の許可を使用するいくつかのテーブルがあるハイブリッド環境にある可能性があります。データカタログを Lake Formation にアップグレードするには、「Upgrading AWS Glue data permissions to the AWS Lake Formation model」(AWS Lake Formation モデルに対する AWS Glue データの許可のアップグレード) を参照してください。

注: この記事では、単一の AWS リージョン内のクロスアカウントアクセスのソリューションオプションについて説明します。別のリージョンのリソースへのアクセスについては、この記事では説明しません。アカウントから別の AWS リージョンのアカウントにデータカタログをレプリケートするには、GitHub で「AWS Glue Data Catalog replication utility」(AWS Glue データカタログレプリケーションユーティリティ) を参照してください。

Lake Formation なしでデータカタログにアクセスする

Lake Formation を使用していない場合は、次の手順を実行して、アカウント B の AWS Glue データカタログからアカウント A にリソースレベルの許可を付与します。

注: アカウント A は抽出、変換、ロード (ETL) アカウントであり、アカウント B は AWS Glue データカタログリソースが配置されているアカウントです。

AWS Glue ETL ジョブを使用したリソースへのアクセス

1.    アカウント B で次のようなリソースポリシーをアタッチします。これは、アカウント A がアカウント B のデータベースとテーブルにアクセスすることを許可します。このポリシーは、ナビゲーションペインで [Catalog settings] (カタログ設定) を選択して、AWS Glue コンソールを使用してアタッチできます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

このポリシーの次の値を置き換えてください。

  • 1111222233334444 をアカウント A のアカウント ID に置き換えます
  • 5555666677778888 をアカウント B のアカウント ID に
  • us-east-1 をご希望のリージョンに
  • DOC-EXAMPLE-DB をデータベース名に置き換えます

ジョブの実行に使用されるアカウント A の特定のロールへのアクセスを制限することもできます。これを実行するには、ロールの ARN をポリシーに含めます。例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:role/service-role/AWSGlueServiceRole-Glue-Test"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

このポリシーの次の値を置き換えてください。

  • 1111222233334444 をアカウント A のアカウント ID に置き換えます
  • 5555666677778888 をアカウント B のアカウント ID に
  • us-east-1 をご希望のリージョンに
  • DOC-EXAMPLE-DB をデータベース名に
  • AWSGlueServiceRole-Glue-Test をETL ジョブの実行に使用されるロールの ARN に

2.    ETL ジョブを実行するアカウント A の AWS Identity and Access Management (IAM) ユーザーは、アカウント B のデータベースとテーブルにアクセスする必要があります。アカウント A で、AWS Glue ETL ジョブの IAM ロールに IAM ポリシーをアタッチして、アカウント B のデータベースとテーブルにアクセスします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetConnection",
        "glue:GetTable",
        "glue:GetPartition"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/default",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

注: AWS Glue データカタログで Athena を使用している場合は、ポリシーにデフォルトのデータベースを含めてください。これにより、GetDatabase アクションと CreateDatabase アクションが確実に成功します。詳細については、「AWS リージョンごとの Default データベースとカタログに対するアクセスポリシー」を参照してください。

このポリシーの次の値を置き換えてください。

  • 1111222233334444 をアカウント A のアカウント ID に置き換えます
  • 5555666677778888 をアカウント B のアカウント ID に
  • us-east-1 をご希望のリージョンに
  • DOC-EXAMPLE-DBをデータベース名に

3.    アカウント A に必要な許可を付与した後、アカウント A がアカウント B のデータカタログにアクセスできるかどうかをテストできます。これをテストするには、次のスクリプトを使用して ETL ジョブを作成します。

"""Create Spark Session with cross-account AWS Glue Data Catalog"""
from pyspark.sql import SparkSession

spark_session = SparkSession.builder.appName("Spark Glue Example") \
.config("hive.metastore.client.factory.class", \
"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
.config("hive.metastore.glue.catalogid", "5555666677778888") \
.enableHiveSupport() \
.getOrCreate()

table_df = spark_session.sql("SELECT * FROM DOC-EXAMPLE-DB.DOC-EXAMPLE-TABLE limit 10")

table_df.show()

スクリプトの次の値を置き換えてください。

  • 5555666677778888 をアカウント B のアカウント ID に
  • DOC-EXAMPLE-DBをデータベース名に
  • DOC-EXAMPLE-TABLE をテーブル名に置き換えます

Amazon EMR を使用してリソースにアクセスする

Amazon EMR で別のアカウントのデータカタログにアクセスするには、「Amazon EMR の Hive および Spark を使用して、異なる AWS アカウントにある AWS Glue データカタログにクエリを実行する方法を教えてください」を参照してください。

Athena でリソースにアクセスする

Athena を使用して別のアカウントのデータカタログにアクセスするには、「AWS Glue データカタログへのクロスアカウントアクセス」を参照してください。

Lake Formation を使用してデータカタログにアクセスする

Lake Formation を使用している場合は、次のいずれかの方法を使用して、データカタログへのクロスアカウントアクセスを付与できます。

  • 指名リソース
  • タグベースのアクセス制御 (TBAC)

重要: データカタログ内の新しいテーブルが IAMAllowedPrincipals に対するデフォルトの Super 許可を持たないようにするには、次の手順を実行します。

1.    AWS Lake Formation コンソールを開きます。

2.    ナビゲーションペインで、[Data Catalog] (データカタログ) を選択してから、[Settings] (設定) を選択します。

3.    [Use only IAM access control for new databases] (新しいデータベースに IAM アクセスコントロールのみを使用) と [Use only IAM access control for new tables in this database] (このデータベース内の新しいテーブルに IAM アクセスコントロールのみを使用) の両方をクリアします。

4.    [Save] (保存) を選択します。

詳細については、「Changing the default security settings for your data lake」(データレイクのデフォルトのセキュリティ設定の変更) を参照してください。

指名リソースメソッドを使用したクロスアカウントのアクセス許可の付与

AWS Resource Access Manager (AWS RAM) は、指定されたリソースメソッドを使用してデータベースの許可を提供するために使用されます。

アカウント B のデータカタログリソースのアカウント A に Lake Formation の許可を付与するには、次の手順を実行します。

1.    アカウント B のデータカタログで次のようなリソースポリシーをアタッチします。

{
  "Effect": "Allow",
  "Action": [
    "glue:ShareResource"
  ],
  "Principal": {
    "Service": [
      "ram.amazonaws.com"
    ]
  },
  "Resource": [
    "arn:aws:glue:us-east-1:5555666677778888:table/*/*",
    "arn:aws:glue:us-east-1:5555666677778888:database/*",
    "arn:aws:glue:us-east-1:5555666677778888:catalog"
  ]
}

ポリシーの 5555666677778888 をアカウント B のアカウント ID に置き換えてください。

2.    指名リソースメソッドを使用して、アカウント B のデータカタログデータベースおよびテーブルへの Lake Formation のアクセス許可を付与します。詳細については、「指名リソースメソッドを使用したデータカタログのアクセス許可の付与」を参照してください。

TBAC を使用したクロスアカウントのアクセス許可の付与

TBAC を使用すると、ポリシータグを定義し、これらのタグを AWS Glue データベース、テーブル、および列に割り当てることができます。その後、これらのタグを使用して、これらのデータカタログリソースに対するきめ細かなアクセスを適用できます。詳細については、「タグベースのアクセスコントロールを使用したデータ共有」を参照してください。

TBAC を使用して Lake Formation の許可を付与するには、次の手順を実行します。

1.    アカウント B のデータカタログで次のようなリソースポリシーをアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/*",
        "arn:aws:glue:us-east-1:5555666677778888:table/*"
      ],
      "Condition": {
        "Bool": {
          "glue:EvaluatedByLakeFormationTags": true
        }
      }
    }
  ]
}

ポリシーの次の値を置き換えてください。

  • 1111222233334444 をアカウント A のアカウント ID に
  • 5555666677778888 をアカウント B のアカウント ID に

2.    ポリシータグを作成します

3.    TBAC メソッドを使用して、データカタログリソースで Lake Formation の許可を付与します。詳細については、「LF-TBAC 方式を使用した Data Catalog 許可の付与」を参照してください。


関連情報

クロスアカウントアクセスの付与

AWS Glue リソース ARN の指定

Lake Formation 許可モデルへのアップグレードについて

Migration between the Hive metastore and the AWS Glue Data Catalog (Hive メタストアと AWS Glue データカタログ間の移行)

アクセスコントロール用の AWS Glue リソースポリシー

AWS公式
AWS公式更新しました 2年前