

# 启用跨账户联合查询
<a name="xacct-fed-query-enable"></a>

联合查询允许您使用部署在 Amazon Lambda 上的数据来源连接器查询 Amazon S3 以外的数据来源。跨账户联合查询功能允许 Lambda 函数和要查询的数据来源位于不同的账户中。

**注意**  
仅在您尚未将联合数据来源注册到 Amazon Glue Data Catalog 时才使用此方法。如果您已将数据来源注册到 Amazon Glue Data Catalog，请使用 Amazon Glue Data Catalog 跨账户功能和权限模型。有关更多信息，请参阅《Amazon Glue 用户指南》中的[授予跨账户访问权限](https://docs.amazonaws.cn/glue/latest/dg/cross-account-access.html)**。

作为数据管理员，您可以通过与数据分析人员的账户共享数据连接器来启用跨账户联合查询。或者作为数据分析人员，可以通过将数据管理员提供的共享 Lambda ARN 添加到您的账户中来启用跨账户联合查询。对原始账户中的连接器进行配置更改时，更新的配置将自动应用于其他用户账户中该连接器的共享实例。

## 注意事项和限制
<a name="xacct-fed-query-enable-considerations-and-limitations"></a>
+ 跨账户联合查询功能适用于非 Hive 元存储数据连接器，该连接器使用基于 Lambda 的数据来源。
+ 此功能不适用于 Amazon Glue Data Catalog 数据来源类型。有关跨账户访问 Amazon Glue Data Catalog 的信息，请参阅 [配置 Amazon Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。
+ 如果来自连接器的 Lambda 函数的响应超过 6MB 的 Lambda 响应大小限制，Athena 会自动对响应进行加密、批处理并溢出到您配置的 Amazon S3 存储桶。运行 Athena 查询的实体必须有权访问溢出位置，Athena 才能读取溢出的数据。我们建议您设置 Amazon S3 生命周期策略，以从溢出位置删除对象，因为查询完成后不需要数据。
+ 不支持跨 Amazon Web Services 区域 使用联合查询。

## 所需的权限
<a name="xacct-fed-query-enable-required-permissions"></a>

要设置所需的权限，必须同时在账户 A（*444455556666*）和账户 B（*111122223333*）中执行操作。

### 账户 A 的操作
<a name="xacct-fed-query-enable-required-permissions-account-a"></a>

若要让数据管理员账户 A 与数据分析人员账户 B 共享 Lambda 函数，账户 B 需要 Lambda 调用函数和溢出存储桶访问权限。因此，账户 A 应该将[基于资源的策略](https://docs.amazonaws.cn/lambda/latest/dg/access-control-resource-based.html)添加到 Lambda 函数并添加[主体](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-policy-language-overview.html)访问 Amazon S3 中其溢出存储桶的权限。

1. 以下策略向账户 A 中的 Lambda 函数授予账户 B 调用 Lambda 函数的权限。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "CrossAccountInvocationStatement",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:user/username"
                   ]
               },
               "Action": "lambda:InvokeFunction",
               "Resource": "arn:aws:lambda:us-east-1:444455556666:function:lambda-function-name"
           }
       ]
   }
   ```

------

1. 以下策略允许溢出存储桶访问账户 B 中的主体。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
               "AWS": ["arn:aws:iam::111122223333:user/username"]
               },
               "Action": [
                   "s3:GetObject",
                   "s3:ListBucket"
                ],
               "Resource": [
                   "arn:aws:s3:::spill-bucket",
                   "arn:aws:s3:::spill-bucket/*"
               ]
           }
        ]
    }
   ```

------

1. 如果 Lambda 函数使用 Amazon KMS 密钥而不是联合开发工具包提供的默认加密来加密溢出存储桶，则账户 A 中的 Amazon KMS 密钥策略必须向账户 B 中的用户授予访问权限，如以下示例所示。

   ```
   { 
       "Sid": "Allow use of the key", 
       "Effect": "Allow", 
       "Principal": 
       { 
          "AWS": ["arn:aws:iam::account-B-id:user/username"] 
       }, 
       "Action": [ "kms:Decrypt" ], 
       "Resource": "*" // Resource policy that gets placed on the KMS key. 
    }
   ```

### 账户 B 的操作
<a name="xacct-fed-query-enable-required-permissions-account-b"></a>

若要让账户 A 与账户 B 共享其连接器，账户 B 必须创建一个名为 `AthenaCrossAccountCreate-account-A-id` 的角色，账户 A 通过调用 Amazon Security Token Service [AssumeRole](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRole.html) API 操作担任该角色。

1. 使用 IAM 控制台或 Amazon CLI 将 `AthenaCrossAccountCreate-account-A-id` 角色创建为自定义信任策略角色。自定义信任策略可委托访问权限并允许其他人在您的 Amazon 账户中执行操作。有关具体步骤，请参阅 *IAM 用户指南*中的[使用自定义信任策略创建角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-custom.html)。

   该信任关系应有一个主体，其中的密钥是是 `AWS`，而值是账户 A 的 ARN，如下例所示。

   ```
   ...
   "Principal": 
   { 
      "AWS": ["arn:aws:iam::account-A-id:user/username"]
   }, 
   ...
   ```

1. 同样在账户 B 中，创建允许 `CreateDataCatalog` 操作的如下策略。

   ```
   {
    "Effect": "Allow",
    "Action": "athena:CreateDataCatalog",
    "Resource": "arn:aws:athena:*:account-B-id:datacatalog/*"
   }
   ```

1. 将允许 `CreateDataCatalog` 操作的策略添加到您使用账户 B 创建的 `AthenaCrossAccountCreate-account-A-id` 角色中。

## 与账户 B 共享账户 A 中的数据来源
<a name="xacct-fed-query-enable-sharing-a-lambda-data-source-in-account-a-with-account-b"></a>

获得相应权限后，您可以使用 Athena 控制台中的**数据来源和目录**页面，与其他账户（账户 B）共享您账户（账户 A）中的数据连接器。账户 A 保留对连接器的完全控制权和所有权。账户 A 对连接器进行配置更改时，已更新的配置将应用于账户 B 中的共享连接器。

**注意**  
只能共享 Lambda 类型的数据来源，不能共享使用 Amazon Glue 连接的数据来源。有关更多信息，请参阅 [可用数据来源连接器](connectors-available.md)。

**与账户 B 共享账户 A 中的 Lambda 数据来源**

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. 在**数据来源和目录**页面上，选择要共享的连接器的链接。

1. 在 Lambda 数据来源的详细信息页面上，选择右上角的**操作**菜单，然后选择**共享**。

1. 在 **与其他账户共享 *Lambda-name*** 对话框中，输入所需信息。
   + 在**数据来源名称**中，输入您要在另一个账户中显示的复制数据来源名称。
   + 在**账户 ID** 中，输入要与其共享数据来源的账户 ID（在本例中为账户 B）。

1. 选择**共享**。您指定的共享数据连接器在账户 B 中创建。账户 A 中连接器的配置更改将应用于账户 B 中的连接器。

## 将共享数据来源从账户 A 添加到账户 B
<a name="xacct-fed-query-enable-add-a-shared-lambda-function-arn-to-your-account"></a>

作为数据分析人员，您可能会从数据管理员那里获得连接器的 ARN 以添加到您的账户中。您可以使用 Athena 控制台的**数据来源和目录**页面，将管理员提供的 Lambda ARN 添加到您的账户中。

**将共享数据连接器的 Lambda ARN 添加到您的账户**

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

1. 如果导航窗格不可见，请选择左侧的扩展菜单。

1. 选择**数据来源和目录**。

1. 在**数据来源和目录**页面上，选择**创建数据来源**。

1. 在**选择数据来源**页面上，选择**自定义或共享连接器**。

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

1. 在**输入数据来源详细信息**页面上的**连接详细信息**部分中，对于**选择或输入 Lambda 函数**，输入账户 A 的 Lambda ARN。

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

1. 在**审核和创建**页面上，选择**创建数据来源**。

## 问题排查
<a name="xacct-fed-query-enable-troubleshooting"></a>

如果您收到一条错误消息，指出账户 A 没有在账户 B 中担任角色的权限，请确保正确拼写在账户 B 中创建的角色名称，并且附加了适当的策略。