

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 允許 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 的完整存取權。
+ 允許 Lambda 函數寫入 S3 並允許 Athena 從 S3 讀取的 Amazon 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 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 建立 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 存取目錄註冊和中繼資料操作，您可以使用 [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 中繼存放區資料。

**注意**  
目錄應該在您 AWS 區域 用來執行 Athena 查詢的相同 中註冊。

## 跨帳戶呼叫 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>

在執行 Athena 查詢之前，您必須授予對 Amazon S3 中資料的跨帳戶存取。您可採用下列其中一種方式來這麼做：
+ 使用[正式使用者 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` 可以在自己的 `ehms` 中使用目錄 `account` 來查詢帳戶 `111122223333` 中定義的資料表。

在下列範例中，SQL Workbench 設定檔 `perf-test-1` 適用於帳戶 `444455556666`。查詢使用目錄 `ehms` 來存取 Hive 中繼存放區和帳戶 `111122223333` 中的 Amazon S3 資料。

![\[在 SQL Workbench 中跨帳戶存取 Hive 中繼存放區和 Amazon S3 資料。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)
