AWS Lake Formation を使用して AWS Glue データカタログのデータベースとテーブルをクロスアカウントで共有するにはどうすればよいですか?

最終更新日: 2022 年 5 月 5 日

AWS Lake Formation を使用して、AWS Glue データカタログのデータベースとテーブルをクロスアカウントで共有したいと考えています。

解決方法

Lake Formation のクロスアカウント機能を使用すると、他の AWS アカウントに、データレイクとの間でデータを書き込んだり、共有したりするためのアクセス権を付与できます。リソースは、タグベースのアクセス制御または名前付きリソースのいずれかによって共有できます。この記事では、名前付きリソースメソッドを使用してデータカタログリソースへのクロスアカウントアクセスを付与する方法について説明します。

前提条件が満たされていることを確認する

データカタログリソースを別のアカウントと共有したり、別のアカウントから共有されているリソースにアクセスしたりする前に、次の前提条件に留意してください。

Lake Formation の許可を取り消す

データカタログリソースに対する IAMAllowedPrincipals グループの Lake Formation の許可をすべて取り消します。

新しいテーブルに Super パーミッションが付与されないようにする

共有する可能性のあるテーブルを含むデータカタログデータベースでは、新しいテーブルに Super から IAMAllowedPrincipals へのデフォルトの付与がされないようにします。

  1. Lake Formation コンソールを開きます。
  2. ナビゲーションペインの [Data Catalog] (データカタログ) で、[Databases] (データベース) を選択します。
  3. 更新するデータベースを選択します。
  4. [Actions] (アクション) を選択して、[Edit] (編集) を選択します。
  5. [Default permissions for newly created tables] (新しく作成されたテーブルに対するデフォルトのアクセス許可) で [Use only IAM access control for new tables in this database] (このデータベースの新しいテーブルには IAM アクセスコントロールのみを使用) をオフにします。
  6. [Save] (保存) を選択します。

詳細については、Super を参照してください。

クロスアカウントアクセスに必要な許可を追加する

AWS Glue データカタログリソースポリシーがアカウントで既に有効になっている場合は、ポリシーを削除するか、クロスアカウントの付与に必要な新しい許可をポリシーに追加できます。以下は、アカウント 1111222233334444 からアカウント 5555666677778888 へのクロスアカウント AWS Glue アクセスを提供するためのサンプルリソースポリシーです。

詳細については、「クロスアカウントアクセス許可の付与」を参照してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ram.amazonaws.com"
      },
      "Action": "glue:ShareResource",
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:table/*/*",
        "arn:aws:glue:us-east-1:1111222233334444:database/*",
        "arn:aws:glue:us-east-1:1111222233334444:catalog"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::5555666677778888:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:table/*/*",
        "arn:aws:glue:us-east-1:1111222233334444:database/*",
        "arn:aws:glue:us-east-1:1111222233334444:catalog"
      ]
    }
  ]
}

組織との共有を有効にする

データカタログリソースが組織間で共有されている場合は、AWS RAM コンソールを使用して AWS Organizations との共有を有効にします。このオプションを有効にする AWS Identity and Access Management (IAM) ユーザーまたはロールには、ram:EnableSharingWithAwsOrganization IAM 許可が必要です。

詳細については、「クロスアカウントアクセスの前提条件」を参照してください。

必要な IAM 許可を設定する

ソースアカウント:名前付きリソースメソッドを使用してクロスアカウントの許可を付与するには、AWS Glue および AWS Resource Access Manager (AWS RAM) に必要な IAM 許可が必要です。これらの許可を付与する AWS マネージドポリシー AWSLakeFormationCrossAccountManager を選択することも、このポリシーに基づいて新しいポリシーを作成することもできます。

ターゲットアカウント:ターゲットアカウントの Data Lake 管理者には、次の追加ポリシーが必要です。このポリシーにより、管理者は AWS RAM リソース共有の招待を受け入れ、組織とのリソース共有を有効にすることができます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ram:AcceptResourceShareInvitation",
        "ram:RejectResourceShareInvitation",
        "ec2:DescribeAvailabilityZones",
        "ram:EnableSharingWithAwsOrganization"
      ],
      "Resource": "*"
    }
  ]
}

注意:AWS RAM でリソース共有の招待を受け取る IAM ユーザーまたはロールには、glue:PutResourcePolicy に必要な IAM 許可が必要です。

データベースとそのテーブルをターゲットアカウントと共有する

データベースとデータベース内のすべてのテーブルを、組織に属さないターゲットアカウントと共有するには、次の操作を行います。

注意:データベース内のすべてのテーブルをソースアカウントで共有すると、ソースアカウントで作成された新しいテーブルは、ターゲットアカウントと自動的に共有されます。

ソースアカウントで、次の操作を行います。

  1. Lake Formation コンソールを開き、データレイク管理者としてサインインします。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. 共有するデータベースを選択します。
  4. [Actions] (アクション) を選択して、[Grant] (付与) を選択します。
  5. [External account] (外部アカウント) を選択します。
  6. [AWS アカウント ID] または [AWS 組織 ID] に、ターゲットアカウントのアカウント ID を入力します。
  7. [テーブル] で、[すべてのテーブル] が選択されていることを確認します。
  8. [テーブル許可] と [付与可能な許可] で、付与するアクセス許可を選択します。
  9. [Grant] (付与) を選択します。

ターゲットアカウントで、次の操作を行います。

  1. AWS RAM コンソールを開きます。
  2. ナビゲーションペインの [Shared with me] (自分と共有) で、[Resource shares] (リソースの共有) を選択します。
  3. アクセス権が付与されたリソース共有の一覧を確認します。
  4. ソースアカウントから共有されたリソースへの招待を承諾するには、リソース共有 ID を選択し、[Accept resource share] (リソース共有を承認) を選択します。
  5. Lake Formation コンソールを開きます。
  6. ナビゲーションペインで、[Databases] (データベース) を選択します。
    共有データベースを一覧に表示できます。このデータベースの所有者アカウント ID には、ソースアカウントのアカウント ID が表示されます。
  7. 共有データベースを選択し、[Actions] (アクション) を選択します。
  8. [Create resource link] (リソースリンクの作成) を選択します。
  9. [リソースリンクの作成] ページで、次の操作を行います。
    [Resource link name] (リソースリンク名) に、リソースリンクの名前を入力します。
    [共有データベース] で、共有データベースの名前が選択されていることを確認します。
    [Shared database's owner ID] (共有データベースの所有者 ID) に、ソースアカウントのアカウント ID を入力します。
  10. [Create] (作成) を選択します。
    リソースリンクが作成されます。

リソースリンクはデータカタログオブジェクトであり、メタデータデータベースとテーブル、通常は他の AWS アカウントの共有データベースやテーブルへのリンクです。これにより、データレイク内のデータへのクロスアカウントアクセスが可能になります。リソースリンクが作成されたら、データレイク管理者アクセス権で共有データベース内のテーブルにクエリを実行できます。

共有データベースの IAM ユーザー/プリンシパルにアクセス権を付与するには、リソースリンクおよび共有データベースに必要なアクセス許可を付与します。これにより、IAM ユーザー/プリンシパルは、Lake Formation コンソールで共有データベースとリソースリンクを表示できます。IAM ユーザーは、Amazon Athena コンソールまたは Amazon Redshift Spectrum でデータベースとリソースリンクを表示することもできます。

IAM ユーザーにリソースリンクへのアクセス権を付与するには、以下を実行します。

  1. Lake Formation コンソールを開き、データレイク管理者としてサインインします。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. 作成したリソースリンクを選択します。
  4. [Actions] (アクション) を選択して、[Grant] (付与) を選択します。
  5. [Principals] (プリンシパル) で、[IAM users and roles] (IAM ユーザーとロール) を選択します。
  6. [IAM users and roles] (IAM ユーザーとロール) には、アクセス権を付与する必要がある IAM ユーザーまたはプリンシパルを選択します。
  7. [Resource link permissions] (リソースリンクのアクセス許可) で、[Describe] (説明) を選択します。
  8. [Grant] (付与) を選択します。

IAM ユーザーに共有データベースへのアクセス権を付与するには、以下を実行します。

  1. Lake Formation コンソールを開き、データレイク管理者としてサインインします。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. 共有データベースを選択します。
  4. [Actions] (アクション) を選択して、[Grant] (付与) を選択します。
  5. [Principals] (プリンシパル) で、[IAM users and roles] (IAM ユーザーとロール) を選択します。
  6. [IAM users and roles] (IAM ユーザーとロール) には、アクセス権を付与する必要がある IAM ユーザーまたはプリンシパルを選択します。
  7. [Database permissions] (データベースのアクセス許可) で、[Describe] (説明) を選択します。
    注: この手順では、共有データベースを表示するための最低限のアクセス許可をユーザーに提供します。
  8. [Grant] (付与) を選択します。

データベース内のすべてまたは特定のテーブルへのアクセス権を付与するには、[All tables] (すべてのテーブル) オプションを選択します。

  1. リソースリンクを選択します。
  2. [Actions] (アクション) を選択して、[Grant] (付与) を選択します。
  3. [IAM ユーザーとロール] を選択します。
  4. IAM ユーザーとロールの場合は、アクセスを付与するユーザー/プリンシパルを選択します。
  5. [LF タグ] または [カタログリソース] で、次の操作を行います。
    データベース内のすべてのテーブルへのアクセス権を付与するには、[テーブル-オプション] で [All tables] (すべてのテーブル) を選択します。
    データベース内の特定のテーブルにのみアクセス権を付与するには、[テーブル-オプション] でテーブルを選択します。
  6. [テーブル権限] と [付与可能な権限] で、 [Select] と [Describe] を選択します。
  7. [Grant] (付与) を選択します。

注意:ソースアカウントの [付与可能なアクセス許可] で選択したアクセス権限のみを付与できます。

必要な許可を付与すると、ターゲットアカウントから Athena のテーブルを正常にクエリできます。

ターゲットアカウントとテーブルのみを共有する

個別のテーブルをターゲットアカウントと共有するには、前のセクションの手順に従い、以下の変更を加えます。

送信元アカウント:

Lake Formation コンソールからターゲットアカウントへのアクセス権を付与するには、データベースを選択するのではなく、個々のテーブルを選択します。

ターゲットアカウント:

  • AWS RAM コンソールでリソース共有を受け入れ、Lake Formation コンソールの共有テーブルにアクセスします。
  • 共有テーブルのリソースリンクを作成します。リソースリンクが作成されたら、データレイク管理者アクセス権で共有テーブルにクエリを実行できます。
  • 共有テーブルの IAM ユーザー/プリンシパルにアクセス権を付与するには、リソースリンクに対する許可を付与する必要があります。

その他の考慮事項

  • テーブルに対する許可を付与すると、テーブル内の特定のカラムに対してのみアクセスを制限できます。その場合、ターゲットアカウントは共有テーブルの列のみを表示できます。
  • ターゲットアカウントの IAM ユーザー/プリンシパルが、ソースアカウントの Amazon Simple Storage Service (Amazon S3) パスにアクセスできることを確認します。
  • ソースアカウントから以前に付与された許可を取り消すと、ターゲットアカウントは共有データベース/テーブルにアクセスできなくなります。ただし、ターゲットアカウントで作成したリソースリンクは自動的には削除されません。リソースリンクは手動で削除する必要があります。
  • データベース/テーブルを削除しても、AWS RAM 内のリソース共有は自動的には削除されません。したがって、共有データベースまたはテーブルを削除する前に、クロスアカウント許可を手動で取り消す必要があります。