本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
允許 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
角色。如需詳細資訊,請參閱以身分識別為基礎IAM的原則 AWS Lambda.
因為 Athena 使用 AWS Serverless Application Repository 若要建立 Lambda 函數,建立 Lambda 函數的超級使用者或管理員也應具有允許 Athena 聯合查詢的IAM政策。
設定目錄註冊和中繼資料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 函數。若要呼叫 Lambda 函數 AWS 區域 除了執行 Athena 查詢的區域以外,請使用完整ARN的 Lambda 函數。
下列範例顯示歐洲 (法蘭克福) 區域的目錄如何在美國東部 (維吉尼亞北部) 區域指定 Lambda 函數,以便從歐洲 (法蘭克福) 區域的 Hive 中繼存放區擷取資料。
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new
當您以這種方式指定完整資料時,Athena 可以呼叫 external-hms-service-new
Lambda 函數,從ARNeu-central-1
中擷取 Hive 中繼存放區資料。us-east-1
注意
目錄應該在同一個註冊 AWS 區域 您用來執行 Athena 查詢。
跨帳戶呼叫 Lambda 函數
有時您可能需要從不同的帳戶存取 Hive 中繼存放區。例如,若要執行 Hive 中繼存放區,您可以使用與用於 Athena 查詢的帳戶不同的帳戶。不同的組或團隊可能會在其VPC中使用不同的帳戶運行 Hive 元存儲。或者,您可能想要存取來自不同群組或團隊的不同 Hive 中繼存放區的中繼資料。
Athena 使用 AWS Lambda 支援跨帳戶存取,
注意
請注意,Athena 的跨帳戶存取通常意味著可跨帳戶存取 Amazon S3 中的中繼資料和資料。
想像下列案例:
-
帳戶在 Athena 的 us-east-1
external-hms-service-new
上111122223333
設定 Lambda 函數,以存取在叢集上執行的 Hive 中繼存放區。EMR -
帳戶
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\"}]}" }
新增權限之後,您可以在定義目錄時,us-east-1
如下所示使用完整ARN的 Lambda 函數ehms
:
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「維護作業」設定檔perf-test-1
適用於帳戶444455556666
。查詢使用目錄 ehms
來存取 Hive 中繼存放區和帳戶 111122223333
中的 Amazon S3 資料。