Amazon Redshift Spectrum 用の IAM ポリシー - Amazon Redshift

Amazon Redshift Spectrum 用の IAM ポリシー

デフォルトでは、Amazon Redshift Spectrum は AWS Glue をサポートする AWS リージョンで AWS Glue Data Catalog を使用します。その他の AWS リージョンでは、Redshift Spectrum は Athena データカタログを使用します。クラスターには、AWS Glueまたは Athena に置かれた外部データカタログや、Amazon S3 内のデータファイルにアクセスするための許可が必要です。この認証は、クラスターにアタッチされた AWS Identity and Access Management (IAM) ロールを参照することで提供できます。Apache Hive メタストアを使用してデータカタログを管理している場合は、Athena へのアクセスを提供する必要はありません。

ロールを連鎖することで、クラスターがそのクラスターにアタッチされていない別のロールを引き受けることができます。詳細については、「Amazon Redshift Spectrum での IAM ロールの連鎖」を参照してください。

アクセスする AWS Glue カタログは、セキュリティを強化するために暗号化されている可能性があります。AWS Glue カタログが暗号化されている場合、AWS KMSカタログにアクセスするために AWS Glue の AWS Glue キーが必要です。詳細については、AWS Glueデベロッパーガイドの「AWS Glue データカタログの暗号化」を参照してください。

注記

現在、Athena データカタログに Redshift Spectrum 外部テーブルがある場合は、Athena データカタログを AWS Glue データカタログに移行することが可能です。Redshift Spectrum で AWS Glue データカタログを使用するには、IAM ポリシーの変更が必要になる場合があります。詳細については、Athena ユーザーガイドの「AWS Glue データカタログへのアップグレード」を参照してください。

Amazon S3 のアクセス許可

少なくとも、クラスターには Amazon S3 バケットへの GET および LIST アクセスが必要です。バケットがクラスターと同じ AWS アカウントに存在しない場合、バケットは、データにアクセスするための許可をクラスターに付与する必要もあります。詳細については、「ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを認可する」を参照してください。

注記

Amazon S3 バケットは、特定の VPC エンドポイントからのアクセスのみを制限するバケットポリシーを使用できません。

次のポリシーは、あらゆる Amazon S3 バケットに GET および LIST アクセスを付与します。このポリシーは、Redshift Spectrum が COPY 操作と同様に Amazon S3 バケットへアクセスするのを許可します。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "*" }] }

次のポリシーは、myBucket という名前の Amazon S3 バケットへの GET および LIST アクセスを付与します。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*" }] }

クロスアカウント Amazon S3 のアクセス許可

別の AWS アカウントに属している Amazon S3 バケット内のデータにアクセスできる許可を Redshift Spectrum に付与するには、次のポリシーを Amazon S3 バケットに追加します。詳細については、「クロスアカウントのバケットのアクセス許可を付与」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::redshift-account:role/spectrumrole" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/*" ] } ] }

Redshift Spectrum を使用したアクセスを付与あるいは制限するポリシー

Redshift Spectrum のみを使用して Amazon S3 バケットへのアクセスを許可するには、ユーザーエージェント AWS Redshift/Spectrum のアクセスを許可する条件を含めます。次のポリシーでは、Redshift Spectrum だけが Amazon S3 バケットにアクセスできます。COPY 操作など、その他のアクセスは除外されます。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

同様に、COPY 操作のアクセスは許可し、Redshift Spectrum のアクセスは除外する IAM ロールを作成することもできます。これを行うには、ユーザーエージェント AWS Redshift/Spectrum のアクセスを拒否する条件を含めます。次のポリシーは、Redshift Spectrum を除いて、Amazon S3 バケットへのアクセスを許可します。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringNotEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

最小限のアクセス許可を付与するポリシー

次のポリシーは、Redshift Spectrum を Amazon S3、AWS Glue、および Athena で使用するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/folder1/folder2/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:UpdateDatabase", "glue:CreateTable", "glue:DeleteTable", "glue:BatchDeleteTable", "glue:UpdateTable", "glue:GetTable", "glue:GetTables", "glue:BatchCreatePartition", "glue:CreatePartition", "glue:DeletePartition", "glue:BatchDeletePartition", "glue:UpdatePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition" ], "Resource": [ "*" ] } ] }

AWS Glue の代わりに Athena をデータカタログに使用する場合、このポリシーには Athena に対する完全なアクセス許可が必要となります。次のポリシーは、Athena リソースへのアクセスを付与します。外部データベースが Hive メタストアにある場合は、Athena アクセスは必要ありません。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["athena:*"], "Resource": ["*"] }] }

Amazon Redshift Spectrum での IAM ロールの連鎖

クラスターにロールをアタッチすると、クラスターはそのロールを引き受けて、ユーザーに代わって Amazon S3、Athena、および AWS Glue にアクセスできるようになります。クラスターにアタッチされたロールに必要なリソースへのアクセスがない場合、他のアカウントに属している可能性がある別のロールを連鎖することができます。クラスターは、このデータにアクセスするための連鎖ロールを一時的に引き受けます。また、ロールを連鎖してクロスアカウントアクセスを付与することもできます。最大で 10 個のロールを連鎖できます。連鎖における各ロールは、クラスターが連鎖の末尾のロールを引き受けるまで、連鎖の次のロールを引き受けます。

ロールを連鎖するには、ロール間で信頼関係を確立します。別のロールを引き受けるロールには、特定のロールを引き受けることができるアクセス権限ポリシーがあることが必要です。また、アクセス許可を渡すロールは、別のロールにアクセス許可を渡すことができる信頼ポリシーを保持していることが必要です。詳細については、Amazon Redshift で IAM ロールを連鎖するを参照してください。

CREATE EXTERNAL SCHEMA コマンドを実行すると、ロールの ARN のカンマ区切りのリストを含めることで、ロールを連鎖することができます。

注記

連鎖したロールのリストは、空白を含むことができません。

次の例では、MyRedshiftRoleがクラスターにアタッチされます。MyRedshiftRole は、アカウント AcmeData に属するロール 111122223333 を引き受けます。

create external schema acme from data catalog database 'acmedb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole,arn:aws:iam::111122223333:role/AcmeData';

AWS Glue データカタログへのアクセスの制御

データカタログに AWS Glue を使用する場合、IAM ポリシーで AWS Glue データカタログにきめ細かなアクセスコントロールを適用できます。例えば、特定の IAM ロールに少数のデータベースとテーブルのみを公開する場合があります。

以下のセクションで、AWS Glueデータカタログに保存されているデータへのさまざまなレベルアクセスの IAM ポリシーについて説明します。

データベース操作のポリシー

データベースを表示および作成するアクセス許可をユーザーに付与する場合、ユーザーにはデータベースと AWS Glue データカタログの両方へのアクセス権限が必要です。

次のサンプルクエリは、データベースを作成します。

CREATE EXTERNAL SCHEMA example_db FROM DATA CATALOG DATABASE 'example_db' region 'us-west-2' IAM_ROLE 'arn:aws:iam::redshift-account:role/spectrumrole' CREATE EXTERNAL DATABASE IF NOT EXISTS

次の IAM ポリシーは、データベースを作成するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

次のサンプルクエリは、現在のデータベースを表示します。

SELECT * FROM SVV_EXTERNAL_DATABASES WHERE databasename = 'example_db1' or databasename = 'example_db2';

次の IAM ポリシーは、現在のデータベースを表示するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabases" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db1", "arn:aws:glue:us-west-2:redshift-account:database/example_db2", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

テーブル操作のポリシー

テーブルで表示、作成、削除、変更またはその他のアクションを実行するアクセス許可をユーザーに付与する場合、ユーザーにいくつかのタイプのアクセスを許可する必要があります。テーブルそのものに加え、テーブルが属するデータベース、およびカタログへのアクセス許可が必要です。

次のサンプルクエリは、外部テーブルを作成します。

CREATE EXTERNAL TABLE example_db.example_tbl0( col0 INT, col1 VARCHAR(255) ) PARTITIONED BY (part INT) STORED AS TEXTFILE LOCATION 's3://test/s3/location/';

次の IAM ポリシーは、外部テーブルを作成するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

次のサンプルクエリは、それぞれ現在の外部テーブルを表示します。

SELECT * FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT * FROM svv_external_columns WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT parameters FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';

次の IAM ポリシーは、現在の外部テーブルを表示するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl1" ] } ] }

次のサンプルクエリは、既存のテーブルを変更します。

ALTER TABLE example_db.example_tbl0 SET TABLE PROPERTIES ('numRows' = '100');

次の IAM ポリシーは、既存のテーブルを変更するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:UpdateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

次のサンプルクエリは、既存のテーブルを削除します。

DROP TABLE example_db.example_tbl0;

次の IAM ポリシーは、既存のテーブルを削除するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeleteTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

パーティション操作のポリシー

パーティションレベルの操作 (表示、作成、削除、変更など) を実行するアクセス許可をユーザーに付与する場合、ユーザーにはパーティションが属するテーブルへのアクセス許可が必要です。また、関連するデータベースと AWS Glue データカタログへのアクセス許可も必要です。

次のサンプルクエリは、パーティションを作成します。

ALTER TABLE example_db.example_tbl0 ADD PARTITION (part=0) LOCATION 's3://test/s3/location/part=0/'; ALTER TABLE example_db.example_t ADD PARTITION (part=1) LOCATION 's3://test/s3/location/part=1/';

次の IAM ポリシーは、パーティションを作成するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:BatchCreatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

次のサンプルクエリは、現在のパーティションを表示します。

SELECT * FROM svv_external_partitions WHERE schemname = 'example_db' AND tablename = 'example_tbl0'

次の IAM ポリシーは、現在のパーティションを表示するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartitions", "glue:GetTables", "glue:GetTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

次のサンプルクエリは、既存のパーティションを変更します。

ALTER TABLE example_db.example_tbl0 PARTITION(part='0') SET LOCATION 's3://test/s3/new/location/part=0/';

次の IAM ポリシーは、既存のパーティションを変更するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartition", "glue:UpdatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

次のサンプルクエリは、既存のパーティションを削除します。

ALTER TABLE example_db.example_tbl0 DROP PARTITION(part='0');

次の IAM ポリシーは、既存のパーティションを削除するために必要な最小限のアクセス許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeletePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }