使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何将 Amazon Redshift 中的数据复制或卸载到其他账户中的 Amazon S3 存储桶?

3 分钟阅读
0

我想将 Amazon Redshift 中的数据复制或卸载到其他 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。但我无法在其他账户中代入 AWS Identity and Access Management (IAM) 角色。我需要设置跨账户访问权限。

简短描述

要访问不同账户中的 Amazon S3 资源,请完成以下步骤:

  1. 在 Amazon S3 账户 (RoleA) 中创建 IAM 角色。
  2. 在 Amazon Redshift 账户 (RoleB) 中创建具有代入 RoleA 权限的 IAM 角色。
  3. 测试 RoleARoleB 之间的跨账户访问。

**注意:**上述步骤同时适用于 Redshift Serverless 和 Redshift 预调配的数据仓库,适用于所有数据格式。但是,您可能需要修改某些数据格式的 COPYUNLOAD 命令语法。例如,如果您使用 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 区域中。如果您的集群和存储桶位于不同的区域,则必须在 COPYUNLOAD 命令中添加 REGION 参数。

在使用 Amazon S3 (RoleA) 的账户中创建 IAM 角色

完成以下步骤:

  1. 打开 IAM 控制台
  2. 选择 Policies(策略),然后选择 Create policy(创建策略)。
  3. 选择 JSON 选项卡,然后输入以下 IAM 策略:
    **注意:**如果 S3 存储桶未使用 AWS Key Management Service (AWS KMS) 密钥加密,请移除 AWS KMS 权限。
    {  
       "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/*"  
          ]  
        }  
      ]  
    }
    **注意:**将 awsexamplebucket 替换为 S3 存储桶的名称。如果您使用 AWS KMS 密钥加密,请将 KMS_KEY_ARN_A_Used_for_S3_encryption 替换为 AWS KMS 密钥的 ARN。
  4. 选择 Review policy(查看策略)。
  5. 输入策略的名称,然后选择 Create policy(创建策略)。
  6. 在导航窗格中,选择 Roles(角色)。
  7. 选择 Create role(创建角色)。
  8. 选择 Another AWS account(其他 AWS 账户)作为可信实体角色。
  9. 输入使用 Amazon Redshift 的账户的账户 ID
  10. 选择 Next: Permissions(下一步:权限),然后选择策略。
  11. (可选)选择 Next: Tags(下一步:标签),然后添加标签。
  12. 选择 Next: Review(下一步:查看)。
  13. 输入角色名称。
  14. 选择 Create role(创建角色)。

在 Amazon Redshift 账户中创建具有代入 RoleA 权限的 IAM 角色 (RoleB)

完成以下步骤:

  1. 打开 IAM 控制台
  2. 选择 Policies(策略),然后选择 Create policy(创建策略)。
  3. 选择 JSON 选项卡,然后输入以下 IAM 策略:
    {  
      "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Sid": "CrossAccountPolicy",  
          "Effect": "Allow",  
          "Action": "sts:AssumeRole",  
          "Resource": "AmazonS3AccountRoleARN"  
        }  
      ]  
    }
    **注意:**将 AmazonS3AccountRoleARN 替换为 RoleA 的 ARN (arn:aws:iam::Amazon_S3_Account_ID:role/RoleA)。
  4. 选择 Review policy(查看策略)。
  5. 输入策略的名称,然后选择 Create policy(创建策略)。
  6. 在导航窗格中,选择 Roles(角色)。
  7. 选择 Create role(创建角色)。
  8. 选择 AWS service(AWS 服务)作为您的可信实体类型。
  9. 选择 Redshift
  10. 选择 Redshift - Customizable(Redshift - 可自定义)。
  11. 选择 Next: Permissions(下一步:权限),然后选择策略。
  12. (可选)选择 Next: Tags(下一步:标签),然后添加标签。
  13. 选择 Next: Review(下一步:查看)。
  14. 输入角色名称。
  15. 选择 Create role(创建角色)。
  16. 将 RoleB 附加到您的 Amazon Redshift 集群:
    对于预调配的 Redshift 集群,请参阅将 IAM 角色与您的集群关联
    -或-
    对于 Redshift Serverless,请参阅向 Amazon Redshift Serverless 授予权限

**注意:**当您在 Amazon Redshift 中链接 IAM 角色时,Amazon Redshift 集群将代入 RoleB,然后 RoleB 代入 RoleA

测试您的 S3 存储桶和 Amazon Redshift 之间的跨账户访问

完成以下步骤:

  1. 运行 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;
  2. 要验证是否授予跨账户访问,请运行 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

相关信息

如何提供对 Amazon S3 存储桶中对象的跨账户访问权限?

如何从另一个 AWS 账户复制 S3 对象?

COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限

AWS 官方
AWS 官方已更新 3 个月前