如何将 Amazon Redshift 中的数据复制或卸载到其他账户中的 Amazon S3 存储桶?
3 分钟阅读
0
我想将 Amazon Redshift 中的数据复制或卸载到其他 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。但我无法在其他账户中代入 AWS Identity and Access Management (IAM) 角色。我需要设置跨账户访问权限。
简短描述
要访问不同账户中的 Amazon S3 资源,请完成以下步骤:
- 在 Amazon S3 账户 (RoleA) 中创建 IAM 角色。
- 在 Amazon Redshift 账户 (RoleB) 中创建具有代入 RoleA 权限的 IAM 角色。
- 测试 RoleA 和 RoleB 之间的跨账户访问。
**注意:**上述步骤同时适用于 Redshift Serverless 和 Redshift 预调配的数据仓库,适用于所有数据格式。但是,您可能需要修改某些数据格式的 COPY 和 UNLOAD 命令语法。例如,如果您使用 Parquet 数据格式,则必须使用以下语法:
COPY table_name FROM 's3://awsexamplebucket/crosscopy1.csv' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA FORMAT AS PARQUET;
解决方法
**注意:**以下过程假定 Amazon Redshift 集群和 S3 存储桶位于同一 AWS 区域中。如果您的集群和存储桶位于不同的区域,则必须在 COPY 或 UNLOAD 命令中添加 REGION 参数。
在使用 Amazon S3 (RoleA) 的账户中创建 IAM 角色
完成以下步骤:
- 打开 IAM 控制台。
- 选择 Policies(策略),然后选择 Create policy(创建策略)。
- 选择 JSON 选项卡,然后输入以下 IAM 策略:
**注意:**如果 S3 存储桶未使用 AWS Key Management Service (AWS KMS) 密钥加密,请移除 AWS KMS 权限。
**注意:**将 awsexamplebucket 替换为 S3 存储桶的名称。如果您使用 AWS KMS 密钥加密,请将 KMS_KEY_ARN_A_Used_for_S3_encryption 替换为 AWS KMS 密钥的 ARN。{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": [ "<KMS_KEY_ARN_A_Used_for_S3_encryption>" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::awsexamplebucket", "arn:aws:s3:::awsexamplebucket/*" ] } ] }
- 选择 Review policy(查看策略)。
- 输入策略的名称,然后选择 Create policy(创建策略)。
- 在导航窗格中,选择 Roles(角色)。
- 选择 Create role(创建角色)。
- 选择 Another AWS account(其他 AWS 账户)作为可信实体角色。
- 输入使用 Amazon Redshift 的账户的账户 ID。
- 选择 Next: Permissions(下一步:权限),然后选择策略。
- (可选)选择 Next: Tags(下一步:标签),然后添加标签。
- 选择 Next: Review(下一步:查看)。
- 输入角色名称。
- 选择 Create role(创建角色)。
在 Amazon Redshift 账户中创建具有代入 RoleA 权限的 IAM 角色 (RoleB)
完成以下步骤:
- 打开 IAM 控制台。
- 选择 Policies(策略),然后选择 Create policy(创建策略)。
- 选择 JSON 选项卡,然后输入以下 IAM 策略:
**注意:**将 AmazonS3AccountRoleARN 替换为 RoleA 的 ARN (arn:aws:iam::Amazon_S3_Account_ID:role/RoleA)。{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "AmazonS3AccountRoleARN" } ] }
- 选择 Review policy(查看策略)。
- 输入策略的名称,然后选择 Create policy(创建策略)。
- 在导航窗格中,选择 Roles(角色)。
- 选择 Create role(创建角色)。
- 选择 AWS service(AWS 服务)作为您的可信实体类型。
- 选择 Redshift。
- 选择 Redshift - Customizable(Redshift - 可自定义)。
- 选择 Next: Permissions(下一步:权限),然后选择策略。
- (可选)选择 Next: Tags(下一步:标签),然后添加标签。
- 选择 Next: Review(下一步:查看)。
- 输入角色名称。
- 选择 Create role(创建角色)。
- 将 RoleB 附加到您的 Amazon Redshift 集群:
对于预调配的 Redshift 集群,请参阅将 IAM 角色与您的集群关联。
-或-
对于 Redshift Serverless,请参阅向 Amazon Redshift Serverless 授予权限。
**注意:**当您在 Amazon Redshift 中链接 IAM 角色时,Amazon Redshift 集群将代入 RoleB,然后 RoleB 代入 RoleA。
测试您的 S3 存储桶和 Amazon Redshift 之间的跨账户访问
完成以下步骤:
-
运行 COPY 命令以将数据从 S3 存储桶导入到 Amazon Redshift:
COPY table_name FROM 's3://awsexamplebucket/crosscopy1.csv' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' DELIMITER ',' REMOVEQUOTES;
-
要验证是否授予跨账户访问,请运行 UNLOAD 命令将数据从 Amazon Redshift 卸载到您的 S3 存储桶:
UNLOAD ('SELECT * FROM table_name') TO 's3://awsexamplebucket/folder/table_name_' IAM_ROLE 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' KMS_KEY_ID 'ARN_KMS_KEY_ID' ENCRYPTED;
**注意:**在前面的命令中,替换以下值:
- **table_name:**要将 Amazon S3 数据复制到的 Amazon Redshift 表
- **s3://awsexamplebucket/crosscopy1.csv:**要从中复制数据的 S3 文件路径
- Amazon_Redshift_Account_ID:Amazon Redshift 账户的账户 ID
- Amazon_S3_Account_ID:Amazon S3 账户的账户 ID
- (可选)**ARN_KMS_KEY_ID:**用于加密 S3 存储桶的 KMS 密钥 ID 的 ARN
相关信息
AWS 官方已更新 3 个月前
没有评论
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前