本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
允許 Lambda 函數存取外部 Hive 中繼存放區
若要在帳戶中呼叫 Lambda 函數,您必須建立具有下列許可的角色:
-
AWSLambdaVPCAccessExecutionRole
- AWS Lambda 執行角色許可,用於管理將您的函數連接到 VPC 的彈性網路介面。請確定您有足夠數量的網路界面和 IP 地址可用。 -
AmazonAthenaFullAccess
- AmazonAthenaFullAccess 受管政策會授予 Athena 的完整存取權。 -
允許 Lambda 函數寫入 S3 並允許 Athena 從 S3 讀取的 Amazon S3 政策。
例如,下列政策定義溢出位置 s3:\\mybucket\spill
的許可。
{ "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 中的安全性最佳實務。
建立 Lambda 函數
若要在您的帳戶中建立 Lambda 函數,需具備函數開發許可或 AWSLambdaFullAccess
角色。如需詳細資訊,請參閱 AWS Lambda身分型 IAM 政策。
由於 Athena 使用 AWS Serverless Application Repository 來建立 Lambda 函數,因此建立 Lambda 函數的超級使用者或管理員也應該有 IAM 政策,以允許 Athena 聯合查詢。
設定目錄註冊和中繼資料 API 操作的許可
對於目錄註冊和中繼資料操作的 API 存取,您可以使用 AmazonAthenaFullAccess 受管政策。如果您不使用 AmazonAthenaFullAccess
政策,請將下列 API 操作新增至您的 Athena 政策:
{ "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 查詢的區域 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 函數
有時您可能需要從不同的帳戶存取 Hive 中繼存放區。例如,若要執行 Hive 中繼存放區,您可以使用不同於您用於 Athena 查詢的帳戶。不同的群組或團隊可能會在其 VPC 內使用不同的帳戶來執行 Hive 中繼存放區。或者,您可能想要存取來自不同群組或團隊的不同 Hive 中繼存放區的中繼資料。
Athena 會使用 AWS Lambda 支援進行跨帳戶存取
注意
請注意,Athena 的跨帳戶存取通常意味著可跨帳戶存取 Amazon S3 中的中繼資料和資料。
想像下列案例:
-
帳戶
111122223333
在 Athena 中的 us-east-1 上設定 Lambda 函數external-hms-service-new
,以存取 EMR 叢集上執行的 Hive 中繼存放區。 -
帳戶
111122223333
想要允許帳戶 444455556666 存取 Hive 中繼存放區資料。
若要授予帳戶對 Lambda 函數 的444455556666
存取權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 函數。
授予跨帳戶的資料存取權
在執行 Athena 查詢之前,您必須授予對 Amazon S3 中資料的跨帳戶存取。您可採用下列其中一種方式來這麼做:
-
使用正式使用者 ID 來更新 Amazon S3 儲存貯體的存取控制清單政策。
-
將跨帳戶存取新增至 Amazon S3 儲存貯體政策。
例如,將下列政策新增至帳戶 111122223333
中的 Amazon S3 儲存貯體政策,以允許帳戶 444455556666
從指定的 Amazon S3 位置讀取資料。
{ "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 資料。
