如何设置从 Amazon QuickSight 到另一个账户中的 Amazon S3 存储桶的跨账户访问?

上次更新时间:2021 年 5 月 24 日

我正在尝试使用来自另一个账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶的数据在 Amazon QuickSight 中创建数据集。我该如何操作?

简短描述

假设账户 A 是您的 Amazon QuickSight 实例所在的位置,账户 B 是您的 Amazon S3 存储桶所在的位置。您可以使用以下步骤创建从 Amazon QuickSight 到另个一账户中的加密 Amazon S3 存储桶的跨账户访问:

1.    在账户 B(S3 存储桶所在的位置)中更新 Amazon S3 存储桶策略。

2.    将 Amazon S3 存储桶(账户 B)添加为 Amazon QuickSight 服务角色(账户 A)可访问的资源。

3.    允许您的 Amazon QuickSight 服务角色(账户 A)访问 Amazon S3 存储桶(账户 B)的 KMS 密钥。

注意:本文假定您的 Amazon S3 存储桶已加密。最佳实践还包括使用 KMS 密钥对您的 Amazon S3 存储桶进行加密。有关如何为 S3 启用默认加密的更多信息,请参阅启用 Amazon S3 默认存储桶加密

解决方法

在账户 B(S3 存储桶所在的位置)中更新 Amazon S3 存储桶策略

要设置从 Amazon QuickSight 到 Amazon S3 的跨账户访问,请执行以下步骤:

1.    更新 Amazon S3 存储桶的存储桶策略(账户 B),如以下示例中所示:

{
    "Version": "2012-10-17",
    "Id": "BucketPolicy",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<Account A>:role/service-role/aws-quicksight-service-role-v0"
            },
            "Action": ["s3:ListBucket", "s3:GetObject", "s3:GetObjectVersion" ], 
            "Resource": [
                "arn:aws:s3:::cross-account-qstest-bucket",
                "arn:aws:s3:::cross-account-qstest-bucket/*"
            ]
        }
    ]
}

注意:如果账户 A 中存在 aws-quicksight-s3-consumers-role-v0 角色,请确保改用此角色。将 aws-quicksight-service-role-v0 替换为 aws-quicksight-s3-consumers-role-v0,以避免与 Amazon S3 的任何连接问题。

2.    将您的 Amazon QuickSight 服务角色(来自账户 A)添加到可访问 Amazon S3 存储桶的 KMS 密钥的用户列表中:

aws kms create-grant --key-id <KMS key ARN> --grantee-principal <Amazon QuickSight Role ARN> --operations Decrypt

注意:要获取 KMS 密钥 ARN,请打开 Amazon S3 控制台。转到包含数据文件的 Amazon S3 存储桶,然后选择 Properties (属性) 选项卡。密钥 ARN 位于 Default encryption (默认加密) 下。

要获取 Amazon QuickSight 服务角色 ARN,请在 Amazon QuickSight 订阅所在的账户 A 中打开 AWS Identity Access Management (IAM) 控制台。从左侧的导航窗格中选择 Roles (角色)。搜索 aws-quicksight-service-role,然后选择您的 Amazon QuickSight 服务角色。复制服务角色 ARN。

注意:如果账户 A 中存在 aws-quicksight-s3-consumers-role-v0 角色,请确保改用此角色。否则,当您尝试连接到 Amazon S3 时,可能会收到错误消息。

将 Amazon S3 存储桶(账户 B)添加为 Amazon QuickSight 服务角色(账户 A)可访问的资源

要允许您的 Amazon QuickSight 服务角色访问另一个账户中的 Amazon S3 存储桶,请执行以下步骤:

1.    打开 Amazon QuickSight 控制台

2.    选择 Manage QuickSight(管理 QuickSight)。

3.    选择 Security & permissions(安全性和权限)。

4.    选择 Add or remove (添加或删除)

5.    选择 Details(详细信息)。

6.    选择 Select S3 buckets(选择 S3 存储桶)。

7.    选择 S3 buckets that you can access across AWS(您可以跨 AWS 访问的 S3 存储桶)选项卡,以验证您的 S3 存储桶已列入 Amazon QuickSight 访问权限。

8.    (可选)如果您的 Amazon S3 存储桶未列出,请在 Use a different bucket (使用不同的存储桶) 下添加您的存储桶。

9.    选择 Finish(完成)。

允许 Amazon QuickSight 服务角色(账户 A)访问 Amazon S3 存储桶(账户 B)的 KMS 密钥

向账户 A 中的 Amazon QuickSight 服务角色 Add the following in-line IAM policy(添加以下内联 IAM 策略添):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ExampleStmt3",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": ""arn:aws:kms:us-east-1:<account ID of your S3 bucket>:key/<KEYID>"
        }
    ]
}

此更新的策略允许 Amazon QuickSight 服务角色访问 Amazon S3 存储桶所在的账户 B 中的 KMS 密钥。请确保以内联方式添加策略并将 ExampleStmt3 替换为您自己的语句 ID。

注意:如果账户 A 中存在 aws-quicksight-s3-consumers-role-v0 角色,您必须将此 KMS 策略附加到角色。KMS 策略将解密 Amazon S3 存储桶中的数据。

如果您是将更新的角色策略附加到 Amazon QuickSight 服务角色,则可能会遇到权限错误。有关如何解决此权限错误的信息,请参阅如何排查 Amazon QuickSight 中的 AWS 资源权限错误?

其他注意事项

下面是一些其他注意事项: