カタログリソースポリシーを使用して、テーブルに対してクロスアカウントの AWS Glue ETL ジョブをどのように設定できますか?

所要時間3分
0

AWS Lake Formation を使わずに、AWS Glue データカタログの ETL ジョブを使用して、アカウント B からアカウント A のテーブルにアクセスしたいと考えています。

簡単な説明

AWS Lake Formation を使用するかしないかに関わらず、AWS Glue データカタログのクロスアカウントにアクセスできます。以下のセクションでは、AWS Glue のみを使用してクロスアカウントカタログにアクセスするための設定の概要を説明します。

Lake Formation を使用している場合は、クロスアカウントリソース共有の設定についての詳細は、「 Lake Formation でのクロスアカウントデータ共有 」を参照してください。

注: これらの手順では、単一の AWS リージョン内のクロスアカウントへのアクセス方法を説明しています。異なる AWS リージョンにあるリソースへのアクセスは対象としていません。

解決策

ソースアカウントとターゲットアカウントでアクセスポリシーを設定する

次の手順を使用して、アカウント A の AWS Glue データカタログからアカウント B に対してリソースレベルのアクセス許可を付与します。

注: アカウント A には AWS Glue データカタログのリソースがあり、アカウント B は抽出、変換、ロード (ETL) アカウントです。さらに、アカウント A にはリソースベースのポリシー変更があり、アカウント B には AWS ID およびアクセス管理 (IAM) ポリシーの変更が一部あります。

アカウント A にカタログリソースポリシーをアタッチする

1.    AWS マネジメントコンソールにログインします。

2.    検索バーで「AWS Glue」を検索します。[ AWS Glue の使用を開始する] を選択します。

3.    左パネルから [ カタログの設定] を選択します。

4.    [ アクセス許可] で、次の [ リソースポリシー] を入力します。このリソースポリシーにより、アカウント B はアカウント A のデータベースとテーブルにアクセスできるようになります。

{
  "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 をアカウント B のアカウント ID に置き換える
  • 5555666677778888 をアカウント A のアカウント ID に置き換える
  • us-east-1 を希望するリージョンに置き換える
  • doc_example_DB をデータベースの名前に置き換える

5.    (オプション) ポリシーにロールの Amazon リソース名 (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 をアカウント B のアカウント ID に置き換える
  • 5555666677778888 をアカウント A のアカウント ID に置き換える
  • us-east-1 を希望するリージョンに置き換える
  • doc_example_DB をデータベースの名前に置き換える
  • AWSGlueServiceRole_Glue_Test を ETL ジョブを実行するために使用されるロールの ARN に置き換える

アカウント B に IAM ポリシーをアタッチする

ETL ジョブを実行するアカウント B の IAM ユーザーは、アカウント A のデータベースとテーブルにアクセスする必要があります。

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

1.    AWS ログイン認証情報を使用して、IAM コンソール にログインします。

2.    左パネルから [ ロール] を選択します。

3.    ETL スクリプト内で使用しているロール名を選択します。

4.    アカウント B の AWS Glue ETL ジョブの IAM ロールに IAM ポリシーをアタッチします。これにより、アカウント A のデータベースとテーブルにアクセスできるようになります。

{
  "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/*"
      ]
    }
  ]
}

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

  • 5555666677778888 をアカウント A のアカウント ID に置き換える
  • us-east-1 を希望するリージョンに置き換える
  • doc_example_DB をデータベースの名前に置き換える

5.    作成したポリシーがアカウント B の IAM ロールにアタッチされていることを確認します。

6.    アカウント B がアカウント A のデータカタログにアクセスできるかどうかをテストします。次のスクリプトを使用して ETL ジョブを作成します。

ダイナミックフレームスクリプト:

df = glueContext.create_dynamic_frame.from_catalog(database="doc_example_DB", table_name="doc_example_table", catalog_id="5555666677778888", region="us-east-1")

データフレームスクリプト:

"""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 をアカウント A のアカウント ID に置き換える
  • doc_example_DB をデータベースの名前に置き換える
  • doc_example_table をテーブルの名前に置き換える
  • us-east-1 を希望するリージョンに置き換える

関連情報

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

AWS Glue リソース ARN の指定

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

Hive メタストアと AWS Glue データカタログ間の移行

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

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