

# 允许 Lambda 函数访问外部 Hive 元存储
<a name="hive-metastore-iam-access-lambda"></a>

要在账户中调用 Lambda 函数，您必须创建具有以下权限的角色：
+ `AWSLambdaVPCAccessExecutionRole` – [AWS Lambda 执行角色](https://docs.aws.amazon.com/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.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

## 创建 Lambda 函数
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

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

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

## 配置目录注册和元数据 API 操作的权限
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

要访问目录注册 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 函数
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

预设情况下，Athena 调用在同一区域中定义的 Lambda 函数。要在运行 Athena 查询的区域以外的 AWS 区域 中调用 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 查询的相同 AWS 区域 中注册目录。

## 跨账户调用 Lambda 函数
<a name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

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

Athena 使用 [AWS Lambda 对跨账户访问的支持](https://aws.amazon.com/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` 使用以下 AWS 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)。

### 授予对数据的跨账户访问
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

您必须先授予对 Amazon S3 中数据的跨账户访问权限，然后才能运行 Athena 查询。您可以通过下列方式之一来执行该操作：
+ 使用[规范用户 ID](https://docs.aws.amazon.com/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.aws.amazon.com/zh_cn/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)
