

# Athena 中的 Identity and Access Management
Identity and access management

Amazon Athena 使用 [Amazon Identity and Access Management (IAM)](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction.html) 策略来限制对 Athena 操作的访问。有关 Athena 的完整权限列表，请参阅《服务授权参考**》中的 [Amazon Athena 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonathena.html)。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

运行 Athena 查询所需的权限包含以下内容：
+ 存储查询底层数据的 Amazon S3 位置。有关更多信息，请参阅《*Amazon Simple Storage Service 用户指南*》中的 [Amazon S3 中的身份和访问管理](https://docs.amazonaws.cn/AmazonS3/latest/dev/s3-access-control.html)。
+ 在 Amazon Glue Data Catalog 中存储的元数据和资源，例如数据库和表，包括加密元数据的其他操作。有关更多信息，请参阅《Amazon Glue 开发人员指南**》中的[为 Amazon Glue 设置 IAM 权限](https://docs.amazonaws.cn/glue/latest/dg/getting-started-access.html)和[在 Amazon Glue 中设置加密](https://docs.amazonaws.cn/glue/latest/dg/set-up-encryption.html)。
+ Athena API 操作。有关 Athena 中 API 操作的完整列表，请参阅 *Amazon Athena API 参考*中的[操作](https://docs.amazonaws.cn/athena/latest/APIReference/API_Operations.html)。

以下主题提供了有关 Athena 的特定区域权限的更多信息。

**Topics**
+ [Amazon 托管策略](security-iam-awsmanpol.md)
+ [

# 数据边界
](data-perimeters.md)
+ [通过 JDBC 和 ODBC 连接访问](policy-actions.md)
+ [

# 控制从 Athena 对 Amazon S3 的访问
](s3-permissions.md)
+ [对 S3 存储桶的跨账户访问](cross-account-permissions.md)
+ [对 Amazon Glue 中数据库和表的访问](fine-grained-access-to-glue-resources.md)
+ [授予 Amazon Glue 数据目录跨账户访问权限](security-iam-cross-account-glue-catalog-access.md)
+ [针对数据目录中加密元数据的访问权限](access-encrypted-data-glue-data-catalog.md)
+ [对工作组和标签的访问](workgroups-access.md)
+ [

# 使用 IAM 策略控制工作组访问
](workgroups-iam-policy.md)
+ [已启用 IAM Identy Center 的工作组](workgroups-identity-center.md)
+ [配置最低加密](workgroups-minimum-encryption.md)
+ [

# 配置对于预编译语句的访问
](security-iam-athena-prepared-statements.md)
+ [使用 CalledVia 上下文密钥](security-iam-athena-calledvia.md)
+ [

# 允许访问适用于外部配置 Hive 元存储的 Athena 数据连接器
](hive-metastore-iam-access.md)
+ [

# 允许 Lambda 函数访问外部 Hive 元存储
](hive-metastore-iam-access-lambda.md)
+ [

# 创建连接器和 Athena 目录所需的权限
](athena-catalog-access.md)
+ [允许访问 Athena 联合查询](federated-query-iam-access.md)
+ [允许访问 UDF](udf-iam-access.md)
+ [

# 允许使用 Athena 访问机器学习
](machine-learning-iam-access.md)
+ [

# 启用对 Athena API 的联合访问
](access-federation-saml.md)

# Amazon Athena 的 Amazon 托管策略
Amazon 托管策略

Amazon 托管式策略是由 Amazon 创建和管理的独立策略。Amazon 托管式策略旨在为许多常见使用案例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住，Amazon 托管式策略可能不会为您的特定使用案例授予最低权限，因为它们可供所有 Amazon 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 Amazon 托管式策略中定义的权限。如果 Amazon 更新在 Amazon 托管式策略中定义的权限，则更新会影响该策略所附加到的所有主体身份（用户、组和角色）。当新的 Amazon Web Services 服务 启动或新的 API 操作可用于现有服务时，Amazon 最有可能更新 Amazon 托管式策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## 在 Athena 中使用托管策略时的注意事项


托管策略易于使用，并且随着服务的发展而自动使用必需的操作进行更新。将托管策略与 Athena 结合使用时，请记住以下几点：
+ 要使用 Amazon Identity and Access Management（IAM）为您自己或其他用户允许或拒绝 Amazon Athena 服务操作，请将基于身份的策略附加到主体，例如用户或组。
+ 每个基于身份的策略均包含用于定义允许或拒绝的操作的语句。有关将策略附加到用户的更多信息和分步说明，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)中的 *附加托管式策略*。有关操作列表，请参阅 [Amazon Athena API 参考](https://docs.amazonaws.cn/athena/latest/APIReference/)。
+  *客户托管*策略和基于身份的*内联*策略允许您在策略内指定更详细的 Athena 操作来微调访问权限。我们建议您使用 `AmazonAthenaFullAccess` 策略作为起始点，然后允许或拒绝 [Amazon Athena API 参考](https://docs.amazonaws.cn/athena/latest/APIReference/)中所列的特定操作。有关内联策略的更多信息，请参阅《IAM 用户指南**》中的 [托管式策略与内联策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。
+ 如果您还具有使用 JDBC 连接的主体，则必须为您的应用程序提供 JDBC 驱动程序凭证。有关更多信息，请参阅 [控制通过 JDBC 和 ODBC 连接的访问](policy-actions.md)。
+ 如果您已加密 Amazon Glue Data Catalog，则必须在基于身份的 IAM 策略中为 Athena 指定其他操作。有关更多信息，请参阅 [从 Athena 配置对 Amazon Glue Data Catalog 中加密元数据的访问](access-encrypted-data-glue-data-catalog.md)。
+ 如果您创建和使用工作组，请确保您的策略包括对工作组操作的相关访问权限。有关详细信息，请参阅[使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)和[工作组策略示例](example-policies-workgroup.md)。

## Amazon 托管策略：AmazonAthenaFullAccess
AmazonAthenaFullAccess

`AmazonAthenaFullAccess` 托管策略授予对 Athena 的完全访问权限。

要提供访问权限，请为您的用户、组或角色添加权限：
+ 通过身份提供者在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南**》中[向用户添加权限（控制台）](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

### 权限组


`AmazonAthenaFullAccess` 策略被分组为以下权限集。
+ **`athena`**：允许主体访问 Athena 资源。
+ **`glue`** – 允许主体访问 Amazon Glue 目录、数据库、表和分区。这是必需的，以便主体可以将 Amazon Glue Data Catalog 和 Athena 搭配使用。
+ **`s3`**：允许主体从 Amazon S3 编写和读取查询结果，读取驻留在 Amazon S3 中的公开可用的 Athena 数据示例，并列出存储桶。这是必需的，以便主体可以将 Athena 与 Amazon S3 搭配使用。
+ **`sns`**：允许主体列出 Amazon SNS 主题并获取主题属性。这使主体能够将 Amazon SNS 主题与 Athena 结合使用，以进行监控和提示。
+ **`cloudwatch`**：允许主体创建、读取和删除 CloudWatch 告警。有关更多信息，请参阅 [使用 CloudWatch 和 EventBridge 监控查询并控制成本](workgroups-control-limits.md)。
+ **`lakeformation`**：允许主体请求临时证书以访问已注册到 Lake Formation 的数据湖位置中的数据。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南[https://docs.amazonaws.cn/lake-formation/latest/dg/access-control-underlying-data.html](https://docs.amazonaws.cn/lake-formation/latest/dg/access-control-underlying-data.html)》中的*底层数据访问控制*。
+ **`datazone`** – 允许主体列出 Amazon DataZone 项目、域和环境。有关如何在 Athena 中使用 DataZone 的信息，请参阅 [在 Athena 中使用 Amazon DataZone](datazone-using.md)。
+ **`pricing`** – 提供对 Amazon 账单与成本管理 的访问权限。有关更多信息，请参阅《Amazon 账单与成本管理 API 参考》中的 [GetProducts](https://docs.amazonaws.cn/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)**。

要查看此策略的权限，请参阅《Amazon Managed Policy Reference》中的 [AmazonAthenaFullAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)。

**注意**  
您必须明确允许访问服务拥有的 Amazon S3 存储桶来存储示例查询和示例数据集。有关更多信息，请参阅 [数据边界](data-perimeters.md)。

## Amazon 托管策略：AWSQuicksightAthenaAccess
AWSQuicksightAthenaAccess

`AWSQuicksightAthenaAccess` 授予对 Quick 与 Athena 集成所需的操作的访问权限。您可以将 `AWSQuicksightAthenaAccess` 策略附加到 IAM 身份。仅将此策略附加到将 Quick 与 Athena 结合使用的主体。此策略包括 Athena 的一些操作，这些操作已弃用且未包含在当前公有 API 中或仅与 JDBC 和 ODBC 驱动程序一起使用。

### 权限组


`AWSQuicksightAthenaAccess` 策略被分组为以下权限集。
+ **`athena`**：允许主体对 Athena 资源运行查询。
+ **`glue`** – 允许主体访问 Amazon Glue 目录、数据库、表和分区。这是必需的，以便主体可以将 Amazon Glue Data Catalog 和 Athena 搭配使用。
+ **`s3`**：允许主体从 Amazon S3 中写入和读取查询结果。
+ **`lakeformation`**：允许主体请求临时证书以访问已注册到 Lake Formation 的数据湖位置中的数据。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南[https://docs.amazonaws.cn/lake-formation/latest/dg/access-control-underlying-data.html](https://docs.amazonaws.cn/lake-formation/latest/dg/access-control-underlying-data.html)》中的*底层数据访问控制*。

要查看此策略的权限，请参阅《Amazon Managed Policy Reference》中的 [AWSQuicksightAthenaAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSQuicksightAthenaAccess.html)。

## Amazon 托管策略的 Athena 更新
策略更新

查看有关 Athena Amazon 托管策略更新的详细信息（从该服务开始跟踪这些更改开始）。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
| [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 对现有策略的更新 | 添加了 glue:GetCatalog 和 glue:GetCatalogs 权限，让 Athena 用户能够访问 SageMaker AI Lakehouse 目录。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新 | 添加了 glue:GetCatalog 和 glue:GetCatalogs 权限，让 Athena 用户能够访问 SageMaker AI Lakehouse 目录。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新 |  允许 Athena 使用公开记录的 Amazon Glue `GetCatalogImportStatus` API 来检索目录导入状态。  | 2024 年 6 月 18 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  添加了 `datazone:ListDomains`、`datazone:ListProjects` 和 `datazone:ListAccountEnvironments` 权限，以使 Athena 用户能够使用 Amazon DataZone 域、项目和环境。有关更多信息，请参阅 [在 Athena 中使用 Amazon DataZone](datazone-using.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  添加了 `glue:StartColumnStatisticsTaskRun`、`glue:GetColumnStatisticsTaskRun` 和 `glue:GetColumnStatisticsTaskRuns` 权限，以使 Athena 有权调用 Amazon Glue，以检索基于成本的优化器功能的统计数据。有关更多信息，请参阅 [使用成本型优化器](cost-based-optimizer.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  Athena 增加了 `pricing:GetProducts` 以提供对 Amazon 账单与成本管理 的访问权限。有关更多信息，请参阅《Amazon 账单与成本管理 API 参考》中的 [GetProducts](https://docs.amazonaws.cn/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)**。  | 2023 年 1 月 25 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 对现有政策的更新  |  Athena 添加了 `cloudwatch:GetMetricData`，用以检索 CloudWatch 指标值。有关更多信息，请参阅 *Amazon CloudWatch API 参考*中的 [GetMetricData](https://docs.amazonaws.cn/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。  | 2022 年 11 月 14 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) 和 [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 对现有策略的更新  |  将 Athena 添加到 `s3:PutBucketPublicAccessBlock` 以允许阻止对 Athena 创建的存储桶的公共访问。  | 2021 年 7 月 7 日 | 
|  Athena 开始跟踪变更  |  Athena 为其 Amazon 托管策略开启了跟踪更改。  | 2021 年 7 月 7 日 | 

# 数据边界


[数据边界](https://www.amazonaws.cn/identity/data-perimeters-on-aws/)是 Amazon 环境中的一组权限防护机制，可用于帮助确保只有可信身份才能访问来自预期网络的可信资源。

Amazon Athena 使用服务拥有的 Amazon S3 存储桶来存储示例查询和示例数据集。如果使用数据边界来控制环境中的访问权限，则必须明确允许访问这些服务拥有的资源才能使用相应的 Athena 功能。

 下表列出了 Athena 需要访问的 Amazon S3 存储桶的 ARN、所需的权限、Athena 使用的身份以及依赖于 S3 存储桶的功能。要允许访问，请将存储桶 ARN 中的 `<region>` 替换为实际 Amazon Web Services 区域，并根据 Amazon S3 访问控制将此存储桶列入许可名单。


**Athena 使用的数据边界**  

| 资源 ARN | 所需的权限 | 用于访问的身份 | 访问场景 | 
| --- | --- | --- | --- | 
|  arn:aws:s3:::athena-examples-<region>  | s3:GetObjects3:ListBucket | 访问 Athena 的 IAM 主体。 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/athena/latest/ug/data-perimeters.html)  | 

# 控制通过 JDBC 和 ODBC 连接的访问
通过 JDBC 和 ODBC 连接访问

若要获得 Amazon Web Services 服务 和资源（如 Athena 和 Amazon S3 存储桶）的访问权限，请向您的应用程序提供 JDBC 或 ODBC 驱动程序凭证。如果您使用的是 JDBC 或 ODBC 驱动程序，请确保 IAM 权限策略包括 [Amazon 托管策略：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy) 中列出的所有操作。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 身份验证方法


Athena JDBC 和 ODBC 驱动程序支持基于 SAML 2.0 的身份验证，包括以下身份提供程序：
+ Active Directory 联合身份验证服务 (AD FS)
+ Azure Active Directory (AD)
+ Okta 
+ PingFederate

有关详细信息，请参阅相应驱动程序的安装和配置指南，可从 [JDBC](connect-with-jdbc.md) 和 [ODBC](connect-with-odbc.md) 驱动程序页面下载 PDF 格式文件。有关更多信息，请参阅以下内容：
+ [启用对 Athena API 的联合访问](access-federation-saml.md)
+ [将 Lake Formation 和 JDBC 或 ODBC 驱动程序用于对 Athena 进行联合访问](security-athena-lake-formation-jdbc.md)
+  [使用 ODBC、SAML 2.0 和 Okta 身份提供商配置单点登录](okta-saml-sso.md)

有关最新版本的 JDBC 和 ODBC 驱动程序及其文档的信息，请参阅[通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md)和[通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

# 控制从 Athena 对 Amazon S3 的访问


您可以使用基于身份的策略、存储桶资源策略、接入点策略或上述内容的任意组合授予对 Amazon S3 位置的访问权限。当参与者与 Athena 交互时，其权限会通过 Athena 传递，以确定 Athena 可以访问的内容。这意味着用户必须具有 Amazon S3 存储桶的访问权限，才能使用 Athena 进行查询。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

请注意，对 Amazon S3 的请求来自 Athena 的私有 IPv4 地址，而不是 `aws:SourceIp` 中指定的源 IP。因此，不能使用 `aws:SourceIp` 条件拒绝访问给定 IAM 策略中的 Amazon S3 操作。也无法根据 `aws:SourceVpc` 或 `aws:SourceVpce` 条件键限制或允许对 Amazon S3 资源的访问。

**注意**  
使用 IAM Identity Center 身份验证的 Athena 工作组要求将 S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [S3 Access Grants and directory identities](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants-directory-ids.html)。

**Topics**
+ [基于身份的策略](#s3-permissions-identity-based-policies)
+ [存储桶资源策略](#s3-permissions-bucket-resource-policies)
+ [接入点策略](#s3-permissions-aliases)
+ [CalledVia 上下文键](#s3-permissions-calledvia)
+ [

## 其他资源
](#s3-permissions-additional-resources)

## 使用基于身份的策略来控制对 Amazon S3 存储桶的访问
基于身份的策略

基于身份的策略附加到 IAM 用户、组或角色。这些策略可让您指定该身份可执行哪些操作（其权限）。可以使用基于身份的策略来控制对 Amazon S3 存储桶的访问。

以下基于身份的策略允许 `Read` 和 `Write` 访问特定 Amazon S3 存储桶中的对象。要使用此策略，请将*斜体占位符文本*替换为您自己的值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

## 使用存储桶资源策略控制对 Amazon S3 存储桶的访问
存储桶资源策略

可以使用 Amazon S3 存储桶策略来保护对存储桶中对象的访问，以便只有具有适当权限的用户才能访问这些对象。有关创建 Amazon S3 策略的指导，请参阅《*Amazon S3 用户指南*》中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.amazonaws.cn/AmazonS3/latest/userguide/add-bucket-policy.html)。

以下示例权限策略限制用户读取具有 `environment: production` 标签键和值的对象。该示例策略使用 `s3:ExistingObjectTag` 条件键来指定标签键和值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/JohnDoe"
            },
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/environment": "production"
                }
            }
        }
    ]
}
```

------

有关更多存储桶策略示例，请参阅《*Amazon S3 用户指南*》中的 [Amazon S3 存储桶策略的示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html)。

## 使用 Amazon S3 接入点对存储桶访问进行更精确的控制
接入点策略

如果您在 Amazon S3 存储桶中拥有共享数据集，则维护单个存储桶策略以管理数百个使用案例的访问权限可能会非常困难。

Amazon S3 存储桶接入点、策略和别名有助于解决此问题。一个存储桶可以有多个接入点，每个接入点都有一个策略，能够以不同方式控制对存储桶的访问。

对于您创建的每个接入点，Amazon S3 都会生成一个代表接入点的别名。由于别名采用 Amazon S3 存储桶名称格式，因此您可以在 Athena 中 `CREATE TABLE` 语句的 `LOCATION` 子句中使用别名。然后，Athena 对存储桶的访问由别名所代表的接入点策略控制。

有关更多信息，请参阅《Amazon S3 用户指南》**中的 [指定 Amazon S3 中的表位置](tables-location-format.md) 和[使用接入点](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-points.html)。

## 使用 CalledVia 上下文密钥，以仅允许从 Athena 调用其他服务
CalledVia 上下文键

为了增加安全性，您可以使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全局条件上下文键。`aws:CalledVia` 条件键包含您允许调用其他服务的服务列表。例如，通过为 `aws:CalledVia` 上下文密钥指定 Athena 服务主体名称 (`athena.amazonaws.com`)，您可以仅在调用来自 Athena 时允许对 Amazon Lambda 进行 `InvokeFunction` 调用。有关更多信息，请参阅 [使用适用于 Athena 的 CalledVia 上下文密钥](security-iam-athena-calledvia.md)。

## 其他资源


有关如何授予 Amazon S3 访问权限的详细信息和示例，请参阅以下资源：
+ 《Amazon S3 用户指南**》中的 [示例演练：管理访问](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)。
+ Amazon 知识中心中的[如何提供对 Amazon S3 存储桶中对象的跨账户访问权限？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cross-account-access-s3/)。
+ [在 Athena 中配置对 Amazon S3 存储桶的跨账户存取](cross-account-permissions.md).

# 在 Athena 中配置对 Amazon S3 存储桶的跨账户存取
对 S3 存储桶的跨账户访问

一个常见的 Amazon Athena 方案是向账户中与存储桶拥有者不同的用户授予访问权限，以便他们可以执行查询。在这种情况下，使用存储桶策略来授予访问权限。

**注意**  
有关从 Athena 跨账户访问 Amazon Glue 数据目录的信息，请参阅 [配置 Amazon Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。

以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 `s3://amzn-s3-demo-bucket`) 向账户 `123456789123` (它是不同账户) 中的所有用户授予访问权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "MyPolicyID",
   "Statement": [
      {
          "Sid": "MyStatementSid",
          "Effect": "Allow",
          "Principal": {
             "AWS": "arn:aws:iam::123456789123:root"
          },
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads",
             "s3:ListMultipartUploadParts",
             "s3:AbortMultipartUpload"
          ],
          "Resource": [
             "arn:aws:s3:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

要向账户中的特定用户授予访问权限，请将 `Principal` 密钥替换为用户指定的密钥，而不是 `root`。例如，对于用户配置文件 `Dave`，请使用 `arn:aws:iam::123456789123:user/Dave`。

## 对使用自定义 Amazon KMS 密钥加密的存储桶配置跨账户访问


如果您的 Amazon S3 存储桶使用自定义 Amazon Key Management Service (Amazon KMS) 密钥加密，则可能需要向其他 Amazon Web Services 账户中的用户授予访问该存储桶的权限。

向账户 B 中的用户授予对账户 A 中 Amazon KMS 加密存储桶的访问权限需要以下权限：
+ 账户 A 中的存储桶策略必须授予对账户 B 所担任角色的访问权限。
+ 账户 A 中的 Amazon KMS 密钥策略必须授予对账户 B 中用户所担任角色的访问权限。
+ 账户 B 担任的 Amazon Identity and Access Management（IAM）角色必须同时授予对账户 A 中存储桶和密钥的访问权限。

以下过程描述如何授予这些权限中的每个权限。

**向账户 b 中的用户授予对账户 a 中存储桶的访问权限**
+ 在账户 A 中，[查看 S3 存储桶策略](https://docs.amazonaws.cn/AmazonS3/latest/userguide/add-bucket-policy.html)并确认存在允许从账户 B 的账户 ID 访问的语句。

  例如，以下存储桶策略允许 `s3:GetObject` 访问账户 ID `111122223333`：

------
#### [ JSON ]

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Principal": {
          "AWS": [
            "111122223333"
          ]
        }
      }
    ]
  }
  ```

------

**从账户 a 中的 Amazon KMS 密钥策略向账户 b 中的用户授予访问权限**

1. 在账户 A 的 Amazon KMS 密钥策略中，向账户 B 所担任的角色授予执行以下操作的权限：
   +  `kms:Encrypt` 
   +  `kms:Decrypt` 
   +  `kms:ReEncrypt*` 
   +  `kms:GenerateDataKey*` 
   +  `kms:DescribeKey` 

   以下示例仅向一个 IAM 角色授予密钥访问权限。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowUseOfTheKey",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/role_name"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在账户 A 中，[使用 Amazon Web Services 管理控制台 策略视图](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)查看密钥策略。

1. 在密钥策略中，验证以下语句是否将账户 B 列为主体。

   ```
   "Sid": "Allow use of the key" 
   ```

1. 如果 `"Sid": "Allow use of the key"` 语句不存在，请执行以下步骤：

   1. 切换到[使用控制台默认视图](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)查看密钥策略。

   1.  将账户 B 的账户 ID 添加为可访问密钥的外部账户。

**从账户 b 担任的 IAM 角色中授予对账户 a 中存储桶和密钥的访问权限**

1. 从账户 B 中，在 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 开启 IAM 控制台。

1. 打开与账户 B 中用户关联的 IAM 角色。

1. 查看应用于 IAM 角色的权限策略列表。

1. 确保应用授予对存储桶的访问权限的策略。

   以下示例语句授予 IAM 角色对存储桶 `amzn-s3-demo-bucket` 执行 `s3:GetObject` 和 `s3:PutObject` 操作的访问权限：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt2",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
     ]
   }
   ```

------

1. 确保应用授予对密钥的访问权限的策略。
**注意**  
如果账户 B 所担任的 IAM 角色已经具有[管理员访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/getting-started_create-admin-group.html)，则您无需从用户的 IAM 策略授予对密钥的访问权限。

   以下示例语句授予 IAM 角色使用密钥 `arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd` 的权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt3",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey",
           "kms:Encrypt",
           "kms:GenerateDataKey",
           "kms:ReEncrypt*"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
       }
     ]
   }
   ```

------

## 对存储桶对象配置跨账户访问


由存储桶拥有账户（账户 A）以外的账户（账户 C）上载的对象可能需要明确的对象级 ACL，以向查询账户（账户 B）授予读取访问权限。为避免此要求，账户 C 在将对象放入账户 A 的存储桶之前应代入账户 A 中的角色。有关更多信息，请参阅[如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cross-account-access-s3/)。

# 在 Amazon Glue Data Catalog 中配置对数据库和表的访问
对 Amazon Glue 中数据库和表的访问

如果您将 Amazon Glue Data Catalog 与 Amazon Athena 结合使用，则可以为 Athena 中使用的数据库和表 Data Catalog 对象定义资源级策略。

**注意**  
本主题将讨论数据库和表级别的安全性。有关配置列级别、行级别和单元格级别安全性的信息，请参阅 [Data filtering and cell-level security in Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/data-filtering.html)。

在 IAM 基于身份的策略中定义资源级别权限。

**重要**  
本部分介绍 IAM 基于身份的策略中的资源级权限。这些权限与基于资源的策略不同。有关差异的更多信息，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_identity-vs-resource.html) 中的 *基于身份的策略与基于资源的策略*。

对于这些任务，请参阅以下主题：


| 执行此任务 | 请参阅以下主题 | 
| --- | --- | 
| 创建定义针对资源访问的 IAM 策略 | 《IAM 用户指南》中的[创建 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。 | 
| 了解 Amazon Glue 中使用 IAM 基于身份的策略 | 《Amazon Glue 开发人员指南》中的[基于身份的策略（IAM 策略）](https://docs.amazonaws.cn/glue/latest/dg/using-identity-based-policies.html)。 | 

 **本节内容** 
+  [限制](#access-to-glue-resources-limitations) 
+  [针对每个 Amazon Web Services 区域 配置对目录和数据库的 Amazon Glue 访问](#full-access-to-default-db-per-region) 
+  [关于 Amazon Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions) 
+  [数据库和表级别权限示例](#examples-fine-grained-table-database-policies) 

## 限制


当您针对 Amazon Glue Data Catalog 和 Athena 使用数据库和表级别的访问控制时，请考虑以下限制：
+ 启用了 IAM Identity Center 的 Athena 工作组要求将 Lake Formation 配置为使用 IAM Identity Center 身份。有关更多信息，请参阅《Amazon Lake Formation 用户指南》**中的 [Integrating IAM Identity Center](https://docs.amazonaws.cn/lake-formation/latest/dg/identity-center-integration.html)。
+ 您只能限制对数据库和表的访问。这些控件适用于表级别。您无法限制对表内各个分区的访问。有关更多信息，请参阅 [关于 Amazon Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions)。
+ Amazon Glue Data Catalog包含以下资源：`CATALOG`、`DATABASE`、`TABLE` 和 `FUNCTION`。
**注意**  
对于此列表，各个账户的在 Athena 与 Amazon Glue Data Catalog 之间公用的资源包括 `TABLE`、`DATABASE` 和 `CATALOG`，而 `Function` 特定于 Amazon Glue。对于 Athena 中的删除操作，您必须包含对 Amazon Glue 操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

  层次结构如下所示：`CATALOG` 是每个账户中所有 `DATABASES` 的原级，`DATABASE` 是其所有 `TABLES` 和 `FUNCTIONS` 的原级。例如，在您账户的目录中，对于属于 `db` 数据库的名为 `table_test` 的表，其原级为您账户中的 `db` 和目录。对于 `db` 数据库，其原级是您的账户中的目录，其后代是表和函数。有关资源的层次结构的更多信息，请参阅《Amazon Glue 开发人员指南》**中的 [Data Catalog 中的 ARN 列表](https://docs.amazonaws.cn/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。
+ 对于资源上的任何非删除 Athena 操作，例如 `CREATE DATABASE`、`CREATE TABLE`、`SHOW DATABASE`、`SHOW TABLE` 或 `ALTER TABLE`，您需要在资源（表或数据库）上以及该资源在 Data Catalog 中的所有原级上调用该操作的权限。例如，对于表来说，其原级是所属的数据库以及账户的目录。对于数据库来说，其原级是账户的目录。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。
+ 对于 Athena 中的删除操作（例如 `DROP DATABASE` 或 `DROP TABLE`），您还需要拥有在该数据目录中资源的所有祖先级和子孙级上调用删除操作的权限。例如，要删除数据库，您需要数据库、目录（作为数据库的原级）以及所有表和用户定义的函数（作为数据库的子代）的权限。表没有子代。要运行 `DROP TABLE`，您需要对该表、该表所属的数据库以及目录执行该操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

## 针对每个 Amazon Web Services 区域 配置对目录和数据库的 Amazon Glue 访问


为了让 Athena 使用 Amazon Glue，需要制定一项策略，授予访问您的数据库和您账户中每个 Amazon Web Services 区域 的 Amazon Glue Data Catalog 的相应权限。要创建数据库，还需要 `CreateDatabase` 权限。在以下示例策略中，将 Amazon Web Services 区域、Amazon Web Services 账户 ID 和数据库名称替换为您自己的名称。

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## 关于 Amazon Glue 中表分区和版本的访问控制


在 Amazon Glue 中，表可以具有分区和版本。表版本和分区在 Amazon Glue 中不视为独立的资源。通过授予对表及表的原级资源的访问权限，授予对该表版本和分区的访问权限。

出于访问控制的目的，以下访问权限适用：
+ 控件适用于表级别。您只能限制对数据库和表的访问。例如，如果您允许访问某个分区表，此访问权限应用到该表的所有分区。您无法限制对表内各个分区的访问。
**重要**  
要在分区的 Amazon Glue 上运行操作，需要目录、数据库和表级别的分区操作权限。仅仅访问表中的分区是不够的。例如，要在数据库 `myDB` 中的表 `myTable` 上运行 `GetPartitions`，必须授予 `glue:GetPartitions` 对目录、`myDB` 数据库和 `myTable` 资源的权限。
+ 访问控制不适用于表版本。对于分区，对表以前版本的访问权限通过在 Amazon Glue 中，在表上对表版本 API 的访问权限以及表原级的访问权限来授予。

有关对 Amazon Glue 操作的权限信息，请参阅《Amazon Glue 开发人员指南**》中的 [Amazon Glue API 权限：操作和资源参考](https://docs.amazonaws.cn/glue/latest/dg/api-permissions-reference.html)。

## 数据库和表级别权限示例


下表列出了 IAM 基于身份的策略的示例，这些策略允许访问 Athena 中的数据库和表。建议您从这些示例开始，根据您的需求，调整它们以允许或拒绝对特定数据库和表的特定操作。

这些示例包括访问数据库和目录，以便 Athena 和 Amazon Glue 可以协同工作。对于多个 Amazon 区域，请为每个数据库和目录包括类似策略，每个区域一行。

在示例中，将 `example_db` 数据库名称和 `test` 表名称替换为您的数据库名称和表名称。


| DDL 语句 | 授予对资源的访问权限的 IAM 访问策略的示例 | 
| --- | --- | 
| ALTER DATABASE | 允许修改 example\$1db 数据库的属性。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| CREATE DATABASE | 允许创建名为 example\$1db 的数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | 允许在 example\$1db 数据库中创建名为 test 的表。<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | 允许删除 example\$1db 数据库（包括其中的所有表）。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | 允许删除 example\$1db 数据库中名为 test 的分区表。如果您的表没有分区，请勿包含分区操作。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | 将 Hive 兼容分区添加到名为 test 的表之后，允许更新目录元数据中的 example\$1db 数据库。<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | 允许列出 Amazon Glue Data Catalog 中的所有数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | 允许列出 example\$1db 数据库中的所有表。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 

# 配置 Amazon Glue 数据目录的跨账户存取
授予 Amazon Glue 数据目录跨账户访问权限

您可以使用 Athena 的跨账户 Amazon Glue 目录功能来从您自己的账户以外的账户注册 Amazon Glue 目录。为 Amazon Glue 配置所需 IAM 权限并将目录注册为 Athena [DataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_DataCatalog.html) 资源后，您可以使用 Athena 运行跨账户查询。要了解如何使用 Athena 控制台注册来自其他账户的目录，请参阅 [从其他账户注册数据目录](data-sources-glue-cross-account.md)。

有关 Amazon Glue 中跨账户访问的更多信息，请参阅《Amazon Glue 开发人员指南**》中的[授予跨账户访问权限](https://docs.amazonaws.cn/glue/latest/dg/cross-account-access.html)。

## 开始之前


因为此功能使用现有的 Athena `DataCatalog` 资源 API 和功能来启用跨账户访问，我们建议您先阅读以下资源：
+ [连接到数据来源](work-with-data-stores.md) - 包含有关将 Athena 与 Amazon Glue、Hive 或 Lambda 数据目录源搭配使用的主题。
+ [数据目录示例策略](datacatalogs-example-policies.md) - 介绍如何编写控制对数据目录访问权限的策略。
+ [将 Amazon CLI 与 Hive 元存储结合使用](datastores-hive-cli.md)：介绍如何使用带有 Hive 元存储仓的 Amazon CLI，但包含适用于其他数据来源的使用案例。

## 注意事项和限制


当前，Athena 跨账户 Amazon Glue 目录访问具有以下限制：
+ 此功能仅在支持 Athena 引擎版本 2 或更高版本的 Amazon Web Services 区域可用。有关 Athena 引擎版本的更多信息，请参阅 [Athena 引擎版本控制](engine-versions.md)。要升级工作组的引擎版本，请参阅 [更改 Athena 引擎版本](engine-versions-changing.md)。
+ 当您在账户中注册另一个账户的 Amazon Glue Data Catalog 时，您可以创建一个区域 `DataCatalog` 资源，该资源将仅链接到该特定区域中的其他账户数据。
+ 当前，包含跨账户 Amazon Glue 目录的 `CREATE VIEW` 语句不受支持。
+ 无法跨账户查询使用 Amazon 托管密钥进行加密的目录。对于希望跨账户查询的目录，请改用客户托管密钥 (`KMS_CMK`)。有关客户托管密钥和 Amazon 托管密钥之间差异的信息，请参阅《Amazon Key Management Service Developer Guide》**中的 [Customer keys and Amazon keys](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#key-mgmt                     )。

## 开始使用


在下列应用场景中，“借入者”账户（666666666666）想要运行 `SELECT` 查询，该查询引用的 Amazon Glue 目录属于“拥有者”账户（999999999999），如下例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

在以下过程中，步骤 1a 和 1b 显示了如何授予借入者账户对拥有者账户 Amazon Glue 资源的访问权限，从借入者和拥有者这两个角度均进行了展示。该示例授予对数据库 `tpch1000` 和表 `customer` 的访问权限。更改这些示例名称以满足您的要求。

### 步骤 1a：创建借入者角色以及可访问拥有者 Amazon Glue 资源的策略


要创建借入者账户角色以及可访问拥有者账户 Amazon Glue 资源的策略，可以使用 Amazon Identity and Access Management（IAM）控制台或 [IAM API](https://docs.amazonaws.cn/IAM/latest/APIReference/API_Operations.html)。以下过程使用了 IAM 控制台。

**创建借入者角色以及可访问拥有者账户 Amazon Glue 资源的策略**

1. 通过借入者账户从 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 登录 IAM 控制台。

1. 在导航窗格中，展开**访问管理**，然后选择**策略**。

1. 选择**创建策略**。

1. 对于**策略编辑器**，选择 **JSON**。

1. 在策略编辑器中，输入以下策略，然后根据您的要求对其进行修改：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. 选择**下一步**。

1. 在**查看并创建**页面上，输入策略的名称（例如 **CrossGluePolicyForBorrowerRole**）作为**策略名称**。

1. 选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 在**选择信任的实体**页面上，选择 **Amazon Web Services 账户**，然后选择**下一步**。

1. 在**添加权限**页面上，在搜索框中输入所创建策略的名称（例如 **CrossGluePolicyForBorrowerRole**）。

1. 选择策略名称旁的复选框，然后选择**下一步**。

1. 在 **Name, review, and create**（命名、检查和创建）页面上，对于 **Role name**（角色名称），输入角色的名称（例如 **CrossGlueBorrowerRole**）。

1. 选择**创建角色**。

### 步骤 1b：创建要向借入者授予 Amazon Glue 访问权限的拥有者策略


要从拥有者账户（999999999999）向借入者角色授予 Amazon Glue 访问权限，可以使用 Amazon Glue 控制台或 Amazon Glue [PutResourcePolicy](https://docs.amazonaws.cn/glue/latest/webapi/API_PutResourcePolicy.html) API 操作。以下步骤使用了 Amazon Glue 控制台。

**从拥有者账户向借入者账户授予 Amazon Glue 访问权限**

1. 通过拥有者账户从 [https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/) 登录 Amazon Glue 控制台。

1. 在导航窗格中，展开**数据目录**，然后选择**目录设置**。

1. 在 **Permissions**（权限）框中，输入类似如下的策略。对于 *rolename*，输入借入者在步骤 1a 中创建的角色（例如 **CrossGlueBorrowerRole**）。如果要增加权限范围，您可以将通配符 `*` 用于数据库和表资源类型。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

完成后，建议使用 [Amazon Glue API](https://docs.amazonaws.cn/glue/latest/dg/aws-glue-api.html) 进行一些测试跨账户调用，确认权限是否按预期进行配置。

### 第 2 步：借入者注册属于拥有者账户的 Amazon Glue Data Catalog


以下过程说明了如何使用 Athena 控制台将拥有者的 Amazon Web Services 账户中的 Amazon Glue Data Catalog 配置为数据来源。要了解如何使用 API 操作而不是通过控制台来注册目录，请参阅 [（可选）使用 API 注册属于拥有者账户的 Athena 数据目录](#security-iam-cross-account-glue-catalog-access-step-2-api)。

**注册属于其他账户的 Amazon Glue Data Catalog**

1. 从 [https://console.aws.amazon.com/athena/](https://console.amazonaws.cn/athena/home) 打开 Athena 控制台。

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.amazonaws.cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 展开**管理**，然后选择**数据来源**。

1. 选择右上角的 **Connect data source**（连接数据来源）。

1. 在**选择数据来源**页面上，对于**数据来源**，选择 **S3 - Amazon Glue Data Catalog**，然后选择**下一步**。

1. 在**输入数据来源详细信息**页面的 **Amazon Glue Data Catalog** 部分中，对于**选择 Amazon Glue Data Catalog**，选择 **Amazon Glue Data Catalog 中的其他账户**。

1. 对于**数据来源详细信息**，提供以下信息：
   + **数据来源名称**：输入要在 SQL 查询中使用的名称，以引用其他账户中的数据目录。
   + **Description**（描述）–（可选）输入其他账户中数据目录的描述。
   + **Catalog ID**（目录编号）– 输入数据目录所属账户的 12 位 Amazon Web Services 账户 ID。Amazon Web Services 账户 ID 即是目录 ID。

1. （可选）展开**标签**，输入要与数据来源关联的键-值对。有关标签的更多信息，请参阅[标记 Athena 资源](tags.md)。

1. 选择**下一步**。

1. 在 **Review and create**（审核和创建）页面中，检查数据来源的详细信息，然后选择 **Create data source**（创建数据来源）。**Data source details**（数据来源详细信息）页面列出了所注册数据目录的数据库和标签。

1. 选择**数据来源和目录**。您注册的数据目录在 **Data source name**（数据来源名称）列中列出。

1. 要查看或编辑有关数据目录的信息，请选择该目录，然后选择**Actions**（操作）、**Edit**（编辑）。

1. 要删除新数据目录，请选择该目录，然后选择 **Actions**（操作）、**Delete**（删除）。

### 步骤 3：借入者提交查询


借入者提交一个查询，该查询使用 *catalog*.*database*.*table* 语法引用目录，如下例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

借入者如不使用完全限定的语法，也可以通过 [QueryExecutionContext](https://docs.amazonaws.cn/athena/latest/APIReference/API_QueryExecutionContext.html) 传入目录，从而根据上下文指定目录。

## （可选）配置其他 Amazon S3 权限

+ 如果借入者账户使用 Athena 查询将新数据写入拥有者账户中的表，即使该表存在于拥有者的账户中，拥有者也将无法自动获取对 Amazon S3 中此数据的访问权限。这是因为借入者就是 Amazon S3 中信息的对象拥有者，另有配置的情况除外。要授予拥有者对数据的访问权限，请作为附加步骤相应地设置对象的权限。
+ 某些跨账户 DDL 操作，如 [MSCK REPAIR TABLE](msck-repair-table.md) 需要 Amazon S3 权限。例如，如果借入者账户正在根据拥有者账户中的表（该表的数据位于拥有者账户 S3 存储桶中）执行跨账户 `MSCK REPAIR` 操作，则该存储桶必须向借入者所担任的角色授予权限才能成功查询。

有关授予存储桶权限的信息，请参阅《*Amazon Simple Storage Service 用户指南*》中的[如何设置 ACL 存储桶权限？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/set-bucket-permissions.html)。

## （可选）动态使用目录


在某些情况下，您可能需要快速对跨账户 Amazon Glue 目录执行测试，而无需执行注册它的先决步骤。如果您已按照本文档前述说明正确配置了所需的 IAM 和 Amazon S3 权限，则您可以动态执行跨账户查询，而无需创建 `DataCatalog` 资源对象。

要在不注册的情况下显式引用目录，请使用以下示例中的语法：

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

使用格式“`glue:<arn>`”，其中 `<arn>` 是您想要使用的 [Amazon Glue Data Catalog ARN](https://docs.amazonaws.cn/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。在该示例中，Athena 使用此语法动态指向账户 999999999999 的 Amazon Glue 数据目录，如同您已为其单独创建了 `DataCatalog` 对象。

### 使用动态目录的注意事项


使用动态目录时，请记住以下几点。
+ 使用动态目录需要您通常用于 Athena Data Catalog API 操作的 IAM 权限。主要区别在于，Data Catalog 资源名称遵循 `glue:*` 命名约定。
+ 目录 ARN 必须属于正在运行查询的同一区域。
+ 在 DML 查询或视图中使用动态目录时，请使用转义双引号 (`\"`)。在 DDL 查询中使用动态目录时，请使用反引号字符 (```)。

## （可选）使用 API 注册属于拥有者账户的 Athena 数据目录


您可以使用 API 操作来注册属于拥有者账户的数据目录，而不是如第 2 步中所述使用 Athena 控制台。

Athena [DataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_DataCatalog.html) 资源的创建者必须具有运行 Athena [CreateDataCatalog](https://docs.amazonaws.cn/athena/latest/APIReference/API_CreateDataCatalog.html) API 操作的必要权限。根据您的要求，可能需要访问其他 API 操作。有关更多信息，请参阅 [数据目录示例策略](datacatalogs-example-policies.md)。

以下 `CreateDataCatalog` 请求正文为跨账户访问注册了 Amazon Glue 目录：

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

以下示例代码使用 Java 客户端创建 `DataCatalog` 对象。

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

完成这些步骤后，借入者应会在调用 [ListDataCatalogs](https://docs.amazonaws.cn/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作时看到 `ownerCatalog`。

## 其他资源

+ [从其他账户注册数据目录](data-sources-glue-cross-account.md)
+ *Amazon 规范性指导模式*指南中的[使用 Amazon Athena 配置对共享 Amazon Glue Data Catalog 的跨账户访问权限](https://docs.amazonaws.cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。
+ *Amazon 大数据博客*中的[使用 Amazon Athena 查询跨账户 Amazon Glue Data Catalog](https://www.amazonaws.cn/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)
+ 在《*Amazon Glue 开发人员指南*》中的[授予跨账户访问权限](https://docs.amazonaws.cn/glue/latest/dg/cross-account-access.html) 

# 从 Athena 配置对 Amazon Glue Data Catalog 中加密元数据的访问
针对数据目录中加密元数据的访问权限

如果您将 Amazon Glue Data Catalog 与 Amazon Athena 一起使用，您可以使用 Amazon Glue 控制台或 API在 Amazon Glue Data Catalog 中启用加密。想要了解有关信息，请参阅《Amazon Glue 开发人员指南**》中的 [加密数据目录](https://docs.amazonaws.cn/glue/latest/dg/encrypt-glue-data-catalog.html)。

如果对 Amazon Glue Data Catalog 加密，则必须将以下操作添加到用于访问 Athena 的所有策略：

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 配置对工作组和标签的访问
对工作组和标签的访问

工作组是由 Athena 管理的资源。因此，如果您的工作组策略使用获取 `workgroup` 作为输入的操作，您必须如下所示指定工作组的 ARN，其中 `workgroup-name` 是您的工作组的名称：

```
"Resource": [arn:aws:athena:region:AWSAcctID:workgroup/workgroup-name]
```

例如，对于 `us-west-2` 区域中用于 Amazon Web Services 账户 `123456789012` 的名为 `test_workgroup` 的工作组，请使用以下 ARN 指定工作组作为资源：

```
"Resource":["arn:aws:athena:us-east-2:123456789012:workgroup/test_workgroup"]
```

要访问启用了可信身份传播（TIP）的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.amazonaws.cn/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。
+ 有关工作组策略的列表，请参阅[工作组策略示例](example-policies-workgroup.md)。
+ 有关工作组的基于标签的策略列表，请参阅[使用基于标签的 IAM 访问控制策略](tags-access-control.md)。
+ 有关为工作组创建 IAM 策略的更多信息，请参阅 [使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)。
+ 有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.amazonaws.cn/athena/latest/APIReference/)中的 API 操作名称。
+ 有关 IAM 策略的更多信息，请参阅《IAM 用户指南》**中的[使用可视化编辑器创建策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 使用 IAM 策略控制工作组访问


要控制对工作组的访问，使用资源级 IAM 权限或基于身份的 IAM 策略。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

**注意**  
要访问启用了可信身份传播的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.amazonaws.cn/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。

以下是 Athena 的特定过程。

有关 IAM 的特定信息，请参阅本节末尾列出的链接。有关示例 JSON 工作组策略的信息，请参阅[工作组策略示例](example-policies-workgroup.md)。

**要在 IAM 控制台中使用可视化编辑器创建工作组策略**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧的导航窗格中，选择 **Policies (策略)**，然后选择 **Create policy (创建策略)**。

1. 在**可视化编辑器**选项卡上，选择**选择服务**。然后，选择要添加到策略的 Athena。

1. 选择 **Select actions (选择操作)**，然后选择要添加到策略的操作。可视化编辑器会显示 Athena 中可用的操作。有关更多信息，请参阅《服务授权参考》**中的 [Amazon Athena 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonathena.html)。

1. 选择 **add actions (添加操作)** 以键入特定操作，或使用通配符 (\$1) 指定多个操作。

   预设情况下，您创建的策略允许执行选择的操作。如果您在 Athena 中选择对 `workgroup` 资源执行一个或多个支持资源级权限的操作，则编辑器会列出 `workgroup` 资源。

1. 选择 **Resources (资源)**，为您的策略指定特定的工作组。有关示例 JSON 工作组策略，请参阅[工作组策略示例](example-policies-workgroup.md)。

1. 指定 `workgroup` 资源，如下所示：

   ```
   arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>
   ```

1. 选择 **Review policy (查看策略)**，然后为您创建的策略键入 **Name (名称)** 和 **Description (描述)**（可选）。查看策略摘要以确保您已授予所需的权限。

1. 选择**创建策略**可保存您的新策略。

1. 将此基于身份的策略附加到用户、组或角色。

有关详细信息，请参阅*服务授权参考*和《*IAM 用户指南*》中的以下主题：
+  [Amazon Athena 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonathena.html) 
+  [使用可视化编辑器创建策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor) 
+  [添加和移除 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) 
+  [控制对资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources) 

有关示例 JSON 工作组策略，请参阅[工作组策略示例](example-policies-workgroup.md)。

有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.amazonaws.cn/athena/latest/APIReference/)中的 API 操作名称。

# 工作组策略示例


本节包含您可以用于启用对工作组执行各种操作的策略示例。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《*IAM 用户指南*》中的 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

工作组是由 Athena 管理的 IAM 资源。因此，如果您的工作组策略使用获取 `workgroup` 作为输入的操作，您必须如下所示指定工作组的 ARN：

```
"Resource": [arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>]
```

其中，`<workgroup-name>` 是工作组的名称。例如，对于名为 `test_workgroup` 的工作组，指定它作为资源，如下所示：

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"]
```

有关 Amazon Athena 操作的完整列表，请参阅 [Amazon Athena API 参考](https://docs.amazonaws.cn/athena/latest/APIReference/)中的 API 操作名称。有关 IAM policy 的更多信息，请参阅《IAM 用户指南》中的 [使用可视化编辑器创建策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。有关为工作组创建 IAM 策略的更多信息，请参阅 [使用 IAM 策略控制工作组访问](workgroups-iam-policy.md)。
+  [Example policy for full access to all workgroups](#example1-full-access-all-wkgs) 
+  [Example policy for full access to a specified workgroup](#example2-full-access-this-wkg) 
+  [Example policy for running queries in a specified workgroup](#example3-user-access) 
+  [Example policy for running queries in the primary workgroup](#example4-run-in-primary-access) 
+  [Example policy for management operations on a specified workgroup](#example5-manage-wkgs-access) 
+  [Example policy for listing workgroups](#example6-list-all-wkgs-access) 
+  [Example policy for running and stopping queries in a specific workgroup](#example7-run-queries-access) 
+  [Example policy for working with named queries in a specific workgroup](#example8-named-queries-access) 
+  [Example policy for working with Spark notebooks](#example9-spark-workgroup) 

**Example 对所有工作组具有完全访问权限的策略示例**  
以下策略可实现对账户中可能存在的所有工作组资源具有完全访问权限。对于必须为其他所有用户监督和管理工作组的那些用户，我们建议您使用此策略。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

**Example 对指定工作组具有完全访问权限的策略示例**  
以下策略可实现对单个名为 `workgroupA` 的特定工作组资源具有完全访问权限。对于对特定工作组具有完全控制权限的用户，您可以使用此策略。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:GetWorkGroup",
                "athena:CreateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 运行指定工作组中查询的策略示例**  
在以下策略中，允许用户运行指定 `workgroupA` 中的查询并查看它们。不允许用户对工作组本身执行管理任务，例如，更新或删除它。请注意，示例策略不会将用户仅限于此工作组或拒绝访问其他工作组。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup", 
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 运行主工作组中查询的策略示例**  
您可以修改上述示例以允许特定用户在主工作组中运行查询。  
对于另行配置为运行指定工作组中查询的所有用户，我们建议您为其添加主工作组资源。在用户的指定工作组已被删除或禁用的情况下，在工作组用户策略中添加此策略资源有用。在这种情况下，他们可以继续运行主工作组中的查询。
要允许您账户中的用户运行主工作组中的查询，请将包含朱总做足 ARN 的行添加到 [Example policy for running queries in a specified workgroup](#example3-user-access) 的资源部分，如下例所示。  

```
arn:aws:athena:us-east-1:123456789012:workgroup/primary"
```

**Example 管理指定工作组操作的策略示例**  
在以下策略中，允许用户创建、删除、获取详细信息并更新工作组的 `test_workgroup`。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:GetWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 列出工作组的策略示例**  
以下策略允许所有用户列出所有工作组：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 运行和停止特定工作组中查询的策略示例**  
在此策略中，允许用户运行工作组中的查询：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 使用特定工作组中的命名查询的策略示例**  
在以下策略中，用户具有在指定工作组中创建和删除命名查询以及获取其相关信息的权限：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:DeleteNamedQuery"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"            ]
        }
    ]
}
```

**Example 在 Athena 中使用 Spark 笔记本的示例策略**  
使用以下策略在 Athena 中使用 Spark 笔记本。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCreatingWorkGroupWithDefaults",
            "Action": [
                "athena:CreateWorkGroup",
                "s3:CreateBucket",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "s3:GetBucketLocation",
                "athena:ImportNotebook"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*",
                "arn:aws:s3:::123456789012-us-east-1-athena-results-bucket-*",
                "arn:aws:iam::123456789012:role/service-role/AWSAthenaSparkExecutionRole-*",
                "arn:aws:iam::123456789012:policy/service-role/AWSAthenaSparkRolePolicy-*"
            ]
        },
        {
            "Sid": "AllowRunningCalculations",
            "Action": [
                "athena:ListWorkGroups",
                "athena:GetWorkGroup",
                "athena:StartSession",
                "athena:CreateNotebook",
                "athena:ListNotebookMetadata",
                "athena:ListNotebookSessions",
                "athena:GetSessionStatus",
                "athena:GetSession",
                "athena:GetNotebookMetadata",
                "athena:CreatePresignedNotebookUrl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*"
        },
        {
            "Sid": "AllowListWorkGroupAndEngineVersions",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

# 使用已启用 IAM Identity Center 的 Athena 工作组
已启用 IAM Identy Center 的工作组

[Trusted identity propagation](https://docs.amazonaws.cn//singlesignon/latest/userguide/trustedidentitypropagation-overview.html) 是一项 Amazon IAM Identity Center 功能，已连接的 Amazon Web Services 服务的管理员可以使用它来授予和审计对服务数据的访问权限。对这些数据的访问权限基于用户属性，例如组关联。设置可信身份传播要求已连接的 Amazon Web Services 服务的管理员和 IAM Identity Center 管理员之间进行协作。有关更多信息，请参阅 [Prerequisites and considerations](https://docs.amazonaws.cn//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)。

借助 [IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)，您可以管理员工身份（也称为员工用户）的登录安全性。您可以在 IAM Identity Center 中创建或连接员工用户，并集中管理他们对所有 Amazon 账户和应用程序的访问权限。您可以使用多账户权限为这些用户分配 Amazon Web Services 账户 的访问权限。您可以使用应用程序分配为用户分配对启用了 IAM Identity Center 的应用程序、云应用程序和客户安全断言标记语言（SAML 2.0）应用程序的访问权限。有关更多信息，请参阅*《Amazon IAM Identity Center 用户指南》*中的 [Trusted identity propagation across applications](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation.html)。

EMR Studio 和 SageMaker Unified Studio 均支持可信身份传播的 Athena SQL。每个平台都提供了与 Athena 一起使用 TIP 的特定接口。

在 EMR Studio 中使用 Athena SQL 和 IAM Identity Center 身份时，您有两个工作组选项：
+ **常规工作组** - 无需分配用户/组。
+ **支持 IAM Identity Center 的工作组** - 需要通过 IAM Identity Center 控制台或 API 分配用户/组。

对于这两个选项，您都可以在启用 IAM Identity Center 的情况下使用 EMR Studio 中的 Athena SQL 接口运行查询。

## 注意事项和限制


在 Amazon Athena 中使用可信身份传播时，请注意以下几点：
+ 创建工作组后，您无法更改工作组的身份验证方法。
  + 无法修改现有的 Athena SQL 工作组来支持启用 IAM Identity Center 的工作组。现有的 Athena SQL 工作组可以将身份传播到下游服务。
  + 无法将启用 IAM Identity Center 的工作组修改为支持资源级 IAM 权限或基于身份的 IAM 策略。
+ 要访问启用了可信身份传播的工作组，必须将 IAM Identity Center 用户分配给由 Athena [GetWorkGroup](https://docs.amazonaws.cn/athena/latest/APIReference/API_GetWorkGroup.html) API 操作的响应返回的 `IdentityCenterApplicationArn`。
+ 必须将 Amazon S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon S3 用户指南》**中的 [S3 访问权限管控和公司目录身份](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants-directory-ids.html)。
+ 启用 IAM Identity Center 的 Athena 工作组需要将 Lake Formation 配置为使用 IAM Identity Center 身份。有关配置信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[集成 IAM Identity Center](https://docs.amazonaws.cn/lake-formation/latest/dg/identity-center-integration.html)。
+ 默认情况下，在启用了 IAM Identity Center 的工作组中，查询会在 30 分钟后超时。您可以请求延长查询超时时间，不过在可信身份传播工作组中可以运行的最长查询时间为一个小时。
+ 可信身份传播工作组中的用户或组权限更改可能需要长达一个小时才能生效。
+ 使用可信身份传播的 Athena 工作组中的查询不能直接从 Athena 控制台运行。它们必须通过已启用 IAM Identity Center 的 EMR Studio 中的 Athena 接口运行。有关在 EMR Studio 中使用 Athena 的更多信息，请参阅*《Amazon EMR 管理指南》*中的 [Use the Amazon Athena SQL editor in EMR Studio](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-studio-athena.html)。
+ 可信身份传播与以下 Athena 功能不兼容。
  + 已启用 IAM Identy Center 的工作组的 `aws:CalledVia` 上下文键
  + Athena for Spark 工作组。
  + 对 Athena API 的联合访问
  + 使用 Lake Formation 以及 Athena JDBC 和 ODBC 驱动程序对 Athena 进行联合访问。
+ 您只能在以下 Amazon Web Services 区域中将可信身份传播与 Athena 结合使用：
  + `us-east-2` – 美国东部（俄亥俄州）
  + `us-east-1` – 美国东部（弗吉尼亚州北部）
  + `us-west-1` – 美国西部（北加利福尼亚）
  + `us-west-2` – 美国西部（俄勒冈州）
  + `af-south-1` – 非洲（开普敦）
  + `ap-east-1` – 亚太地区（香港）
  + `ap-southeast-3` – 亚太地区（雅加达）
  + `ap-south-1` – 亚太地区（孟买）
  + `ap-northeast-3` – 亚太地区（大阪）
  + `ap-northeast-2` – 亚太地区（首尔）
  + `ap-southeast-1` – 亚太地区（新加坡）
  + `ap-southeast-2` – 亚太地区（悉尼）
  + `ap-northeast-1` – 亚太地区（东京）
  + `ca-central-1` – 加拿大（中部）
  + `eu-central-1`：欧洲地区（法兰克福）
  + `eu-central-2`：欧洲（苏黎世）
  + `eu-west-1`：欧洲地区（爱尔兰）
  + `eu-west-2` – 欧洲地区（伦敦）
  + `eu-south-1` – 欧洲地区（米兰）
  + `eu-west-3` – 欧洲地区（巴黎）
  + `eu-north-1` – 欧洲地区（斯德哥尔摩）
  + `me-south-1` – 中东（巴林）
  + `sa-east-1` – 南美洲（圣保罗）

## 所需的权限


在 Athena 控制台中创建启用 IAM Identity Center 的工作组的管理员 IAM 用户必须附加以下策略。
+ `AmazonAthenaFullAccess` 托管策略。有关更多信息，请参阅 [Amazon 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。
+ 以下支持 IAM 和 AM Identity Center 操作的内联策略：

------
#### [ JSON ]

****  

  ```
  { "Version":"2012-10-17",		 	 	  "Statement": [ { "Action": [ "iam:createRole",
      "iam:CreatePolicy", "iam:AttachRolePolicy", "iam:ListRoles", "identitystore:ListUsers",
      "identitystore:ListGroups", "identitystore:CreateUser", "identitystore:CreateGroup",
      "sso:ListInstances", "sso:CreateInstance", "sso:DeleteInstance", "sso:ListTrustedTokenIssuers",
      "sso:DescribeTrustedTokenIssuer", "sso:ListApplicationAssignments",
      "sso:DescribeRegisteredRegions", "sso:GetManagedApplicationInstance",
      "sso:GetSharedSsoConfiguration", "sso:PutApplicationAssignmentConfiguration",
      "sso:CreateApplication", "sso:DeleteApplication", "sso:PutApplicationGrant",
      "sso:PutApplicationAuthenticationMethod", "sso:PutApplicationAccessScope",
      "sso:ListDirectoryAssociations", "sso:CreateApplicationAssignment",
      "sso:DeleteApplicationAssignment", "organizations:ListDelegatedAdministrators",
      "organizations:DescribeAccount", "organizations:DescribeOrganization",
      "organizations:CreateOrganization", "sso-directory:SearchUsers", "sso-directory:SearchGroups",
      "sso-directory:CreateUser" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Action": [
      "iam:PassRole" ], "Effect": "Allow", "Resource": [
          "arn:aws:iam::111122223333:role/service-role/AWSAthenaSQLRole-*"
      ] } ] }
  ```

------

## 创建启用 IAM Identity Center 的 Athena 工作组


以下过程介绍了创建启用 IAM Identity Center 的 Athena 工作组的相关步骤和选项。有关可用于 Athena 工作组的其他配置选项的说明，请参阅 [创建工作组](creating-workgroups.md)。

**在 Athena 控制台中创建启用 SSO 的工作组**

1. 从 [https://console.aws.amazon.com/athena/](https://console.amazonaws.cn/athena/home) 打开 Athena 控制台。

1. 在 Athena 控制台导航窗格中，选择 **Workgroups**（工作组）。

1. 在 **Workgroups**（工作组）页面中，选择 **Create workgroup**（创建工作组）。

1. 在**创建工作组**页面上，在**工作组名称**中输入一个工作组的名称。

1. 对于**分析引擎**，请使用 **Athena SQL** 默认项。

1. 对于**身份验证**，请选择 **IAM Identity Center**。

1. 在 **IAM Identity Center 访问权限的服务角色**中，选择一个现有服务角色或创建一个新的服务角色。

   Athena 需要相应权限才能访问 IAM Identity Center。Athena 需要服务角色才能执行此操作。服务角色是一个由您管理的 IAM 角色，它授权 Amazon 服务代表您访问其他 Amazon 服务。要查询联合目录或运行 UDF，请使用相应的 Lambda 权限更新服务角色。有关更多信息，请参阅 *IAM 用户指南*中的[创建向 Amazon 服务委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-service.html)。

1. 展开**查询结果配置**，然后在**查询结果的位置**中输入或选择一个 Amazon S3 路径。

1. （可选）选择**加密查询结果**。默认情况下，支持使用 SSE-S3。要将 SSE-KMS 和 CSE-KMS 与查询结果位置结合使用，请从 Amazon S3 访问权限管控中向 **IAM Identity Center 的服务角色**授予权限。有关更多信息，请参阅[示例角色策略](#workgroups-identity-center-access-grant-location-sample-role-policy)。

1. （可选）选择**创建基于用户身份的 S3 前缀**。

   创建启用 IAM Identity Center 的工作组时，默认选中**启用 S3 访问权限管控**选项。您可以使用 Amazon S3 访问权限管控来控制对 Amazon S3 中 Athena 查询结果位置（前缀）的访问权限。有关 Amazon S3 访问权限管控的更多信息，请参阅 [Managing access with Amazon S3 Access Grants](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants.html)。

   在使用 IAM Identity Center 身份验证的 Athena 工作组中，您可以创建基于身份的查询结果位置，这些位置由 Amazon S3 访问权限管控管理。这些基于用户身份的 Amazon S3 前缀可让 Athena 工作组中的用户将其查询结果与同一工作组中的其他用户隔离开来。

   启用用户前缀选项后，Athena 会将用户 ID 作为 Amazon S3 路径前缀附加到工作组的查询结果输出位置（例如 `s3://amzn-s3-demo-bucket/${user_id}`）。要使用此功能，您必须对访问权限管控进行配置，仅允许用户访问带有 `user_id` 前缀的位置。有关限制对 Athena 查询结果访问权限的 Amazon S3 访问权限管控位置策略示例，请参阅 [示例角色策略](#workgroups-identity-center-access-grant-location-sample-role-policy)。
**注意**  
选择用户身份 S3 前缀选项会自动启用工作组的“覆盖客户端侧设置”选项，如下一步所述。“覆盖客户端侧设置”选项是用户身份前缀功能的一个必要条件。

1. 展开**设置**，然后确认已选中**覆盖客户端侧设置**。

   如果已选中**覆盖客户端侧设置**，则会在工作组级别对工作组中的所有客户端强制实施工作组设置。有关更多信息，请参阅 [Override client-side settings (覆盖客户端设置)](workgroups-settings-override.md)。

1. （可选）按照 [创建工作组](creating-workgroups.md) 中所述对所需的任何其他配置进行设置。

1. 选择 **Create workgroup (创建工作组)**。

1. 参照 Athena 控制台的**工作组**部分，将 IAM Identity Center 目录中的用户或群组分配给已启用 IAM Identity Center 的 Athena 工作组。

## 示例角色策略


以下示例显示了将角色附加到 Amazon S3 Access Grant 位置的策略，该位置限制了对 Athena 查询结果的访问。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Condition": {
                "ArnNotEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringNotEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Deny",
            "Resource": "*",
            "Sid": "ExplicitDenyS3"
        },
        {
            "Action": [
                "kms:*"
            ],
            "Effect": "Deny",
            "NotResource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "ExplictDenyKMS"
        },
        {
            "Action": [
                "s3:ListMultipartUploadParts",
                "s3:GetObject"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelReadPermissions"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelWritePermissions"
        },
        {
            "Action": "s3:ListBucket",
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                },
                "StringLikeIfExists": {
                    "s3:prefix": [
                        "${identitystore:UserId}",
                        "${identitystore:UserId}/*"
                    ]
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION",
            "Sid": "BucketLevelReadPermissions"
        },
        {
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "KMSPermissions"
        }
    ]
}
```

------

# 为工作组配置最低加密
配置最低加密

作为 Athena SQL 工作组的管理员，您可以在 Amazon S3 中对该工作组的所有查询结果强制执行最低级别的加密。您可以使用此功能确保查询结果永远不会以未加密状态存储在 Amazon S3 存储桶中。

当启用最低加密功能的工作组中的用户提交查询时，他们只能将加密设置为您配置的最低级别，或者如果有更高的加密级别，则只能设置为更高的级别。Athena 在用户运行查询时指定的级别或工作组中设置的级别对查询结果进行加密。

可用级别如下：
+ **基础**：使用 Amazon S3 托管式密钥（**SSE\$1S3**）的 Amazon S3 服务器端加密。
+ **中级** – 使用 KMS 托管式密钥（**SSE\$1KMS**）的服务器端加密。
+ **高级** - 使用 KMS 托管式密钥（**CSE\$1KMS**）的客户端加密。

## 注意事项和限制

+ 最低加密功能不适用于启用 Apache Spark 的工作组。
+ 只有当工作组未启用**[覆盖客户端设置](https://docs.amazonaws.cn/athena/latest/ug/workgroups-settings-override.html)**选项时，最低加密功能才起作用。
+ 如果工作组启用了**覆盖客户端设置**选项，则以工作组加密设置为准，最低加密设置无效。
+ 启用此功能不收取任何费用。

## 为工作组启用最低加密


在创建或更新工作组时，您可以为 Athena SQL 工作组的查询结果启用最低加密级别。为此，您可以使用 Athena 控制台、Athena API 或 Amazon CLI。

### 使用 Athena 控制台启用最低加密


要开始使用 Athena 控制台创建或编辑工作组，请参阅[创建工作组](https://docs.amazonaws.cn/athena/latest/ug/workgroups-create-update-delete.html#creating-workgroups)或[编辑工作组](https://docs.amazonaws.cn/athena/latest/ug/workgroups-create-update-delete.html#editing-workgroups)。配置工作组时，请使用以下步骤启用最低加密。

**为工作组查询结果配置最低加密级别**

1. 清除**覆盖客户端设置**选项，或者确认该选项未被选中。

1. 选择**加密查询结果**选项。

1. 对于**加密类型**，选择您希望 Athena 用于工作组查询结果的加密方法（**SSE\$1S3**、**SSE\$1KMS** 或 **CSE\$1KMS**）。这些加密类型对应于基础、中级和高级安全级别。

1. 要对所有用户强制使用您选择的最低加密级别的加密方法，请选择**将 *encryption\$1method* 设置为最低加密**。

   当您选择此选项时，系统将显示一个表格，显示在您选择的加密类型变为最低加密类型时允许用户使用的加密层次结构和加密级别。

1. 创建工作组或更新工作组配置后，选择**创建工作组**或**保存更改**。

### 使用 Athena API 或 Amazon CLI 启用最低加密


当您使用 [CreateWorkGroup](https://docs.amazonaws.cn/athena/latest/APIReference/API_CreateWorkGroup.html) 或 [UpdateWorkGroup](https://docs.amazonaws.cn/athena/latest/APIReference/API_UpdateWorkGroup.html) API 创建或更新 Athena SQL 工作组时，请将 [EnforceWorkGroupConfiguration](https://docs.amazonaws.cn/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnforceWorkGroupConfiguration) 设置为 `false`，将 [EnableMinimumEncryptionConfiguration](https://docs.amazonaws.cn/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnableMinimumEncryptionConfiguration) 设置为 `true`，并使用 [EncryptionOption](https://docs.amazonaws.cn/athena/latest/APIReference/API_EncryptionConfiguration.html#athena-Type-EncryptionConfiguration-EncryptionOption) 指定加密类型。

在 Amazon CLI 中，使用带有 `--configuration` 或 `--configuration-updates` 参数的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html) 或 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html) 命令，并指定与 API 对应的选项。

# 配置对于预编译语句的访问


本主题介绍了 Amazon Athena 中可用于预编译语句的 IAM 权限。每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)中的 *IAM 安全最佳实践*。

有关预编译语句的更多信息，请参阅 [使用参数化查询](querying-with-prepared-statements.md)。

创建、管理和执行预编译语句需要以下 IAM 权限。

```
athena:CreatePreparedStatement
athena:UpdatePreparedStatement
athena:GetPreparedStatement
athena:ListPreparedStatements
athena:DeletePreparedStatement
```

如下表所示，使用这些权限。


****  

| 要执行的操作 | 使用这些权限 | 
| --- | --- | 
| 运行 PREPARE 查询 | athena:StartQueryExecution athena:CreatePreparedStatement | 
| 重新运行 PREPARE 查询以更新现有预编译语句 | athena:StartQueryExecution athena:UpdatePreparedStatement | 
| 运行 EXECUTE 查询 | athena:StartQueryExecution athena:GetPreparedStatement | 
| 运行 DEALLOCATE PREPARE 查询 | athena:StartQueryExecution athena:DeletePreparedStatement | 

## 示例


在以下示例中，IAM 策略授予对指定账户 ID 和工作组管理和运行预编译语句的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:CreatePreparedStatement",
                "athena:UpdatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:DeletePreparedStatement",
                "athena:ListPreparedStatements"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/<workgroup-name>"
            ]
        }
    ]
}
```

------

# 使用适用于 Athena 的 CalledVia 上下文密钥
使用 CalledVia 上下文密钥

[主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal) 向 Amazon 提交[请求](https://docs.amazonaws.cn/IAM/latest/UserGuide/intro-structure.html#intro-structure-request)时，Amazon 会将请求信息收集到*请求上下文*，以评估并授权该请求。您可以使用 JSON 策略的 `Condition` 元素将请求上下文中的键与您在策略中指定的键值进行比较。*全局条件上下文键*是带 `aws:` 前缀的条件键。

## 关于 aws:CalledVia 上下文密钥


您可以使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全局条件上下文键将策略中的服务与代表 IAM 主体（用户或角色）发出请求的服务进行比较。主体向 Amazon Web Services 服务 发出请求时，该服务可能会使用主体的凭证向其他服务发出后续请求。`aws:CalledVia` 键包含链中代表主体发出请求的每个服务的有序列表。

通过指定 `aws:CalledVia` 上下文键的服务主体名称，您可以将上下文键设置为特定于 Amazon Web Services 服务。例如，您可以使用 `aws:CalledVia` 条件键将请求限制为仅从 Athena 发出的请求。要借助 Athena 在策略中使用 `aws:CalledVia` 条件键，您可以指定 Athena 服务主体名称 `athena.amazonaws.com`，如以下示例所示。

```
 ...
    "Condition": {
        "ForAnyValue:StringEquals": { 
            "aws:CalledVia": "athena.amazonaws.com"
        }
    }
...
```

您可以使用 `aws:CalledVia` 上下文键来确保调用者只有在从 Athena 调用资源时才能访问资源（如 Lambda 函数）。

**注意**  
`aws:CalledVia` 上下文键与可信身份传播功能不兼容。

## 添加可选的 CalledVia 上下文密钥，用于访问 Lambda 函数


Athena 要求调用者有 `lambda:InvokeFunction` 权限，以便调用与查询关联的 Lambda 函数。以下语句指定用户只能通过 Athena 调用 Lambda 函数。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:function:OneAthenaLambdaFunction",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }
    ]
}
```

------

下例说明了将前一语句添加到策略中以允许用户运行和读取联合查询。允许执行这些操作的主体可以运行指定与联合数据来源关联的 Athena 目录的查询。但是，除非通过 Athena 调用该函数，否则主体无法访问关联的 Lambda 函数。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0", 
            "Effect": "Allow",
            "Action": [ 
                "athena:GetWorkGroup", 
                "s3:PutObject", 
                "s3:GetObject", 
                "athena:StartQueryExecution", 
                "s3:AbortMultipartUpload",  
                "athena:StopQueryExecution", 
                "athena:GetQueryExecution", 
                "athena:GetQueryResults", 
                "s3:ListMultipartUploadParts" 
            ], 
            "Resource": [ 
                "arn:aws:athena:*:111122223333:workgroup/WorkGroupName",
                "arn:aws:s3:::MyQueryResultsBucket/*", 
                "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"
            ] 
        }, 
        {
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": "athena:ListWorkGroups", 
            "Resource": "*" 
        }, 
        {
            "Sid": "VisualEditor2", 
            "Effect": "Allow", 
            "Action": 
                [ 
                "s3:ListBucket", 
                "s3:GetBucketLocation" 
                ], 
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket" 
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction", 
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ], 
            "Condition": {
                "ForAnyValue:StringEquals": { 
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }            
    ]
}
```

------

有关 `CalledVia` 条件键的更多信息，请参阅《*IAM 用户指南*》中的 [Amazon 全局条件上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

# 允许访问适用于外部配置 Hive 元存储的 Athena 数据连接器


本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。在将类似的权限策略附加到 IAM 身份之前，请仔细检查这些策略并根据您的需求修改它们。
+  [Example Policy to Allow an IAM Principal to Query Data Using Athena Data Connector for External Hive Metastore](#hive-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena Data Connector for External Hive Metastore](#hive-creating-iam) 

**Example ：允许 IAM 主体使用适用于外部 Hive 元存储的 Athena 数据连接器查询数据**  
除了对 Athena 操作授予完全访问权限的 [Amazon 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 之外，还将以下策略附加到 IAM 主体。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:layer:MyAthenaLambdaLayer:*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:PutObject",<br />"s3:ListMultipartUploadParts",<br />"s3:AbortMultipartUpload"</pre>  |  `s3` 操作允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"` 的资源读取和写入到该资源，其中 *MyLambdaSpillLocation* 标识在调用的一个或多个 Lambda 函数的配置中指定的溢出存储桶。仅当您使用 Lambda 层创建自定义运行时依赖关系以减少部署时函数构件大小时，才需要 *arn:aws:lambda:\$1:*MyAWSAcctId*:layer:*MyAthenaLambdaLayer*:\$1* 资源标识符。最后一个位置的 `*` 是图层版本的通配符。  | 
|  <pre>"lambda:GetFunction",<br />"lambda:GetLayerVersion",<br />"lambda:InvokeFunction"</pre>  | 允许查询调用 Resource 块中指定的 Amazon Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 

**Example ：允许 IAM 主体创建适用于外部 Hive 元存储的 Athena 数据连接器**  
除了对 Athena 操作授予完全访问权限的 [Amazon 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 之外，还将以下策略附加到 IAM 主体。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:ListFunctions",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:PublishLayerVersion",
                "lambda:DeleteLayerVersion",
                "lambda:UpdateFunctionConfiguration",
                "lambda:PutFunctionConcurrency",
                "lambda:DeleteFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:111122223333: function: MyAthenaLambdaFunctionsPrefix*"
        }
    ]
}
```
 **权限说明**   
允许查询为 `Resource` 块中指定的 Amazon Lambda 函数调用 Amazon Lambda 函数。例如 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunction`，其中 *MyAthenaLambdaFunction* 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。

# 允许 Lambda 函数访问外部 Hive 元存储


要在账户中调用 Lambda 函数，您必须创建具有以下权限的角色：
+ `AWSLambdaVPCAccessExecutionRole` – [Amazon Lambda 执行角色](https://docs.amazonaws.cn/lambda/latest/dg/lambda-intro-execution-role.html)权限，用于管理将函数连接到 VPC 的弹性网络接口。确保您有足够数量的可用网络接口和 IP 地址。
+ `AmazonAthenaFullAccess` – [AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 托管式策略授予对 Athena 的完全访问权限。
+ 一个 Amazon S3 策略，该策略允许 Lambda 函数对 S3 进行写入并允许 Athena 从 S3 中进行读取。

例如，以下策略定义溢出位置 `s3:\\mybucket\spill` 的权限。

------
#### [ JSON ]

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }
```

------

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 创建 Lambda 函数


要在您的账户中创建 Lambda 函数，需要函数开发权限或 `AWSLambdaFullAccess` 角色。有关更多信息，请参阅 [Amazon Lambda 的基于身份的 IAM 策略](https://docs.amazonaws.cn/lambda/latest/dg/access-control-identity-based.html)。

由于 Athena 使用 Amazon Serverless Application Repository 创建 Lambda 函数，因此，创建 Lambda 函数的超级用户或管理员也应具有 IAM 策略[以允许 Athena 联合查询](federated-query-iam-access.md)。

## 配置目录注册和元数据 API 操作的权限


要访问目录注册 API 和元数据 API 操作，请使用 [AmazonAthenaFullAccess 托管策略](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。如果您不使用 `AmazonAthenaFullAccess` 策略，请将以下 API 操作添加到您的 Athena 策略：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs",
                "athena:GetDataCatalog",
                "athena:CreateDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:GetDatabase",
                "athena:ListDatabases",
                "athena:GetTableMetadata",
                "athena:ListTableMetadata"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

## 跨区域调用 Lambda 函数


预设情况下，Athena 调用在同一区域中定义的 Lambda 函数。要在运行 Athena 查询的区域以外的 Amazon Web Services 区域 中调用 Lambda 函数，请使用 Lambda 函数的完整 ARN。

以下示例显示欧洲地区（法兰克福）的目录如何指定美国东部（弗吉尼亚州北部）的 Lambda 函数，从而提取来自欧洲地区（法兰克福）的 Hive 元存储数据。

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new     
```

当您通过此方式指定完整 ARN 时，Athena 会对 `us-east-1` 调用 `external-hms-service-new` Lambda 函数以从 `eu-central-1` 中提取 Hive 元存储数据。

**注意**  
应在运行 Athena 查询的相同 Amazon Web Services 区域 中注册目录。

## 跨账户调用 Lambda 函数


有时，您可能需要从其他账户访问 Hive 元存储。例如，要运行 Hive 元存储，您可以使用 Athena 查询的账户之外的其他账户。不同的组或团队可能会在其 VPC 内使用不同的账户运行 Hive 元存储。或者，您可能希望访问来自不同的组或团队中的各个 Hive 元存储的元数据。

Athena 使用 [Amazon Lambda 对跨账户访问的支持](https://www.amazonaws.cn/blogs/compute/easy-authorization-of-aws-lambda-functions/)来启用对 Hive 元存储的跨账户访问。

**注意**  
请注意，对 Athena 的跨账户访问通常意味着对 Amazon S3 中的元数据和数据的跨账户访问。

设想以下场景：
+ 账户 `111122223333` 在 Athena 中的 us-east-1 上设置 Lambda 函数 `external-hms-service-new` 以访问 EMR 集群上运行的 Hive 元存储。
+ 账户 `111122223333` 希望允许账户 444455556666 访问 Hive 元存储数据。

为了向账户 `444455556666` 授予对 Lambda 函数 `external-hms-service-new` 的访问权限，账户 `111122223333` 使用以下 Amazon CLI `add-permission` 命令。该命令设置了格式以便于阅读。

```
$ aws --profile perf-test lambda add-permission
      --function-name external-hms-service-new
      --region us-east-1
      --statement-id Id-ehms-invocation2
      --action "lambda:InvokeFunction"
      --principal arn:aws:iam::444455556666:user/perf1-test
{
    "Statement": "{\"Sid\":\"Id-ehms-invocation2\",
                   \"Effect\":\"Allow\",
                   \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                   \"Action\":\"lambda:InvokeFunction\",
                   \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}"
}
```

要检查 Lambda 权限，请使用 `get-policy` 命令，如以下示例中所示。该命令设置了格式以便于阅读。

```
$ aws --profile perf-test lambda get-policy 
      --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new 
      --region us-east-1
{
    "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f",
    "Policy": "{\"Version\":\"2012-10-17\",		 	 	 
                \"Id\":\"default\",
                \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\",
                                \"Effect\":\"Allow\",
                                \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                                \"Action\":\"lambda:InvokeFunction\",
                                \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}"
}
```

添加权限后，您可以在定义目录 `ehms` 时对 `us-east-1` 使用 Lambda 函数的完整 ARN，如下所示：

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new
```

有关跨区域调用的信息，请参阅本主题前面的 [跨区域调用 Lambda 函数](#hive-metastore-iam-access-lambda-cross-region-invocation)。

### 授予对数据的跨账户访问


您必须先授予对 Amazon S3 中数据的跨账户访问权限，然后才能运行 Athena 查询。您可以通过下列方式之一来执行该操作：
+ 使用[规范用户 ID](https://docs.amazonaws.cn/general/latest/gr/acct-identifiers.html) 更新 Amazon S3 存储桶的访问控制列表策略。
+ 添加对 Amazon S3 存储桶策略的跨账户访问权限。

例如，将以下策略添加到账户 `111122223333` 中的 Amazon S3 存储桶策略以允许账户 `444455556666` 从指定的 Amazon S3 位置读取数据。

------
#### [ JSON ]

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Sid": "Stmt1234567890123", "Effect":
    "Allow", "Principal": { "AWS":
        "arn:aws:iam::444455556666:user/perf1-test"
    }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ]
    }
```

------

**注意**  
您可能需要向 Amazon S3 授予对数据以及 Amazon S3 溢出位置的跨账户访问权限。当响应对象的大小超过给定阈值时，Lambda 函数会使额外数据流出到溢出位置。有关示例策略，请参阅本主题的开头部分。

在当前示例中，在向 `444455556666,` 授予跨账户访问权限后，`444455556666` 可在其自己的 `account` 中使用目录 `ehms` 查询账户 `111122223333` 中定义的表。

在以下示例中，SQL Workbench 配置文件 `perf-test-1` 适用于账户 `444455556666`。查询使用目录 `ehms` 访问 Hive 元存储以及账户 `111122223333` 中的 Amazon S3 数据。

![\[在 SQL Workbench 中跨账户访问 Hive 元存储和 Amazon S3 数据。\]](http://docs.amazonaws.cn/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)


# 创建连接器和 Athena 目录所需的权限


要调用 Athena `CreateDataCatalog`，您必须创建一个具有以下权限的角色：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
  "Sid": "ECR",
  "Effect": "Allow",
  "Action": [
  "ecr:BatchGetImage",
  "ecr:GetDownloadUrlForLayer"
  ],
  "Resource": "arn:aws:ecr:*:*:repository/*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "s3:GetObject",
  "glue:TagResource",
  "glue:GetConnection",
  "glue:CreateConnection",
  "glue:DeleteConnection",
  "glue:UpdateConnection",
  "serverlessrepo:CreateCloudFormationTemplate",
  "serverlessrepo:GetCloudFormationTemplate",
  "cloudformation:CreateStack",
  "cloudformation:DeleteStack",
  "cloudformation:DescribeStacks",
  "cloudformation:CreateChangeSet",
  "cloudformation:DescribeAccountLimits",
  "cloudformation:CreateStackSet",
  "cloudformation:ValidateTemplate",
  "cloudformation:CreateUploadBucket",
  "cloudformation:DescribeStackDriftDetectionStatus",
  "cloudformation:ListExports",
  "cloudformation:ListStacks",
  "cloudformation:EstimateTemplateCost",
  "cloudformation:ListImports",
  "lambda:InvokeFunction",
  "lambda:GetFunction",
  "lambda:DeleteFunction",
  "lambda:CreateFunction",
  "lambda:TagResource",
  "lambda:ListFunctions",
  "lambda:GetAccountSettings",
  "lambda:ListEventSourceMappings",
  "lambda:ListVersionsByFunction",
  "lambda:GetFunctionConfiguration",
  "lambda:PutFunctionConcurrency",
  "lambda:UpdateFunctionConfiguration",
  "lambda:UpdateFunctionCode",
  "lambda:DeleteFunctionConcurrency",
  "lambda:RemovePermission",
  "lambda:AddPermission",
  "lambda:ListTags",
  "lambda:GetAlias",
  "lambda:GetPolicy",
  "lambda:ListAliases",
  "ec2:DescribeSecurityGroups",
  "ec2:DescribeSubnets",
  "ec2:DescribeVpcs",
  "secretsmanager:ListSecrets",
  "glue:GetCatalogs"
  ],
  "Resource": "*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "iam:AttachRolePolicy",
  "iam:DetachRolePolicy",
  "iam:DeleteRolePolicy",
  "iam:PutRolePolicy",
  "iam:GetRolePolicy",
  "iam:CreateRole",
  "iam:TagRole",
  "iam:DeleteRole",
  "iam:GetRole",
  "iam:PassRole",
  "iam:ListRoles",
  "iam:ListAttachedRolePolicies",
  "iam:ListRolePolicies",
  "iam:GetPolicy",
  "iam:UpdateRole"
  ],
  "Resource": [
  "arn:aws:iam::*:role/RoleName",
  "arn:aws:iam::111122223333:policy/*"
  ]
  }
  ]
  }
```

------

# 允许访问 Athena 联合查询：示例策略
允许访问 Athena 联合查询

本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。仔细检查这些策略并根据您的需求修改它们，然后再将它们附加到 IAM 身份。

有关将 IAM 策略添加到用户的信息，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/) 中的 [添加和删除 IAM 身份权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+  [Example policy to allow an IAM principal to run and return results using Athena Federated Query](#fed-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create a Data Source Connector](#fed-creating-iam) 

**Example ：允许 IAM 主体运行并使用 Athena 联合查询返回结果**  
以下基于身份的权限策略允许用户或其他 IAM 主体执行使用 Athena 联合查询所需的操作。允许执行这些操作的主体可以运行指定与联合数据来源关联的 Athena 目录的查询。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Athena",
            "Effect": "Allow",
            "Action": [
                "athena:GetDataCatalog",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/WorkgroupName",
                "arn:aws:athena:us-east-1:111122223333:datacatalog/DataCatalogName"
            ]
        },
        {
            "Sid": "ListAthenaWorkGroups",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        },
        {
            "Sid": "Lambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::MyLambdaSpillBucket",
                "arn:aws:s3:::MyLambdaSpillBucket/*",
                "arn:aws:s3:::MyQueryResultsBucket",
                "arn:aws:s3:::MyQueryResultsBucket/*"
            ]
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre> "athena:GetQueryExecution", <br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  运行联合查询所需的 Athena 权限。  | 
|  <pre> "athena:GetDataCatalog",<br /> "athena:GetQueryExecution,"<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  运行联合视图查询所需的 Athena 权限。视图需要 `GetDataCatalog` 操作。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允许查询为 Resource 块中指定的 Amazon Lambda 函数调用 Amazon Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 
|  <pre>"s3:AbortMultipartUpload",<br />"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:ListMultipartUploadParts",<br />"s3:PutObject"</pre>  |  必须具备 `s3:ListBucket` 和 `s3:GetBucketLocation` 权限，才能访问运行 `StartQueryExecution` 的 IAM 主体的查询输出存储桶。 `s3:PutObject`、`s3:ListMultipartUploadParts` 和 `s3:AbortMultipartUpload` 允许将查询结果写入由 `arn:aws:s3:::MyQueryResultsBucket/*` 资源标识符指定的查询结果存储桶的所有子文件夹，其中 *MyQueryResultsBucket* 为 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 允许读取指定为 `arn:aws:s3:::MyQueryResultsBucket` 的资源的查询结果和查询历史记录，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。 `s3:GetObject` 还允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的资源中读取，其中 *MyLambdaSpillPrefix* 在被调用的一个或多个 Lambda 函数的配置中指定。  | 

**Example ：允许 IAM 主体创建数据来源连接器**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允许创建和管理列为资源的 Lambda 函数。在此示例中，资源标识符 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名称前缀，其中 `MyAthenaLambdaFunctionsPrefix` 是一组 Lambda 函数的名称中使用的共享前缀，因此它们不需要单独指定为资源。您可以指定一个或多个 Lambda 函数资源。  | 
|  <pre>"s3:GetObject"</pre>  | 允许读取 Amazon Serverless Application Repository 所需的存储桶，如资源标识符 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1 所指定。此存储桶可能特定于您的账户。 | 
|  <pre>"cloudformation:*"</pre>  |  允许创建和管理由资源 `MyCFStackPrefix` 指定的 Amazon CloudFormation 堆栈。这些堆栈和堆栈集是 Amazon Serverless Application Repository 部署连接器和 UDF 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允许在由资源标识符 arn:aws:serverlessrepo:\$1:\$1:applications/\$1 指定的 Amazon Serverless Application Repository 中搜索、查看、发布和更新应用程序。 | 
|  <pre>"ecr:BatchGetImage",<br />"ecr:GetDownloadUrlForLayer"</pre>  |  允许创建的 Lambda 函数访问联合身份验证连接器 ECR 映像。  | 

# 允许访问 Athena UDF：策略示例
允许访问 UDF

本主题中的权限策略示例演示了需要允许的操作以及允许执行这些操作的资源。在将类似的权限策略附加到 IAM 身份之前，请仔细检查这些策略并根据您的需求修改它们。
+  [Example Policy to Allow an IAM Principal to Run and Return Queries that Contain an Athena UDF Statement](#udf-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena UDF](#udf-creating-iam) 

**Example ：允许 IAM 主体运行并返回包含 Athena UDF 语句的查询**  
以下基于身份的权限策略允许用户或其他 IAM 主体执行使用 Athena UDF 语句运行查询所需的操作。  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "lambda:InvokeFunction",
                "athena:GetQueryResults",
                "s3:ListMultipartUploadParts",
                "athena:GetWorkGroup",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "athena:StopQueryExecution",
                "athena:GetQueryExecution",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:athena:*:MyAWSAcctId:workgroup/MyAthenaWorkGroup",
                "arn:aws:s3:::MyQueryResultsBucket/*",
                "arn:aws:lambda:*:MyAWSAcctId:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:MyAWSAcctId:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"athena:StartQueryExecution",<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StopQueryExecution",<br /> "athena:GetQueryExecution",<br /></pre>  |  在 `MyAthenaWorkGroup` 工作组中运行查询所需的 Athena 权限。  | 
|  <pre>"s3:PutObject",<br />"s3:GetObject",<br />"s3:AbortMultipartUpload"</pre>  |  `s3:PutObject` 和 `s3:AbortMultipartUpload` 允许将查询结果写入由 `arn:aws:s3:::MyQueryResultsBucket/*` 资源标识符指定的查询结果存储桶的所有子文件夹，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 允许读取指定为 `arn:aws:s3:::MyQueryResultsBucket` 的资源的查询结果和查询历史记录，其中 *MyQueryResultsBucket* 是 Athena 查询结果存储桶。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。 `s3:GetObject` 还允许从指定为 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的资源中读取，其中 *MyLambdaSpillPrefix* 在被调用的一个或多个 Lambda 函数的配置中指定。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允许查询调用 Resource 块中指定的 Amazon Lambda 函数。例如 arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 指定要调用的 Lambda 函数的名称。如示例中所示，可以指定多个函数。 | 

**Example ：允许 IAM 主体创建 Athena UDF**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**权限说明**  

| 允许的操作 | 说明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允许创建和管理列为资源的 Lambda 函数。在此示例中，资源标识符 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名称前缀，其中 *MyAthenaLambdaFunctionsPrefix* 是一组 Lambda 函数的名称中使用的共享前缀，因此它们不需要单独指定为资源。您可以指定一个或多个 Lambda 函数资源。  | 
|  <pre>"s3:GetObject"</pre>  | 允许读取 Amazon Serverless Application Repository 所需的存储桶，如资源标识符 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1 所指定。 | 
|  <pre>"cloudformation:*"</pre>  |  允许由资源 *MyCFStackPrefix* 指定的 Amazon CloudFormation 堆栈的创建和管理。这些堆栈和堆栈集是 Amazon Serverless Application Repository 部署连接器和 UDF 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允许在由资源标识符 arn:aws:serverlessrepo:\$1:\$1:applications/\$1 指定的 Amazon Serverless Application Repository 中搜索、查看、发布和更新应用程序。 | 

# 允许使用 Athena 访问机器学习


必须允许运行 Athena ML 查询的 IAM 主体对其使用的 Sagemaker 端点执行 `sagemaker:invokeEndpoint` 操作。在附加到用户身份且基于身份的权限策略中包括类似于下面的策略语句。此外，附加对 Athena 操作授予完全访问权限的 [Amazon 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，或者附加允许操作子集的已修改内联策略。

将示例中的 `arn:aws:sagemaker:region:AWSAcctID:ModelEndpoint` 替换为要在查询中使用的模型端点的 ARN。有关更多信息，请参阅《服务授权参考》中的 [Actions, resources, and condition keys for SageMaker AI](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonsagemaker.html)**。

```
{
            "Effect": "Allow",
            "Action": [
                "sagemaker:invokeEndpoint"
            ],
            "Resource": "arn:aws:sagemaker:us-west-2:123456789012:workteam/public-crowd/default"
}
```

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

# 启用对 Athena API 的联合访问


此部分介绍允许组织中的用户或客户端应用程序调用 Amazon Athena API 操作的联合身份访问。在这种情况下，组织的用户没有 Athena 的直接访问权限。相反，您在 Amazon 外部的 Microsoft Active Directory 中管理用户凭证。Active Directory 支持 [SAML 2.0](https://wiki.oasis-open.org/security)（安全断言标记语言 2.0）。

要在此方案中对用户进行身份验证，请使用支持 SAML.2.0 的 JDBC 或 ODBC 驱动程序，访问 Active Directory 联合身份验证服务 (AD FS) 3.0 并允许客户端应用程序调用 Athena API 操作。

有关更多信息对于 Amazon 的 SAML 2.0 支持，请参阅《IAM 用户指南**》中的 [关于 SAML 2.0 联合身份验证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_saml.html)。

**注意**  
特定类型的身份提供者（IdP），即 Windows Server 中包括的 Active Directory 联合身份验证服务（AD FS 3.0）支持对 Athena API 的联合访问。联合访问与 IAM Identity Center 可信身份传播功能不兼容。访问通过支持 SAML 2.0 的 JDBC 或 ODBC 驱动程序版本建立。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

**Topics**
+ [

## 开始前的准备工作
](#access-federation-before-you-begin)
+ [

## 了解身份验证流程
](#access-federation-diagram)
+ [

## 过程：对 Athena API 启用基于 SAML 的联合访问
](#access-federation-procedure)

## 开始前的准备工作


 在开始之前，请满足以下先决条件：
+ 在组织中，安装并配置 ADFS 3.0 作为您的 IdP。
+ 在用于访问 Athena 的客户端上，安装和配置最新可用版本的 JDBC 或 ODBC 驱动程序。驱动程序必须包括对与 SAML 2.0 兼容的联合身份访问的支持。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

## 了解身份验证流程


下图将说明对 Athena API 进行联合访问的身份验证过程。

![\[对 Athena API 的联合访问示意图。\]](http://docs.amazonaws.cn/athena/latest/ug/images/athena-saml-based-federation.png)


1. 您组织中的用户使用具有 JDBC 或 ODBC 驱动程序的客户端应用程序，请求组织的 IdP 进行身份验证。该 IdP 是 ADFS 3.0。

1. IdP 根据 Active Directory（组织的身份存储）对用户进行身份验证。

1. IdP 构建一个具有用户相关信息的 SAML 断言，并将此断言通过 JDBC 或 ODBC 驱动程序发送到客户端应用程序。

1. JDBC 或 ODBC 驱动程序调用 Amazon Security Token Service [AssumeRoleWithSAML](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作，将其传递给以下参数：
   + SAML 提供商的 ARN
   + 要代入的角色的 ARN
   + 来自 IdP 的 SAML 断言

   有关更多信息，请参阅 [Amazon Security Token Service API 参考](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html)中的 *AssumeRoleWithSAML*。

1. 通过 JDBC 或 ODBC 驱动程序发送到客户端应用程序的 API 相应包含临时安全凭证。

1. 客户端应用程序使用临时安全凭证调用 Athena API 操作，从而允许您的用户访问 Athena API 操作。

## 过程：对 Athena API 启用基于 SAML 的联合访问


该过程在组织的 IdP 与 Amazon 账户之间建立信任关系，以实现对 Amazon Athena API 操作的基于 SAML 的联合访问。

**要启用对 Athena API 的联合访问，请执行以下操作：**

1. 在组织中，将 Amazon 注册为您 IdP 中的服务提供商 (SP)。此过程称为*信赖方信任*。有关更多信息，请参阅《IAM 用户指南**》中的 [使用信赖方信任配置您的 SAML 2.0 IdP](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)。作为此任务的一部分，请执行以下步骤：

   1. 从以下 URL 获取示例 SAML 元数据文档：[https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml)。

   1. 在您组织的 IdP（ADFS）中，生成一个等同元数据 XML 文件，将您的 IdP 描述为 Amazon 的身份提供者。您的元数据文件必须包括发布者名称、创建日期、过期日期以及 Amazon 用来验证来自您组织的身份验证响应（断言）的密钥。

1. 在 IAM 控制台中，创建一个 SAML 身份提供程序实体。有关更多信息，请参阅《IAM 用户指南**》中的[创建 SAML 身份提供者](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。作为此步骤的一部分，请执行以下操作：

   1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

   1. 上载此过程的第 1 步中由 IdP (ADFS) 生成的 SAML 元数据文档。

1. 在 IAM 控制台中，为您的 IdP 创建一个或多个 IAM 角色。有关更多信息，请参阅《IAM 用户指南》**中的[针对第三方身份提供程序创建角色（联合）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-idp.html)。作为此步骤的一部分，请执行以下操作：
   + 在角色的权限策略中，列出允许您组织的用户在 Amazon 中执行的操作。
   + 在角色的信任策略中，将在此过程第 2 步中创建的 SAML 提供商实体设置为主体。

   这将在您的组织与 Amazon 之间建立信任关系。

1. 在您组织的 IdP (ADFS) 中，定义可将您组织中的用户或组映射到 IAM 角色的断言。将用户和组映射到 IAM 角色也称为*断言规则*。请注意，您的组织中不同的用户和组可能映射到不同的 IAM 角色。

   有关配置 ADFS 中的映射的信息，请参阅博客文章：[使用 Windows Active Directory、ADFS 和 SAML 2.0 启用 Amazon 的联合身份验证](https://www.amazonaws.cn/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。

1. 安装和配置具有 SAML 2.0 支持的 JDBC 或 ODBC 驱动程序。有关更多信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md)。

1. 指定从您应用程序到 JDBC 或 ODBC 驱动程序的连接字符串。有关应用程序应使用的连接字符串的信息，请参阅《*JDBC 驱动程序安装和配置指南*》中的“*使用 Active Directory 联合身份验证服务 (ADFS) 凭证提供程序*”或《*ODBC 驱动程序安装和配置指南*》中的类似主题，可从 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md) 和 [通过 ODBC 连接到 Amazon Athena](connect-with-odbc.md) 主题以 PDF 格式下载。

   下面大致概述了配置驱动程序的连接字符串：

   1. 在 `AwsCredentialsProviderClass configuration` 中，设置 `com.simba.athena.iamsupport.plugin.AdfsCredentialsProvider`，指示您希望通过 ADFS IdP 使用基于 SAML 2.0 的身份验证。

   1. 对于 `idp_host`，请提供 ADFS IdP 服务器的主机名。

   1. 对于 `idp_port`，请提供 ADFS IdP 侦听 SAML 断言请求的端口号。

   1. 对于 `UID` 和 `PWD`，请提供 AD 域用户凭证。在 Windows 上，如果使用驱动程序时未提供 `UID` 和 `PWD`，则驱动程序尝试获取登录到 Windows 计算机用户的用户凭证。

   1. （可选）将 `ssl_insecure` 设置为 `true`。在这种情况下，驱动程序不会检查 ADFS IdP 服务器的 SSL 证书的真实性。如果没有将 ADFS IdP 的 SSL 证书配置为受驱动程序信任，则需要设置为 `true`。

   1. 要启用 Active Directory 域用户或组与一个或多个 IAM 角色的映射（如此过程中第 4 步所述），请在 JDBC 或 ODBC 连接的 `preferred_role` 中，为驱动程序连接指定要代入的 IAM 角色 (ARN)。指定 `preferred_role` 是可选的，在角色不是断言规则中列出的第一个角色时非常有用。

   作为此过程的结果，将发生以下操作：

   1. JDBC 或 ODBC 驱动程序调用 Amazon STS [AssumeRoleWithSAML](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API，并向其传递断言，如[架构示意图](#access-federation-diagram)中的第 4 步所示。

   1. Amazon 确保代入角色的请求来自 SAML 提供商实体中引用的 IdP。

   1. 如果请求成功，Amazon STS [AssumeRoleWithSAML](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作会返回一组临时安全凭证，您的客户端应用程序即可用其向 Athena 发出已签名的请求。

      现在，您的应用程序拥有当前用户的相关信息，并且可以通过编程方式访问 Athena。