

# AWS Glue データカタログへのクロスアカウントアクセスを構成する
<a name="security-iam-cross-account-glue-catalog-access"></a>

Athena のクロスアカウント AWS Glue カタログ機能を使用して、所有するアカウント以外のアカウントから AWS Glue カタログを登録できます。AWS Glue に必要な IAM アクセス許可を設定して、カタログを Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) リソースとして登録したら、Athena を使用してクロスアカウントクエリを実行できます。Athena コンソールを使用して別のアカウントからカタログを登録する方法については、「[別のアカウントからデータカタログを登録する](data-sources-glue-cross-account.md)」を参照してください。　　　

AWS Glue でのクロスアカウントアクセスの詳細については、「*AWS Glue デベロッパーガイド*」の「[クロスアカウントアクセス許可の付与](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)」を参照してください。

## 開始する前に
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

この機能は、既存の Athena `DataCatalog` リソース API と機能性を使用してクロスアカウントアクセスを有効にするため、開始する前に次のリソースを読んでおくことが推奨されます。
+ [データソースに接続する](work-with-data-stores.md) - Athena での AWS Glue、Hive、または Lambda データカタログソースの使用に関するトピックが含まれています。
+ [データカタログポリシーの例](datacatalogs-example-policies.md) – データカタログへのアクセスを制御するポリシーの作成方法が説明されています。
+ [Hive メタストアで AWS CLI を使用する](datastores-hive-cli.md) - Hive メタストアで AWS CLI を使用する方法が説明されていますが、他のデータソースに該当するユースケースも含まれています。

## 考慮事項と制限事項
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

現在、Athena での AWS Glue カタログのクロスアカウントアクセスには、次の制約事項があります。
+ この機能は、Athena エンジンバージョン 2 以降がサポートされている AWS リージョン のみで使用できます。Athena エンジンバージョンの詳細については、「[Athena エンジンのバージョニング](engine-versions.md)」を参照してください。ワークグループのエンジンバージョンをアップグレードする方法について、「[Athena エンジンバージョンを変更する](engine-versions-changing.md)」を参照してください。
+ 別のアカウントの AWS Glue Data Catalog をアカウントに登録するときは、特定のリージョンにある他のアカウントのデータのみにリンクされているリージョン `DataCatalog` リソースを作成します。
+ 現在、クロスアカウント AWS Glue カタログを含む `CREATE VIEW` ステートメントはサポートされていません。
+ AWS マネージドキーを使用して暗号化されたカタログを複数のアカウント全体でクエリすることはできません。複数のアカウント全体でクエリしたいカタログには、カスタマー管理キー (`KMS_CMK`) を代わりに使用してください。カスタマーマネージドキーと AWS マネージドキーの違いについては、「*AWS Key Management Service デベロッパーガイド*」の「[カスタマーキーと AWS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )」を参照してください。

## はじめに
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

次のシナリオでは、次の例にあるように、「借用者」アカウント (666666666666) が「所有者」アカウント (999999999999) に属する AWS Glue カタログを参照する `SELECT` クエリを実行します。

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

次の手順にあるステップ 1a および 1b は、所有者と借用者の両方の観点から、所有者アカウントの AWS Glue リソースへのアクセス許可を借用者アカウントに付与する方法を説明しています。この例は、データベース `tpch1000` とテーブル `customer` へのアクセス許可を付与します。これらの例の名前は、要件に合わせて変更してください。

### ステップ 1a: 所有者の AWS Glue リソースにアクセスするためのポリシーで借用者ロールを作成する
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

所有者アカウントの AWS Glue リソースにアクセスするためのポリシーで借用者アカウントロールを作成するには、AWS Identity and Access Management (IAM) コンソール、または [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html) を使用できます。次の手順では、IAM コンソールを使用します。

**所有者アカウントの AWS Glue リソースにアクセスするための借用者ロールとポリシーを作成する**

1. 借用者アカウントから IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) にサインインします。

1. ナビゲーションペインの **[アクセス管理]** を展開し、**[ポリシー]** を選択します。

1. **[Create policy]** (ポリシーの作成) を選択します。

1. **[ポリシーエディター]** には **[JSON]** を選択します。

1. ポリシーエディタに以下のポリシーを入力してから、要件に応じて変更します。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. **[次へ]** を選択します。

1. **[確認して作成]** ページにある **[ポリシー名]** にポリシーの名前 (**CrossGluePolicyForBorrowerRole** など) を入力します。

1. [**Create policy**] (ポリシーの作成) を選択します。

1. ナビゲーションペインで **Roles (ロール) ** を選択してください。

1. **[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで **[AWS アカウント]** を選択してから、**[次へ]** を選択します。

1. **[許可を追加]** ページで、作成したポリシーの名前 (**CrossGluePolicyForBorrowerRole** など) を検索ボックスに入力します。

1. ポリシー名の横にあるチェックボックスにチェックを入れてから、**[次へ]** を選択します。

1. **[Name, review, and create]** (名前、レビュー、および作成) ページで、**[Role name]** (ロール名) にロールの名前 (例えば、**CrossGlueBorrowerRole**) を入力してください。

1. [**ロールの作成**] を選択してください。

### ステップ 1b: 借用者に AWS Glue アクセス許可を付与する所有者ポリシーを作成する
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

所有者アカウント (999999999999) から借用者のロールに AWS Glue アクセス許可を付与するには、AWS Glue コンソール、または AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API オペレーションを使用できます。次の手順では、AWS Glue コンソールを使用します。

**所有者から借用者アカウントに AWS Glue アクセス許可を付与するには**

1. 所有者アカウントから AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) にサインインします。

1. ナビゲーションペインで、**[データカタログ]** を展開し、**[カタログ設定]** を選択します。

1. **[Permissions]** (許可) ボックスに、次のようなポリシーを入力します。*rolename* には、ステップ 1a で借用者が作成したロール (**CrossGlueBorrowerRole** など) を入力します。アクセス許可の範囲を拡大する場合は、データベースとテーブルのリソースタイプ両方にワイルドカード文字 (`*`) を使用します。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

完了したら、[AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html) を使用してテスト用のクロスアカウントコールをいくつか実行し、許可が期待どおりに設定されているのを確認することをお勧めします。

### ステップ 2: 借用者が所有者アカウントに属する AWS Glue Data Catalog を登録する
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

以下の手順では、Athena コンソールを使用して、所有者の Amazon Web Services アカウント内の AWS Glue Data Catalog をデータソースとして設定する方法を説明します。コンソールの代わりに API オペレーションを使用してカタログを登録する方法については、「[(オプション) API を使用して、所有者アカウントに属する Athena Data Catalog を登録します。](#security-iam-cross-account-glue-catalog-access-step-2-api)」(API を使用した所有者アカウントに属する Athena データカタログの登録) を参照してください。

**別のアカウントに属する AWS Glue Data Catalog を登録する**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. コンソールのナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。  
![\[展開メニューを選択します。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/nav-pane-expansion.png)

1. **[管理]** を展開し、**[データソース]** を選択します。

1. コンソールの右上で、**[Create data source]** (データソースの作成) を選択します。

1. **[データソースを選択]** ページの **[データソース]** で、**[S3 - AWS Glue Data Catalog]** を選択し、**[次へ]** を選択します。

1. **[Enter data source details]** (データソースの詳細を入力) ページの **[AWS Glue Data Catalog]** ( データカタログ) セクションにある **[Choose an AWS Glue Data Catalog]** ( データカタログを選択) で、**[AWS Glue Data Catalog in another account]** (別のアカウントの データカタログ) を選択します。

1. **[Data source details]** (データソースの詳細) に、次の情報を入力します。
   + **[Data source name]** (データソース名) – 他のアカウントにあるデータカタログを参照するために SQL クエリで使用する名前を入力します。
   + **Description** (説明) – (オプション) 他のアカウントにあるデータカタログの説明を入力します。
   + **カタログ ID** – データカタログが属する Amazon Web Services アカウントの 12 桁のアカウント ID を入力します。Amazon Web Services アカウント ID はカタログ ID です。

1. (オプション) **[タグ]** を展開し、データソースと関連付けるキーと値のペアを入力します。タグの詳細については、[Athena リソースにタグ付けする](tags.md)を参照してください。

1. [**次へ**] を選択します。

1. **[Review and create]** (確認と作成) ページで入力した情報を確認してから、**[Create data source]** (データソースの作成) を選択します。**[Data source details]** (データソースの詳細) ページに、登録したデータカタログのデータベースとタグがリストされます。

1. **[データソースとカタログ]** を選択します。登録したデータカタログは、**[Data source name]** (データソース名) 列にリストされています。

1. データカタログに関する情報を表示または編集するには、カタログを選択してから、**[Actions]** (アクション)、**[Edit]** (編集) の順に選択します。

1. 新しいデータカタログを削除するには、カタログを選択してから、**[Actions]** (アクション)、**[Delete]** (削除する) の順に選択します。

### ステップ 3: 借用者がクエリを送信する
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

以下の例にあるように、借用者が *catalog*.*database*.*table* 構文を使用して、カタログを参照するクエリを送信します。

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

借用者は、完全修飾構文を使用する代わりに、カタログを [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html) 経由で渡すことによって、コンテキスト的に指定することもできます。

## (オプション) 追加の Amazon S3 アクセス許可を設定します。
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 借用者アカウントが Athena クエリを使用して所有者アカウント内のテーブルに新しいデータを書き込む場合は、テーブルが所有者のアカウントに存在していても、Amazon S3 内のこのテーブルへのアクセス許可が所有者に自動的に付与されることはありません。これは、別途設定されている場合を除き、借用者が Amazon S3 内のこの情報のオブジェクト所有者になっているためです。データに対するアクセス許可を所有者に付与するには、追加のステップとして、オブジェクトに対する許可を適宜設定します。
+ [MSCK REPAIR TABLE](msck-repair-table.md) などの特定のクロスアカウント DDL オペレーションには、Amazon S3 許可が必要です。例えば、所有者アカウントの S3 バケットにデータがある所有者アカウント内のテーブルに対して借用者アカウントがクロスアカウント `MSCK REPAIR` 操作を実行している場合、そのクエリを成功させるには、借用者が引き受けたロールに対して S3 バケットが許可を付与する必要があります。

バケットのアクセス許可の付与に関する詳細は、「*Amazon Simple Storage Service ユーザーガイド*」の「[ACL の設定](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)」を参照してください。

## (オプション) カタログを動的に使用します。
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

前提条件である登録ステップを行うことなく、クロスアカウント AWS Glue カタログに対するテストを素早く実行したいという場合があります。本書に前述されているとおり、必要な IAM 許可と Amazon S3 許可が正しく設定されている場合は、`DataCatalog` リソースオブジェクトを作成することなくクロスアカウントクエリを動的に実行することができます。

登録せずにカタログを明示的に参照するには、以下の例にある構文を使用します。

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

「`glue:<arn>`」形式を使用します。`<arn>` は、使用する [AWS Glue Data Catalog の ARN](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns) です。この例では、Athena がこの構文を使用して、アカウント 999999999999 の AWS Glue データカタログのために `DataCatalog` オブジェクトを別途作成したかのように、それを動的にポイントします。

### 動的カタログの使用に関する注意事項
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

動的カタログを使用するときは、以下の点に注意してください。
+ 動的カタログの使用には、通常 Athena データカタログ API オペレーションに使用する IAM 許可が必要です。主な違いは、データカタログリソース名が `glue:*` 命名規則に従っていることです。
+ カタログ ARN は、クエリが実行されているリージョンと同じリージョンに属している必要があります。
+ DML クエリまたはビューで動的カタログを使用しているときは、それをエスケープされた二重引用符 (`\"`) で囲みます。DDL クエリで動的カタログを使用しているときは、それをバックティック文字 (```) で囲みます。

## (オプション) API を使用して、所有者アカウントに属する Athena Data Catalog を登録します。
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

ステップ 2 の説明に従って Athena コンソールを使用する代わりに、API オペレーションを使用して所有者アカウントに属するデータカタログを登録することができます。

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) リソースの作成者には、Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API オペレーションを実行するための許可が必要です。要件によっては、追加の API オペレーションへのアクセス許可が必要になる場合もあります。詳細については、「[データカタログポリシーの例](datacatalogs-example-policies.md)」を参照してください。

以下の `CreateDataCatalog` リクエストボディは、クロスアカウントアクセス用に AWS Glue カタログを登録します。

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

次のサンプルコードは、Java クライアントを使用して `DataCatalog` オブジェクトを作成します。

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

これらのステップの後、借用者が [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API オペレーションを呼び出すと、`ownerCatalog` が表示されます。

## その他のリソース
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [別のアカウントからデータカタログを登録する](data-sources-glue-cross-account.md)
+ 「*AWS Prescriptive Guidance Patterns*」ガイドの「[Amazon Athena を使用して、共有 AWS Glue Data Catalog へのクロスアカウントアクセスを設定します](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)」。　
+ 「*AWS Big Data Blog*」の「[Query cross-account AWS Glue Data Catalogs using Amazon Athena](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)」
+ 「AWS Glue デベロッパーガイド」の「[クロスアカウントアクセス許可の付与](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)」 