

# AWS Glue Data Catalog のデータベースとテーブルへのアクセスを構成する
<a name="fine-grained-access-to-glue-resources"></a>

Amazon Athena で AWS Glue Data Catalog を使用している場合は、Athena で使用されるデータベースとテーブルの Data Catalog オブジェクトのリソースレベルのポリシーを定義できます。

**注記**  
このトピックでは、データベースレベルとテーブルレベルのセキュリティについて説明します。列レベル、行レベル、およびセルレベルのセキュリティの構成については、「[Lake Formation でのデータフィルタリングとセルレベルのセキュリティ](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html)」を参照してください。

アイデンティティベースの IAM ポリシーにリソースレベルの許可を定義します。

**重要**  
このセクションでは、アイデンティティベースの IAM ポリシーにおけるリソースレベルの許可について説明します。これらはリソースベースのポリシーとは異なります。相違点の詳細については、「*IAM ユーザーガイド*」の「[アイデンティティベースのポリシーおよびリソースベースのポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)」を参照してください。

これらのタスクについては、以下のトピックを参照してください。


| このタスクを実行するには | 次のトピックを参照してください。 | 
| --- | --- | 
| リソースへのアクセスを定義する IAM ポリシーを作成する | 「IAM ユーザーガイド」の「[IAM ポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)」。 | 
| AWS Glue で使用する IAM アイデンティティベースポリシーについて説明します。 | 「AWS Glue デベロッパーガイド」の「[アイデンティティベースのポリシー (IAM ポリシー)](https://docs.aws.amazon.com/glue/latest/dg/using-identity-based-policies.html)」。 | 

 **このセクションの内容** 
+  [制限事項](#access-to-glue-resources-limitations) 
+  [AWS リージョン ごとのカタログとデータベースへの AWS Glue アクセスを構成する](#full-access-to-default-db-per-region) 
+  [AWS Glue のテーブルパーティションとバージョンのアクセス制御について](#access-to-glue-resources-table-partitions-and-versions) 
+  [データベースとテーブルレベルのアクセス許可の例](#examples-fine-grained-table-database-policies) 

## 制限事項
<a name="access-to-glue-resources-limitations"></a>

AWS Glue Data Catalog および Athena でデータベースおよびテーブルレベルのアクセス制御を使用する場合は、次の制限を考慮してください。
+ IAM アイデンティティセンターが有効な Athena ワークグループでは、IAM アイデンティティセンターの ID を使用するように Lake Formation を設定する必要があります。詳細情報については、「*AWS Lake Formation デベロッパーガイドガイド*」の「[Integrating IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)」を参照してください。
+ データベースとテーブルにのみアクセスを制限することができます。これらの制御はテーブルレベルで適用されます。テーブル内の個別パーティションへのアクセスを制限することはできません。詳細については、「[AWS Glue のテーブルパーティションとバージョンのアクセス制御について](#access-to-glue-resources-table-partitions-and-versions)」を参照してください。
+ AWS Glue Data Catalog には `CATALOG`、`DATABASE`、`TABLE`、`FUNCTION` のリソースが含まれています。
**注記**  
このリストによれば、Athena と AWS Glue Data Catalog に共通のリソースは各アカウントの `TABLE`、`DATABASE`、`CATALOG` です。`Function` は AWS Glue に固有です。Athena での削除アクションの場合、AWS Glue アクションへの許可を含める必要があります。「[データベースとテーブルレベルのアクセス許可の例](#examples-fine-grained-table-database-policies)」を参照してください。

  `CATALOG` は各アカウントのすべての `DATABASES` の祖先であり、各 `DATABASE` はそのすべての `TABLES` と `FUNCTIONS` の祖先であるという階層になっています。例えば、アカウント内のカタログでデータベース `db` に属している `table_test` という名前のテーブルの場合、その祖先は `db` とアカウント内のカタログです。データベース `db` の場合、その祖先はアカウント内のカタログであり、その子孫はテーブルおよび関数です。リソースの階層構造に関する詳細については、「*AWS Glue デベロッパーガイド*」の「[データカタログ内の ARN のリスト](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)」を参照してください。
+ `CREATE DATABASE`、`CREATE TABLE`、`SHOW DATABASE`、`SHOW TABLE`、または `ALTER TABLE` などの、リソースに対する削除以外の Athena アクションには、リソース (テーブルまたはデータベース) とそのリソースのすべての祖先でこのアクションを呼び出すための許可が必要です。例えば、テーブルの祖先は、それが属するデータベース、およびアカウントのカタログです。データベースの祖先はアカウントのカタログです。「[データベースとテーブルレベルのアクセス許可の例](#examples-fine-grained-table-database-policies)」を参照してください。
+ `DROP DATABASE` または `DROP TABLE` などの Athena での削除アクションには、データカタログ内のリソースのすべての祖先と子孫で削除アクションを呼び出すための許可も必要です。例えば、データベースを削除するには、データベース、その祖先であるカタログ、その子孫であるすべてのテーブルとユーザー定義関数に対するアクセス許可が必要です。テーブルに子孫はありません。`DROP TABLE` を実行するには、テーブル、その属する先のデータベース、カタログに対して、このアクションを呼び出すためのアクセス許可が必要です。「[データベースとテーブルレベルのアクセス許可の例](#examples-fine-grained-table-database-policies)」を参照してください。

## AWS リージョン ごとのカタログとデータベースへの AWS Glue アクセスを構成する
<a name="full-access-to-default-db-per-region"></a>

Athena が AWS Glue と連携するには、AWS リージョン ごとに、データベースおよびアカウントの AWS Glue Data Catalog へのアクセス許可を付与するポリシーが必要です。データベースを作成するには、`CreateDatabase` 許可も必要です。次のポリシー例では、AWS リージョン、AWS アカウント ID、およびデータベース名を独自のものに置き換えます。

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## AWS Glue のテーブルパーティションとバージョンのアクセス制御について
<a name="access-to-glue-resources-table-partitions-and-versions"></a>

AWS Glue では、テーブルがパーティションとバージョンを持つことができます。テーブルのバージョンとパーティションは、AWS Glue での独立したリソースとは見なされません。テーブルのバージョンとパーティションへのアクセスは、そのテーブルとその祖先リソースに対するアクセス許可を付与することで許可します。

アクセス制御を行う場合は、以下のアクセス許可を適用します。
+ 制御はテーブルレベルで適用されます。データベースとテーブルにのみアクセスを制限することができます。例えば、パーティション分割されたテーブルへのアクセスを許可すると、そのアクセス許可はそのテーブル内のすべてのパーティションに適用されます。テーブル内の個別パーティションへのアクセスを制限することはできません。
**重要**  
AWS Glue でパーティションに対してのアクションを実行するには、カタログ、データベース、テーブルレベルでパーティションアクションの許可が必要です。テーブル内のパーティションにアクセスできるだけでは十分ではありません。例えば、データベース `myDB` 内のテーブル `myTable` に対して `GetPartitions` を実行するには、カタログ、`myDB` データベース、および `myTable` リソースに対する `glue:GetPartitions` のアクセス許可を付与する必要があります。
+ アクセス制御はテーブルのバージョンには適用されません。パーティションと同様に、テーブルの以前のバージョンへのアクセス許可は、AWS Glue でテーブルとそのテーブルの祖先に対してテーブルバージョン API へのアクセス許可を介して付与されます。

AWS Glue アクションに対する許可については、「*AWS Glue デベロッパーガイド*」の「[AWS Glue API アクセス許可: アクションとリソースのリファレンス](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)」を参照してください。

## データベースとテーブルレベルのアクセス許可の例
<a name="examples-fine-grained-table-database-policies"></a>

以下の表には、Athena のデータベースとテーブルへのアクセスを許可する IAM アイデンティティベースのポリシーの例がリストされています。これらの例から開始することをお勧めします。必要に応じて特定のデータベースやテーブルの個別アクションを許可または拒否するように調整します。

これらの例には、Athena と AWS Glue が連携できるようにするデータベースとカタログへのアクセス許可が含まれます。複数の AWS リージョンの場合は、データベースとカタログごとに同様のポリシーを含めます (リージョンごとに 1 行)。

例では、`example_db` データベースと `test` テーブルを独自のデータベース名とテーブル名に置き換えます。


| DDL ステートメント | リソースへのアクセスを許可する IAM アクセスポリシーの例 | 
| --- | --- | 
| ALTER DATABASE | example\$1db データベースのプロパティを変更できます。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| CREATE DATABASE | example\$1db という名前のデータベースを作成できます。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | test という名前のテーブルを example\$1db データベースに作成できます。<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | すべてのテーブルを含む、example\$1db データベースを削除できます。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | example\$1db データベースにある test という名前のパーティション分割されたテーブルを削除できます。テーブルにパーティションがない場合は、パーティションのアクションを含めません。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | example\$1db データベースで Hive 互換パーティションを test という名前のテーブルに追加した後、カタログメタデータを更新できます。<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | AWS Glue Data Catalog のすべてのデータベースをリストすることができます。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | example\$1db データベースにあるすべてのテーブルをリストすることができます。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 