Amazon Athena
ユーザーガイド

AWS Glue データカタログ のデータベースとテーブルへのきめ細かなアクセス

AWS Glue データカタログ にアップグレードした後で、Athena で使用する次の Data Catalog オブジェクトに対するリソースレベルのポリシーを定義できます。

  • データベース

  • テーブル

これらのポリシーを使用すると、データベースやテーブルに対するきめ細かなアクセス制御を定義できます。アイデンティティベース (IAM) ポリシーのリソースレベルアクセス許可を、IAM コンソールで定義します。

重要

このセクションでは、特定のリソースへのきめ細かなアクセスを定義できるアイデンティティベース (IAM) のポリシーについて説明します。これらはリソースベースのポリシーと同じではありません。違いの詳細については、AWS Identity and Access Management ユーザーガイドの「アイデンティティベースおよびリソースベースのポリシー」を参照してください。

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

このタスクを実行するには 以下のトピックを参照してください。
リソースへのきめ細かなアクセスを定義する IAM ポリシーを作成する IAM ポリシーの作成 (AWS Identity and Access Management ユーザーガイド)。
AWS Glue で使用するアイデンティティベース (IAM) ポリシーについて説明します。 アイデンティティベースのポリシー (IAM ポリシー) (AWS Glue 開発者ガイド)。

このセクションの内容

制約事項

AWS Glue データカタログ および Athena できめ細かなアクセスコントロールを使用する際は、以下の制限事項を考慮します。

  • Athena で管理されるデータカタログから AWS Glue データカタログ にアップグレードする必要があります。

  • データベースとテーブルにのみアクセスを制限することができます。きめ細かなアクセスコントロールはテーブルレベルで適用されるため、テーブル内の個々のパーティションへのアクセスを制限することはできません。詳細については、「AWS Glue のテーブルのパーティションとバージョン」を参照してください。

  • Athena では AWS Glue データカタログ へのクロスアカウントアクセスはサポートされていません。

  • AWS Glue データカタログ には CATALOGDATABASETABLEFUNCTION のリソースが含まれています。

    注記

    このリソースのうち、Athena と AWS Glue データカタログ で共通のリソースは、各アカウントの TABLEDATABASE、および CATALOG です。FUNCTION は AWS Glue に固有ですが、Athena の削除アクションでは、データベースを削除する場合に FUNCTION へのアクセス権限を含める必要があります(「きめ細かなポリシーの例」を参照)。

    CATALOG は各アカウントのすべての DATABASES の祖先であり、各 DATABASE はそのすべての TABLESFUNCTIONS の祖先であるという階層になっています。たとえば、アカウント内のカタログでデータベース db に属している table_test という名前のテーブルの場合、その祖先は db とアカウント内のカタログです。データベース db の場合、その祖先はアカウント内のカタログであり、その子孫はテーブルおよび関数です。リソースの階層構造の詳細については、AWS Glue 開発者ガイドの「データカタログ内の ARN のリスト」を参照してください。

  • リソースに対する削除以外の Athena アクション (CREATE DATABASECREATE TABLESHOW DATABASESHOW TABLEALTER TABLE など) の場合は、リソース (テーブルまたはデータベース) および Data Catalog でのそのリソースのすべての祖先に対して、そのアクションを呼び出すためのアクセス権限が必要です。たとえば、テーブルの祖先はそのアカウント内のデータベースとカタログです。データベースの祖先はそのアカウント内のカタログです。(「きめ細かなポリシーの例」を参照)。

  • Athena での削除アクション (DROP DATABASEDROP TABLE など) の場合は、Data Catalog でのそのリソースのすべての子孫に対して、その削除アクションを呼び出すための追加のアクセス権限が必要です。たとえば、データベースを削除するには、そのデータベース、その祖先 (カタログ)、およびすべての子孫 (テーブルやユーザー定義関数) に対してアクセス権限が必要です。子孫を持たないテーブルに対して DROP TABLE を実行する場合は、そのテーブルとその祖先に対してそのアクションを呼び出すためのアクセス権限が必要です。(「きめ細かなポリシーの例」を参照)。

  • Data Catalog の特定のデータベースへのアクセスを制限する場合は、GetDatabase および CreateDatabase のアクションに対して、各 AWS リージョンの default データベースとカタログへのアクセスポリシーも指定する必要があります。複数のリージョンで Athena を使用している場合は、各リージョンの各 default データベースとカタログに対するリソース ARN のポリシーに個別の行を追加します。

    たとえば、us-east-1 (北バージニア) リージョンにある example_db へのアクセスを GetDatabase に許可するには、2 つのアクション GetDatabaseCreateDatabase に対して、そのリージョンのポリシーに default データベースとカタログも含めます。

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

必須: AWS リージョンごとの Default データベースとカタログへのアクセスポリシー

Athena が AWS Glue データカタログ と連携するには、GetDatabaseCreateDatabase に対する、default データベースと AWS Glue データカタログ へのアクセスポリシーが AWS リージョンごとに存在している必要があります。

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

AWS Glue のテーブルのパーティションとバージョン

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

これは、きめ細かなアクセスコントロールでは次のことを意味します。

  • きめ細かなアクセスコントロールはテーブルレベルで適用されます。データベースとテーブルにのみアクセスを制限することができます。たとえば、パーティション分割されたテーブルへのアクセスを許可すると、そのアクセス権はそのテーブル内のすべてのパーティションに適用されます。テーブル内の個別パーティションへのアクセスを制限することはできません。

    重要

    テーブル内のすべてのパーティションへのアクセス権があっても、AWS Glue でパーティションに対するアクションを実行する場合には十分ではありません。パーティションに対してアクションを実行するには、そのアクションに対するアクセス権限が必要です。たとえば、myDB データベース内の myTable テーブルに対して GetPartitions を実行するには、Data Catalog、myDB データベース、および myTable テーブルで glue:GetPartitions アクションに対するアクセス権限が必要です。

  • きめ細かなアクセスコントロールはテーブルバージョンには適用されません。パーティションと同様に、テーブルの以前のバージョンへのアクセス権は、AWS Glue でテーブルとそのテーブルの祖先に対してテーブルバージョン API へのアクセス権を介して付与されます。

AWS Glue アクションに対するアクセス権限の詳細については、AWS Glue 開発者ガイドの「AWS Glue API のアクセス権限: アクションとリソースのリファレンス」を参照してください。

テーブルとデータベースのきめ細かなアクセス許可の例

以下の表に示しているのは、Athena のデータベースおよびテーブルへのきめ細かなアクセスを許可する、アイデンティティベース (IAM) ポリシーの例です。

IAM ポリシーの場合と同様に、IAM コンソールでこれらのポリシーを定義します。これらの例から開始することをお勧めします。必要に応じて特定のデータベースやテーブルの個別アクションを許可または拒否するように調整します。

以下の例では、GetDatabase および CreateDatabase アクションに対する、default データベースとカタログへのアクセスポリシーが含まれています。このポリシーは、Athena と AWS Glue データカタログ が連携するために必要です。複数の AWS リージョンを利用している場合は、各 default データベースとカタログに対して、リージョンごとに 1 行、このポリシーを含めます。

さらに、example_db データベースと test テーブル名を使用するデータベースとテーブルの名前に置き換えます。

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