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

最終更新日: 2022 年 6 月 27 日

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 リージョンのアカウントにデータカタログをレプリケートするには、「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 のデータベースとテーブルにアクセスすることを許可します。このポリシーは、ナビゲーションペインで [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 をデータベース名に

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

{
  "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 の 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 アクションのポリシーにデフォルトのデータベースを含めるようにして先に進みます。詳細については、「Fine-grained access to databases and tables in the AWS Glue Data Catalog」(AWS Glue データカタログのデータベースとテーブルへのきめ細かいアクセス) を参照してください。

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

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

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

"""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 をテーブル名に置き換えます

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

EMR で別のアカウントのデータカタログにアクセスするには、「Amazon EMR で Hive と Spark を使用して別の AWS アカウントにある AWS Glue データカタログをクエリするにはどうすればよいですか?」を参照してください。

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

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

Lake Formation を用いたデータカタログへのアクセス

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

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

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

  1. AWS Lake Formation コンソールを開きます。
  2. ナビゲーションペインで、[データカタログ] を選択してから、[設定] を選択します。
  3. [新しいデータベースに IAM アクセス制御のみを使用する] と [このデータベース内の新しいテーブルに IAM アクセス制御のみを使用する] の両方をクリアします。
  4. [保存] を選択します。

詳細については、「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 の許可を付与します。詳細については、「Granting Data Catalog permissions using the named resource method」(指定されたリソースメソッドを使用したデータカタログの許可の付与) を参照してください。

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

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

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 のアクセス許可を付与します。詳細については、「TBAC メソッドを使用したデータカタログのアクセス許可の付与」を参照してください。


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

AWS Glue リソース ARN の指定

Cross-account access prerequisites (クロスアカウントアクセスの前提条件)

About upgrading to the Lake Formation permissions model (Lake Formation の許可モデルへのアップグレードについて)

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

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?