如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

阅读数:2 2019 年 12 月 27 日 11:30

如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

执行 Redshift Spectrum 查询

现在,已在 AWS Glue 数据目录中创建客户表,下面我们来使用 Redshift Spectrum 查询该表。

  1. 从您的查询工具登录 Amazon Redshift 集群。

  2. 运行下面的语句,为 Redshift Spectrum 创建一个称为

    spectrumxacct 的外部架构,以指向 AWS Glue 数据目录数据库。此数据库在账户 B 中为

    spectrumdb_account_b,已在 AWS Glue 控制台中创建。

    SQL

复制代码
drop schema if exists spectrumxacct;
create external schema spectrumxacct
from data catalog
database 'spectrumdb_account_b'
iam_role '<IAM role ARN of redshift_role_account_b,IAM role ARN of xacct_kms_role_account_b>'
create external database if not exists;
复制代码
** 注意:** 替换账户 B 中的 IAM 角色 ARN,用逗号隔开,周围不加任何空格。
  1. 运行下面的示例查询,以确认 Redshift Spectrum 可以成功查询数据。

    SQL

复制代码
select * from spectrumxacct.customer limit 10;

如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

注意:Redshift Spectrum 使用账户 B 中的 AWS Glue 数据目录,而非账户 A。

选项 2:账户 A 中的 AWS Glue 数据目录

****如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

设置权限

1. 登录账户 A 的 AWS 控制台,然后将 AWS 区域更改为 us-west-2(俄勒冈)

  • 复制代码
    a) 创建以下 IAM 策略:

• rs-xacct-bucket-policy,可授予对账户 A 中的 S3 存储桶的访问权限
• rs_xacct_kms_policy,可授予对账户 A 中的 CMK 的访问权限

策略名称:rs_xacct_bucket_policy

注意:将存储桶名称 rs-xacct-kms-bucket 替换为您的存储桶名称。

Json

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::rs-xacct-kms-bucket/*",
"arn:aws:s3:::rs-xacct-kms-bucket"
]
}
]
}

策略名称:rs_xacct_kms_policy

注意:<ARN of kms_key_account_a from Account A> 替换为账户 A 中的 KMS 密钥 ARN。

Json

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUseOfTheKey",
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": [
"<ARN of kms_key_account_a from Account A>"
]
},
{
"Sid": "AllowAttachmentOfPersistentResources",
"Effect": "Allow",
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": [
"<ARN of kms_key_account_a from Account A>"
],
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": true
}
}
}
]
}

b) 为具有以下 IAM 策略的 Amazon Redshift 服务创建称为
xacct_kms_role_account_b 的新 IAM 角色:


rs_xacct_bucket_policy

rs_xacct_kms_policy

AWSGlueConsoleFullAccess(此托管策略为 AWS Glue 数据目录提供必需权限)

保存 IAM 角色 ARN,供稍后使用。

c) 通过选择编辑信任关系并将现有信任策略替换为以下内容来更改 IAM 角色
xacct_kms_role_account_a 的信任关系:

注意:<Account B> 替换为账户 B 的 AWS 账户 ID。

Json

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "redshift.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account B>:root"
},
"Action": "sts:AssumeRole"
}
]
}

d) 创建称为
glue_service_role_account_a 的 AWS Glue 服务 IAM 角色,并附加以下策略:


AWSGlueServiceRole(AWS 托管策略)

rs_xacct_bucket_policy(早前创建的托管策略)

rs_xacct_kms_policy(早前创建的托管策略)

注意:务必将 glue_service_role_account_a 更新为您自己的 IAM 角色

2. 登录账户 B 的 AWS 控制台,并在尚未选择的情况下,将 AWS 区域更改为 us-west-2(俄勒冈)

a) 修改现有的 IAM 策略
rs_xacct_assume_role_policy,并将现有的 JSON 策略替换为以下内容:

****注意:替换 <ARN for IAM role xacct_kms_role_account_a from Account A>

Json

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1487639602000",
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"<ARN for IAM role xacct_kms_role_account_a from Account A>"
]
}
]
}

执行 Amazon Redshift COPY

1. 从您的查询工具登录 Amazon Redshift 集群并使用下面的 DDL 创建
客户表。

SQL

复制代码
CREATE TABLE customer
(
c_custkey INTEGER NOT NULL,
c_name VARCHAR(25) NOT NULL,
c_address VARCHAR(25) NOT NULL,
c_city VARCHAR(10) NOT NULL,
c_nation VARCHAR(15) NOT NULL,
c_region VARCHAR(12) NOT NULL,
c_phone VARCHAR(15) NOT NULL,
c_mktsegment VARCHAR(10) NOT NULL
);

2. 现在,您应该能够成功地运行下面的 COPY 语句。

SQL

复制代码
copy customer from 's3://rs-xacct-kms-bucket/customer/'
iam_role '<ARN for IAM role redshift_role_account_b from Account B,<ARN for IAM role xacct_kms_role_account_a from Account A>'
gzip
region 'us-west-2';

注意:替换 IAM 角色 ARN,用逗号隔开,周围不加任何空格。

3. 运行示例查询,以验证数据已成功加载。

SQL

复制代码
select * from customer limit 10;

如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

为要查询的 Redshift Spectrum 设置 AWS Glue 数据目录表

现在,我们在账户 A 中创建 AWS Glue 爬网程序,以对相同的
客户数据进行爬网,并按照下面的步骤在账户 A 的 AWS Glue 数据目录数据库
spectrumdb_account_a 中创建称为客户的表:

按照选项 1 中列出的步骤操作,并使用下面的更改运行爬网程序:

  1. 这一次,在账户 A 中创建爬网程序(与选项 1 中的账户 B 相反)。

  2. 在账户 A 中创建 AWS Glue 数据目录数据库

    spectrumdb_account_a(与账户 B 中的

    spectrumdb_account_b 相反,然后为爬网程序选择该数据库以创建

    客户表。

  3. 提供 S3 路径的同时,选择选项我的账户中的指定路径 (与为选项 1 选择的另一个账户中的指定路径不同)。

  4. 确保将早前创建的

    glue_service_role_account_a 用作 AWS Glue 服务 IAM 角色。=

执行 Redshift Spectrum 查询 **

**

现在,已在 AWS Glue 数据目录中创建
客户表,下面我们来使用 Redshift Spectrum 查询该表。

1. 从您的查询工具登录 Amazon Redshift 集群,并运行下面的语句。这将会为 Redshift Spectrum 创建一个称为
spectrumxacct2 的外部架构,该架构指向账户 A 中的 AWS Glue 数据目录数据库
spectrumdb_account_a(早前从 AWS Glue 控制台中创建)。

SQL

复制代码
drop schema if exists spectrumxacct2;
create external schema spectrumxacct2
from data catalog
database 'spectrumdb_account_a'
iam_role '<ARN for IAM role redshift_role_account_b from Account B,<ARN for IAM role xacct_kms_role_account_a from Account A>'
create external database if not exists;

注意:替换 IAM 角色 ARN,用逗号隔开,周围不加任何空格。

2. 运行下面的查询,该查询应成功运行。

SQL

复制代码
select * from spectrumxacct2.customer limit 10;

如何为 Amazon S3 中的 AWS KMS 加密数据启用跨账户 Amazon Redshift COPY 和 Redshift Spectrum 查询(四)

注意:Spectrum 使用账户 A 中的 AWS Glue 数据目录,而非账户 B_。_

小结

此博文显示了如何使用 Redshift Spectrum 为 Amazon S3 中的示例 KMS 加密数据集设置跨账户 Amazon Redshift COPY 和查询的逐步演练。它演示了两种解决方案选项,可根据您希望将哪个账户的 AWS Glue 目录用于 Redshift Spectrum 进行选择。

本文转载自 AWS 技术博客。

原文链接: https://amazonaws-china.com/cn/blogs/china/how-to-enable-cross-account-amazon-redshift-copy-and-redshift-spectrum-query-for-aws-kms-encrypted-data-in-amazon-s3/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布