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

注意

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

Amazon S3 权限

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

注意

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

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

{ "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 和 UNLOAD 操作。

{ "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 和 UNLOAD 操作,但排除 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 担任属于账户 210987654321 的角色 AcmeData

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