創建一個標量 Lambda UDF - Amazon Redshift

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

創建一個標量 Lambda UDF

Amazon Redshift 可以使用中定義的自訂函數 AWS Lambda 做為SQL查詢的一部分。您可以使用 Lambda 支援UDFs的任何程式設計語言撰寫純量 Lambda,例如 Java PowerShell、圍棋、Node.js、C#、Python 和紅寶石。或者,您也可以使用自訂執行期。

Lambda UDFs 是在 Lambda 中定義和管理的,您可以控制存取權限,以便UDFs在 Amazon Redshift 中叫用這些權限。您可以在同一個查詢中調用多個 Lambda 函數,或多次調用相同的函數。

UDFs在支援純量函數的陳述式的任何子SQL句中使用 Lambda。您也可以UDFs在任何SQL陳述式中使用 LambdaSELECT,例如UPDATEINSERT、、或DELETE。

注意

使用 Lambda UDFs 可能會產生 Lambda 服務的額外費用。是否如此取決於 Lambda 請求 (UDF叫用) 的數量和 Lambda 程式執行的總持續時間等因素。但是,UDFs在 Amazon Redshift 中使用 Lambda 不會收取額外費用。如需 AWS Lambda 定價的相關資訊,請參閱AWS Lambda 定價

Lambda 要求的數目會根據使用 Lambda 的特定SQL陳述式子句而UDF有所不同。例如,假設函數用於如下所示的WHERE子句中。

SELECT a, b FROM t1 WHERE lambda_multiply(a, b) = 64; SELECT a, b FROM t1 WHERE a*b = lambda_multiply(2, 32)

在這種情況下,Amazon Redshift 會針對每個陳述式呼叫第一個SELECT陳述式,並只呼叫第二個SELECT陳述式一次。

不過,UDF在查詢的投影部分中使用 a 可能只會針對結果集中的每個限定或彙總資料列叫用 Lambda 函數一次。

註冊一個 Lambda UDF

CREATE EXTERNAL FUNCTION 命令會建立下列參數:

  • (選用) 具有資料類型的引數清單。

  • 一個傳回資料類型。

  • 由 Amazon Redshift 呼叫之外部函數的一個函數名稱。

  • 授權 Amazon Redshift 叢集承擔和呼叫 Lambda 的一個IAM角色。

  • Lambda 叫用的一個 L UDF ambda 函數名稱。

如需有關的資訊 CREATE EXTERNALFUNCTION,請參閱CREATE EXTERNAL FUNCTION

此函數的輸入和傳回資料類型可以是任何標準 Amazon Redshift 資料類型。

Amazon Redshift 可確保外部函數可以傳送和接收批次引數和結果。

管理 Lambda UDF 全性和權限

若要建立 LambdaUDF,請確定您對 LANGUAGEEXFUNC. 您必須LANGUAGEEXFUNC向特定使用者、群組LANGUAGEEXFUNC或公開明確授USAGE與 ON 或撤銷 USAGE ON。

下列範例會授與對的EXFUNC使用PUBLIC。

grant usage on language exfunc to PUBLIC;

下列範例會從中撤銷 exfunc 上的使用量,然後將使用量授PUBLIC與使用者群組 lambda_udf_devs。

revoke usage on language exfunc from PUBLIC; grant usage on language exfunc to group lambda_udf_devs;

若要執行 LambdaUDF,請確定您對每個呼叫的函數都有權限。依預設,會授與執行新 Lambda UDFs 的權限PUBLIC。若要限制使用,請撤銷函數PUBLIC的此權限。然後將權限授予特定使用者或群組。

下列範例會從中撤銷函數 exfunc_sum 上的執行。PUBLIC然後,它會將使用權授予使用者群組 lambda_udf_devs。

revoke execute on function exfunc_sum(int, int) from PUBLIC; grant execute on function exfunc_sum(int, int) to group lambda_udf_devs;

根據預設,超級使用者具備所有權限。

如需授予和撤銷權限的相關資訊,請參閱 GRANTREVOKE

設定 Lambda 的授權參數 UDFs

此命CREATEEXTERNALFUNCTION令需要授權才能在中叫用 Lambda 函數 AWS Lambda。若要啟動授權,請在執行CREATEEXTERNALFUNCTION命令時指定 AWS Identity and Access Management (IAM) 角色。有關IAM角色的詳細資訊,請參閱《使用指南》中的IAM〈IAM角色

如果現有IAM角色具有叫用連接至叢集的 Lambda 函數的權限,則可以將您的角色 Amazon 資源名稱 (ARN) 替換為命令 IAM _ ROLE 參數。以下各節說明在CREATEEXTERNALFUNCTION指令中使用IAM角色的步驟。

為 Lambda 建立IAM角色

此IAM角色需要呼叫 Lambda 函數的權限。建立IAM角色時,請以下列其中一種方式提供權限:

  • 建立IAM角色時,在 [附加權限原則] 頁面上附加原則。AWSLambdaRoleAWSLambdaRole 政策授予調用 Lambda 函數的許可,這是最低要求。如需詳細資訊和其他原則,請參閱AWS Lambda 開發人員指南 AWS Lambda中的以身分識別為基礎的IAM原則

  • 建立您自己的自訂政策,並在具有該函數的所有資源或特定 Lambda 函數的lambda:InvokeFunction權限下附加至您ARN的IAM角色。如需有關如何建立策略的詳細資訊,請參閱《IAM使用指南》中的〈建立IAM策略〉

    下列範例政策可讓您在特定 Lambda 函數上調用 Lambda。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function" } ] }

    如需 Lambda 函數資源的詳細資訊,請參閱IAMAPI參考資料中的 Lambda 動作的資源和條件

    建立具有所需權限的自訂原則之後,您可以在建立IAM角色時,將原則附加至 [連接權限原則] 頁面上的IAM角色。

如需建立IAM角色的步驟,請參閱 Amazon Redshift 管理指南中的授權 Amazon Redshift 代表您存取其他 AWS 服務

如果您不想建立新IAM角色,可以將先前提及的權限新增至您現有的IAM角色。

建立IAM角色與叢集的關聯

將IAM角色附加到叢集。您可以使用 Amazon Redshift 管理主控台,將角色新增至叢集,或檢視與叢集相關聯的角CLI色。API如需詳細資訊,請參閱 Amazon Redshift 管理南中的將IAM角色與叢集關聯。

在指令中包含IAM角色

在CREATEEXTERNALFUNCTION指令ARN中包括IAM角色。建立IAM角色時,會IAM傳回該角色的 Amazon 資源名稱 (ARN)。若要指定IAM角色,請為該角色ARN提供IAM_ROLE參數。以下顯示 IAM_ROLE 參數的語法。

IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'

若要叫用位於相同區域內其他帳戶的 Lambda 函數,請參閱 Amazon Redshift 中的鏈結IAM角色

使用 Amazon Redshift 和之間的JSON界面 AWS Lambda

Amazon Redshift 對 Amazon Redshift 進行通訊的所有 Lambda 函數使用通用介面。

下表顯示您可預期JSON承載的指定 Lambda 函數的輸入欄位清單。

欄位名稱

描述

值範圍
request_id 一個通用唯一的標識符(UUID),唯一標識每個調用請求。

一個有效的UUID。

叢集

叢集的完整 Amazon 資源名稱 (ARN)。

有效的叢集ARN。

使用者

進行呼叫的使用者名稱。 有效的使用者名稱。

database

執行查詢之資料庫的名稱。 有效的資料庫名稱。

external_function

進行呼叫之外部函數的完整名稱。 有效的完整函數名稱。

query_id

進行呼叫之查詢的查詢 ID。 有效的查詢 ID。

num_records

承載中的引數數目。 值為 1 - 2^64。

引數

指定格式的資料承載。 數組格式的數據必須是一個JSON數組。如果引數數目大於 1,則每個元素都是一個記錄,該記錄是一個陣列。透過使用陣列,Amazon Redshift 會保留承載中記錄的順序。

JSON陣列的順序決定批次處理的順序。Lambda 函數必須反覆處理引數,並產生確切的記錄數。以下是承載的範例。

{ "request_id" : "23FF1F97-F28A-44AA-AB67-266ED976BF40", "cluster" : "arn:aws:redshift:xxxx", "user" : "adminuser", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }

Lambda 函數的傳回輸出包含下列欄位。

欄位名稱

描述

值範圍
success 函數成功或失敗的指示。

值為 "true""false"

error_msg

如果成功值為 "false" (如果函數失敗),則會顯示錯誤訊息;否則,會忽略此欄位。

有效的訊息。

num_records

承載中的記錄數。 值為 1 - 2^64。

results

以指定格式呼叫的結果。 N/A

以下是 Lambda 函數輸出的範例。

{ "success": true, // true indicates the call succeeded "error_msg" : "my function isn't working", // shall only exist when success != true "num_records": 4, // number of records in this payload "results" : [ 1, 4, null, 7 ] }

當您從SQL查詢呼叫 Lambda 函數時,Amazon Redshift 可確保連線的安全性,並考量下列事項:

  • GRANT和REVOKE權限。如需有關UDF安全性和權限的詳細資訊,請參閱UDF安全性和權限

  • Amazon Redshift 只會向指定的 Lambda 函數提交最小資料集。

  • Amazon Redshift 只呼叫具有指定IAM角色的指定 Lambda 函數。