AWS Glue データカタログのリソースへのクロスアカウントアクセス許可を付与する方法を教えてください。

所要時間3分
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 にアップグレードする方法については、「AWS Glue データのアクセス許可を AWS Lake Formation モデルにアップグレードする」を参照してください。

注: この記事では、単一の AWS リージョン内でクロスアカウントアクセスを使用する解決策について説明します。別のリージョンのリソースへアクセスすることは、この記事の対象外です。お使いのアカウントから別の AWS リージョンのアカウントにデータカタログを複製する方法については、GitHub で「AWS Glue データカタログレプリケーションユーティリティ」を参照してください。

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

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

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

AWS Glue ETL ジョブでリソースにアクセスする

1.アカウント B に次のようなリソースポリシーをアタッチすると、アカウント A はアカウント B のデータベースとテーブルにアクセスできるようになります。ナビゲーションペインで [カタログ設定] を選択することで、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/*"
      ]
    }
  ]
}

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

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

  • 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.ナビゲーションペインで [データカタログ] を選択してから、[設定] を選択します。

3.[新しいデータベースには IAM アクセス制御のみを使用する] および [このデータベースの新しいテーブルには IAM アクセス制御のみを使用する] の選択を両方解除します。

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

詳細については、「データレイクのデフォルトセキュリティ設定を変更する」を参照してください。

名前付きリソースを使用してクロスアカウントアクセス許可を付与する

AWS Resource Access Manager (AWS RAM) を使用して、指定されたリソースを使用する方法でデータベースのアクセス許可を付与します。

アカウント A にアカウント B 内のデータカタログリソースへの 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 メソッドを使用してデータカタログのアクセス許可を付与する」を参照してください。


関連情報

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

AWS Glue リソース ARN の指定

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

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

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

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ