允許 Lambda 函數存取外部 Hive 中繼存放區 - Amazon Athena

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

允許 Lambda 函數存取外部 Hive 中繼存放區

若要在帳戶中呼叫 Lambda 函數,您必須建立具有下列許可的角色:

  • AWSLambdaVPCAccessExecutionRole— 一個 AWS Lambda 執行角色權限,用於管理將您的函數連接到VPC. 請確定您有足夠數量的網路界面和 IP 地址可用。

  • AmazonAthenaFullAccessAmazonAthenaFullAccess受管政策授予對 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 支援跨帳戶存取,以啟用 Hive 中繼存放區的跨帳戶存取。

注意

請注意,Athena 的跨帳戶存取通常意味著可跨帳戶存取 Amazon S3 中的中繼資料和資料。

想像下列案例:

  • 帳戶在 Athena 的 us-east-1 external-hms-service-new111122223333設定 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 資料。

在SQL工作台中跨帳戶存取 Hive 中繼存放區和 Amazon S3 資料。