

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon Quick 中以 IAM 角色身份运行查询
<a name="datasource-run-as-role"></a>

您可以对连接至 Amazon Athena、Amazon Redshift 或 Amazon S3 的数据来源使用精细的访问策略，而不是更广泛的权限，从而提高数据安全性。首先，您需要创建一个 Amazon Identity and Access Management （IAM）角色，该角色的权限可在人员或 API 开始查询时激活。然后，Quick 管理员或开发人员将 IAM 角色分配给 Athena 或 Amazon S3 数据源。角色到位后，任何运行查询的人员或 API 都拥有运行查询所需的确切权限。

在承诺实施运行身份角色以提高数据安全性之前，需要考虑以下几点：
+ 阐述额外的安全措施为您带来的优势。
+ 与您的 Quick 管理员合作，了解向数据源添加角色是否有助于您更好地实现安全目标或要求。
+ 询问对于涉及的数据来源、人员和应用程序的数量，您的团队能否以可行的方式记录和维护这种类型的安全措施？ 如果不能，那么谁来承担这部分工作？
+ 在结构化组织中，将利益相关者分配到运营、开发和 IT 支持组成的平行团队中。询问他们的经验、建议以及是否愿意支持您的计划。
+ 在启动项目之前，请考虑进行概念验证，让需要访问数据的人员参与其中。

以下规则适用于在 Athena、Amazon Redshift 和 Amazon S3 中使用运行身份角色：
+ 每个数据源只能关联一个 RoleArn。数据来源的使用者（通常会访问数据集和视觉对象）可以生成许多不同类型的查询。该角色对正常工作和无法正常工作的查询设定了界限。
+ ARN 必须与使用它的 Quick 实例 Amazon Web Services 账户 相同的 IAM 角色对应。
+ IAM 角色必须具有信任关系，允许 Quick 担任该角色。
+ 调用 Quick 的身份 APIs 必须拥有传递角色的权限，然后才能更新`RoleArn`属性。您只需要在创建或更新角色 ARN 时传递角色。之后不会重新评估权限。同样，省略角色 ARN 时不需要权限。
+ 省略角色 ARN 时，Athena 或 Amazon S3 数据来源将使用账户范围的角色和范围缩小策略。
+ 当存在角色 ARN 时，账户范围的角色和任何范围缩小策略都将被忽略。对于 Athena 数据来源，Lake Formation 权限不会被忽略。
+ 对于 Amazon S3 数据来源，必须可以使用 IAM 角色访问清单文件和清单文件指定的数据。
+ ARN 字符串需要与数据 Amazon Web Services 区域 所在 Amazon Web Services 账户 和查询位置中的现有 IAM 角色相匹配。

当 Quick 连接到中的其他服务时 Amazon，它会使用 IAM 角色。默认情况下，Quick 为其使用的每项服务创建该角色的细化程度较低的版本，该角色由 Amazon Web Services 账户 管理员管理。当您添加带有自定义权限策略的 IAM 角色 ARN 时，您会为需要额外保护的数据来源覆盖更广泛的角色。有关策略的更多信息，请参阅《IAM 用户指南》中的[创建客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_managed-policies.html)。

## 使用 Athena 数据来源运行查询
<a name="datasource-run-as-role-athena"></a>

使用 API 将 ARN 附加到 Athena 数据来源。为此，请在的[RoleArn](https://docs.amazonaws.cn/quicksight/latest/APIReference/API_RoleArn.html)属性中添加角色 ARN。[AthenaParameters](https://docs.amazonaws.cn/quicksight/latest/APIReference/API_AthenaParameters.html)为了进行验证，您可以在**编辑 Athena 数据来源**对话框中查看角色 ARN。但是，**角色 ARN** 是一个只读字段。

首先，您需要一个自定义 IAM 角色，我们在以下示例中对此进行了演示。

请记住，以下代码示例仅用于学习。此示例仅在临时开发和测试环境中使用，不能在生产环境中使用。此示例中的策略不保护任何特定资源，这些资源必须位于可部署策略中。此外，即使是为了开发，您也需要添加自己的 Amazon 账户信息。

以下命令创建一个简单的新角色并附加一些向 Quick 授予权限的策略。

```
aws iam create-role \
        --role-name TestAthenaRoleForQuickSight \
        --description "Test Athena Role For QuickSight" \
        --assume-role-policy-document '{
            "Version": "2012-10-17"		 	 	 ,
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "quicksight.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }'
```

确定或创建用于每个数据源的 IAM 角色后，使用附加策略 attach-role-policy。

```
aws iam attach-role-policy \
        --role-name TestAthenaRoleForQuickSight \
        --policy-arn arn:aws:iam::222222222222:policy/service-role/AWSQuickSightS3Policy1

    aws iam attach-role-policy \
        --role-name TestAthenaRoleForQuickSight \
        --policy-arn arn:aws:iam::aws:policy/service-role/AWSQuicksightAthenaAccess1

    aws iam attach-role-policy \
        --role-name TestAthenaRoleForQuickSight \
        --policy-arn arn:aws:iam::aws:policy/AmazonS3Access1
```



验证权限后，您可以通过创建新角色或更新现有角色在 Quick 数据源中使用该角色。使用这些命令时，请更新 Amazon Web Services 账户 ID 并 Amazon Web Services 区域 使其与您自己的 ID 相匹配。

请记住，这些示例代码片段不适用于生产环境。 Amazon 强烈建议您为生产案例确定并使用一组最低权限策略。

```
aws quicksight create-data-source
        --aws-account-id 222222222222 \
        --region us-east-1 \
        --data-source-id "athena-with-custom-role" \
        --cli-input-json '{
            "Name": "Athena with a custom Role",
            "Type": "ATHENA",
            "data sourceParameters": {
                "AthenaParameters": {
                    "RoleArn": "arn:aws:iam::222222222222:role/TestAthenaRoleForQuickSight"
                }
            }
        }'
```

## 使用 Amazon Redshift 数据来源运行查询
<a name="datasource-run-as-role-redshift"></a>

将您的 Amazon Redshift 数据与运行身份角色联系起来，从而通过精细的访问策略提高数据安全性。您可以为使用公共网络或 VPC 连接的 Amazon Redshift 数据来源创建运行身份角色。您可以在**编辑 Amazon Redshift 数据来源**对话框中指定要使用的连接类型。Amazon Redshift Serverless 数据来源不支持运行方式角色。

首先，您需要一个自定义 IAM 角色，我们在以下示例中对此进行了演示。以下命令创建示例新角色并附加向 Quick 授予权限的策略。

```
aws iam create-role \
--role-name TestRedshiftRoleForQuickSight \
--description "Test Redshift Role For QuickSight" \
--assume-role-policy-document '{
    "Version": "2012-10-17"		 	 	 ,
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "quicksight.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}'
```

在您确定或创建用于每个数据来源的 IAM 角色后，请使用 `attach-role-policy` 附加策略。如果您要使用的角色附加了 `redshift:GetClusterCredentialsWithIAM` 权限，则 `DatabaseUser` 和 `DatabaseGroups` 的值是可选的。

```
aws iam attach-role-policy \
--role-name TestRedshiftRoleForQuickSight \
--policy-arn arn:aws:iam:111122223333:policy/service-role/AWSQuickSightRedshiftPolicy
    
        
aws iam create-policy --policy-name RedshiftGetClusterCredentialsPolicy1 \
--policy-document file://redshift-get-cluster-credentials-policy.json 


aws iam attach-role-policy \
--role-name TestRedshiftRoleForQuickSight \
--policy-arn arn:aws:iam:111122223333:policy/RedshiftGetClusterCredentialsPolicy1
// redshift-get-cluster-credentials-policy.json
{
    "Version": "2012-10-17"		 	 	 ,
    "Statement": [
        {
            "Sid": "RedshiftGetClusterCredentialsPolicy",
            "Effect": "Allow",
            "Action": [
                "redshift:GetClusterCredentials"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

上面的示例创建了一个使用 `RoleARN`、`DatabaseUser` 和 `DatabaseGroups` IAM 参数的数据来源。如果您只想通过 IAM `RoleARN` 参数建立连接，请将 `redshift:GetClusterCredentialsWithIAM` 权限附加到您的角色，如下例所示。

```
aws iam attach-role-policy \ 
--role-name TestRedshiftRoleForQuickSight \ 
--policy-arn arn:aws:iam:111122223333:policy/RedshiftGetClusterCredentialsPolicy1 // redshift-get-cluster-credentials-policy.json {
    "Version": "2012-10-17"		 	 	 ,
    "Statement": [ 
        {
            "Sid": "RedshiftGetClusterCredentialsPolicy", 
            "Effect": "Allow", 
            "Action": [ "redshift:GetClusterCredentialsWithIAM" ],
            "Resource": [ "*" ]
        }
    ]
}"
```

验证权限后，您可以通过创建新角色或更新现有角色在 Quick 数据源中使用该角色。使用这些命令时，请更新 Amazon 账户 ID 和 Amazon 区域，使其与您自己的账号 ID 和区域一致。

```
aws quicksight create-data-source \
--region us-west-2 \
--endpoint https://quicksight.us-west-2.quicksight.aws.com/ \
--cli-input-json file://redshift-data-source-iam.json \
redshift-data-source-iam.json is shown as below
{
    "AwsAccountId": "AWSACCOUNTID",
    "DataSourceId": "DATSOURCEID",
    "Name": "Test redshift demo iam",
    "Type": "REDSHIFT",
    "DataSourceParameters": {
        "RedshiftParameters": {
            "Database": "integ",
            "Host": "redshiftdemocluster.us-west-2.redshift.amazonaws.com",
            "Port": 8192,
            "ClusterId": "redshiftdemocluster",
            "IAMParameters": {
                "RoleArn": "arn:aws:iam::222222222222:role/TestRedshiftRoleForQuickSight",
                "DatabaseUser": "user",
                "DatabaseGroups": ["admin_group", "guest_group", "guest_group_1"]
            }
        }
    },
    "Permissions": [
      {
        "Principal": "arn:aws:quicksight:us-east-1:AWSACCOUNTID:user/default/demoname",
        "Actions": [
          "quicksight:DescribeDataSource",
          "quicksight:DescribeDataSourcePermissions",
          "quicksight:PassDataSource",
          "quicksight:UpdateDataSource",
          "quicksight:DeleteDataSource",
          "quicksight:UpdateDataSourcePermissions"
        ]
      }
    ]
}
```

如果您的数据来源使用 VPC 连接类型，请使用以下 VPC 配置。

```
{
    "AwsAccountId": "AWSACCOUNTID",
    "DataSourceId": "DATSOURCEID",
    "Name": "Test redshift demo iam vpc",
    "Type": "REDSHIFT",
    "DataSourceParameters": {
        "RedshiftParameters": {
            "Database": "mydb",
            "Host": "vpcdemo.us-west-2.redshift.amazonaws.com",
            "Port": 8192,
            "ClusterId": "vpcdemo",
            "IAMParameters": {
                "RoleArn": "arn:aws:iam::222222222222:role/TestRedshiftRoleForQuickSight",
                "DatabaseUser": "user",
                "AutoCreateDatabaseUser": true
            }
        }
    },
    "VpcConnectionProperties": { 
      "VpcConnectionArn": "arn:aws:quicksight:us-west-2:222222222222:vpcConnection/VPC Name"
    },
    "Permissions": [
      {
        "Principal": "arn:aws:quicksight:us-east-1:222222222222:user/default/demoname",
        "Actions": [
          "quicksight:DescribeDataSource",
          "quicksight:DescribeDataSourcePermissions",
          "quicksight:PassDataSource",
          "quicksight:UpdateDataSource",
          "quicksight:DeleteDataSource",
          "quicksight:UpdateDataSourcePermissions"
        ]
      }
    ]
}
```

如果您的数据来源使用 `redshift:GetClusterCredentialsWithIAM` 权限，但不使用 `DatabaseUser` 或 `DatabaseGroups` 参数，请向该角色授予对架构中部分或所有表的访问权限。要查看角色是否已被授予对特定表的 `SELECT` 权限，请在 Amazon Redshift 查询编辑器中输入以下命令。

```
SELECT
u.usename,
t.schemaname||'.'||t.tablename,
has_table_privilege(u.usename,t.tablename,'select') AS user_has_select_permission
FROM
pg_user u
CROSS JOIN
pg_tables t
WHERE
u.usename = 'IAMR:RoleName'
AND t.tablename = tableName
```

有关 Amazon Redshift 查询编辑器中的 `SELECT` 操作的更多信息，请参阅 [SELECT](https://docs.amazonaws.cn/redshift/latest/dg/r_SELECT_synopsis.html)。

要向角色授予 `SELECT` 权限，请在 Amazon Redshift 查询编辑器中输入以下命令。

```
GRANT SELECT ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA 
schema_name [, ...] } TO "IAMR:Rolename";
```

有关 Amazon Redshift 查询编辑器中的 `GRANT` 操作的更多信息，请参阅 [GRANT](https://docs.amazonaws.cn/redshift/latest/dg/r_GRANT.html)。

## 使用 Amazon S3 数据来源运行查询
<a name="datasource-run-as-role-s3"></a>

Amazon S3 数据源包含一个清单文件，Quick 使用该文件来查找和解析您的数据。您可以通过 Quick 控制台上传 JSON 清单文件，也可以提供指向 S3 存储桶中 JSON 文件的 URL。如果您选择提供 URL，则必须授予 Quick 访问在 Amazon S3 中的文件的权限。使用快速管理控制台来控制对清单文件及其引用的数据的访问权限。

借助该**RoleArn**属性，您可以通过覆盖账户范围角色的自定义 IAM 角色授予对清单文件及其引用的数据的访问权限。使用 API 将 ARN 附加到 Amazon S3 数据来源的清单文件。[为此，请在 S3Parameters 的[RoleArn](https://docs.amazonaws.cn/quicksight/latest/APIReference/API_RoleArn.html)属性中添加角色 ARN。](https://docs.amazonaws.cn/quicksight/latest/APIReference/API_S3Parameters.html)为了进行验证，您可以在**编辑 S3 数据来源**对话框中查看角色 ARN。但是**角色 ARN** 是只读字段，如以下屏幕截图所示。

首先，请创建一个 Amazon S3 清单文件。然后，您可以在创建新的 Amazon S3 数据集时将其上传到 Amazon Quick，也可以将该文件放入包含您的数据文件的 Amazon S3 存储桶中。查看以下清单文件具体形式的示例：

```
{
    "fileLocations": [
        {
            "URIPrefixes": [
                "s3://quicksightUser-run-as-role/data/"
            ]
        }
    ],
    "globalUploadSettings": {
        "format": "CSV",
        "delimiter": ",",
        "textqualifier": "'",
        "containsHeader": "true"
    }
}
```

有关如何创建清单文件的说明，请参阅 [支持的 Amazon S3 清单文件格式](supported-manifest-file-format.md)。

创建清单文件并将其添加到 Amazon S3 存储桶或将其上传到 Quick 后，在 IAM 中创建或更新授予`s3:GetObject`访问权限的现有角色。以下示例说明如何使用 Amazon API 更新现有 IAM 角色：

```
aws iam put-role-policy \
    --role-name QuickSightAccessToS3RunAsRoleBucket \
    --policy-name GrantS3RunAsRoleAccess \
    --policy-document '{
        "Version": "2012-10-17"		 	 	 ,
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::s3-bucket-name"
            },
            {
                "Effect": "Allow",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::s3-bucket-name/manifest.json"
            },
            {
                "Effect": "Allow",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::s3-bucket-name/*"
            }
        ]
    }'
```

在您的策略授予 `s3:GetObject` 访问权限后，您可以开始创建将更新后的 `put-role-policy` 应用于 Amazon S3 数据来源清单文件的数据来源。

```
aws quicksight create-data-source --aws-account-id 111222333444 --region us-west-2 --endpoint https://quicksight.us-west-2.quicksight.aws.com/ \
    --data-source-id "s3-run-as-role-demo-source" \
    --cli-input-json '{
        "Name": "S3 with a custom Role",
        "Type": "S3",
        "DataSourceParameters": {
            "S3Parameters": {
                "RoleArn": "arn:aws:iam::111222333444:role/QuickSightAccessRunAsRoleBucket",
                "ManifestFileLocation": {
                    "Bucket": "s3-bucket-name", 
                    "Key": "manifest.json"
                }
            }
        }
    }'
```

验证权限后，您可以通过创建新角色或更新现有角色在 Quick 数据源中使用该角色。使用这些命令时，请务必更新 Amazon Web Services 账户 ID 并 Amazon Web Services 区域 与您自己的 ID 相匹配。