Amazon Redshift
数据库开发人员指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Redshift Spectrum 的 IAM 策略

默认情况下,Amazon Redshift Spectrum 在支持 AWS Glue 的 AWS 区域中使用 AWS Glue 数据目录。在其他 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 Glue 的 AWS KMS 密钥来访问 AWS Glue 目录。有关更多信息,请参阅 AWS Glue 开发人员指南 中的加密 AWS Glue 数据目录

注意

如果您当前在 Athena 数据目录中有 Redshift Spectrum 外部表,则可以将您的 Athena 数据目录迁移到 AWS Glue 数据目录。要将 AWS Glue 数据目录用于 Redshift Spectrum,您可能需要更改您的 IAM 策略。有关更多信息,请参阅 Athena 用户指南 中的升级到 AWS Glue 数据目录

Amazon S3 权限

您的集群至少需要对 Amazon S3 存储桶的 GET 和 LIST 访问权限。如果您的存储桶与您的集群没有位于同一个 AWS 账户中,则您的存储桶还必须授权您的集群访问数据。有关更多信息,请参阅代表您授权 Amazon Redshift 访问其他 AWS 服务

注意

Amazon S3 存储桶不能使用将访问限制为仅通过特定 VPC 终端节点的存储桶策略。

以下策略将授予对任何 Amazon S3 存储桶的 GET 和 LIST 访问权限。该策略允许访问 Amazon S3 存储桶以进行 Redshift Spectrum 和 COPY 操作。

{ "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 权限

要向 Redshift Spectrum 授权访问属于其他 AWS 账户的 Amazon S3 存储桶中的数据,请将以下策略添加到 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"}} }] }

同样,您可能需要创建 IAM 角色来允许 COPY 操作,但排除 Redshift Spectrum 访问。为此,请包含拒绝用户代理“AWS Redshift/Spectrum”访问权限的条件。以下策略允许访问 Amazon S3 存储桶,但排除了 Redshift Spectrum。

{ "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": [ "*" ] } ] }

如果您将 Athena 用于数据目录,而不是 AWS Glue,则策略需要完全 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 策略将细粒度访问控制应用于数据目录。例如,您可能希望仅将少数数据库和表公开给特定的 IAM 角色。

以下各部分描述了一些 IAM 策略,它们针对存储在 AWS Glue 数据目录中的数据进行各种级别的访问。

数据库操作的策略

如果要授予用户查看和创建数据库的权限,则同时需要数据库和 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" ] } ] }