建立純量 Lambda UDF - Amazon Redshift

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

建立純量 Lambda UDF

Amazon Redshift 可以使用AWS Lambda作為 SQL 查詢的一部分。您可以用 Lambda 支持的任何編程語言編寫標量 Lambda UDF,例如 Java,Go,PowerShell、Node.js、C#、Python 和 Ruby。或者您可以使用自訂執行時間。

Lambda UDF 是在 Lambda 中定義和管理的,您可以控制在 Amazon Redshift 中調用這些 UDF 的訪問權限。您可以在同一查詢中調用多個 Lambda 函數,也可以多次調用同一個函數。

在支持標量函數的 SQL 語句的任何子句中使用 Lambda UDF。您還可以在任何 SQL 語句中使用 Lambda UDF,如選擇、更新、插入或刪除。

注意

使用 Lambda UDF 可能會從 Lambda 服務中產生額外費用。是否這樣做取決於諸如 Lambda 請求的數量(UDF 調用)和 Lambda 程序執行的總持續時間等因素。但是,在 Amazon Redshift 中使用 Lambda UDF 無須另外付費。如需AWSLambda 定價,請參AWS Lambda定價

Lambda 請求的數量因使用 Lambda UDF 的特定 SQL 語句子句而異。例如,假設該函數在 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 可能只對結果集中的每個限定行或聚合行調用 Lambda 函數一次。您可以配置對 Lambda 函數的多次調用進行批處理,以提高性能並降低成本。

註冊 Lambda UDF

所以此建立外部函數命令會建立下列參數:

  • (可選)具有數據類型的參數列表。

  • 一個傳回資料類型。

  • 由 Amazon Redshift 調用的外部函數的一個函數名稱。

  • Amazon Redshift 集羣有權代入並調用 Lambda 的一個 IAM 角色。

  • Lambda UDF 調用的一個 Lambda 函數名稱。

如需建立外部函數的詳細資訊,請參建立外部函數

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

Amazon Redshift 確保外部函數可以發送和接收批量參數和結果。

管理 Lambda UDF 安全與權限

要創建 Lambda UDF,請確保您擁有在 LANUGAGE EXFUNC 上的使用權限。您必須明確授予語言 EXFUNC 使用情況或撤銷語言 EXFUNC 上的使用情況給特定用户、組或公眾。

以下示例將 EXFUNC 上的使用權授予 PUBLIC。

grant usage on language exfunc to PUBLIC;

下列範例會撤銷 PUBLIC 的 exfunc 使用權,然後將使用權授予使用者組 lambda_udf_devs。

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

若要執行 Lambda UDF,請確認您具有每個叫用的函數的許可。根據預設,您可以執行新 Lambda UDF 的許可會授予 PUBLIC。若要限制使用權,請從 PUBLIC 撤銷函數的此許可。然後,將權限授予特定使用者或組。

下列範例撤銷從 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 UDF 的授權參數

創建外部函數命令需要授權才能在AWS Lambda。要啟動授權,請指定AWS Identity and Access Management(IAM) 角色,當您運行「創建外部函數」命令時。如需 IAM 角色的詳細資訊,請參閱 IAM 使用者指南中的 IAM 角色

如果現有的 IAM 角色具有叫用附加至您的叢集的 Lambda 函數的許可,您可以在 IAM_ROLE 參數中替換您的角色 Amazon Resource Name (ARN),做為命令。以下部分介紹了在「創建外部函數」命令中使用 IAM 角色的步驟。

為 Lambda 建立 IAM 角色

IAM 角色需要許可才能叫用 Lambda 函數。創建 IAM 角色時,請通過以下方式之一提供權限:

  • 連接AWSLambdaRole策略連接許可政策頁面,同時建立 IAM 角色。所以此AWSLambdaRole政策會授予叫用 Lambda 函數的許可,而這是最低需求。如需詳細資訊和其他政策,請參適用於的身分型 IAM 政策AWS Lambda中的AWS Lambda開發人員指南

  • 創建您自己的自定義策略以附加到您的 IAM 角色,並使用lambda:InvokeFunction所有資源的權限或特定的 Lambda 函數與該函數的 ARN。如需如何建立政策的詳細資訊,請參建立 IAM 政策中的IAM User Guide

    以下示例策略允許在特定的 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 函數資源的詳細資訊,請參Lambda 動作的資源和條件中的IAM API 參考

    創建具有所需權限的自定義策略後,您可以將策略附加到連接許可政策頁面,同時建立 IAM 角色。

如需 IAM 角色的建立步驟,請參授權 Amazon Redshift 訪問其他AWS代表您提供的服務中的Amazon Redshift 叢集管理指南

如果您不想建立新的 IAM 角色,您可以將之前提到的許可添加至現有的 IAM 角色。

將 IAM 角色與叢集建立關聯

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

在命令中包含 IAM 角色

在「創建外部函數」命令中包含 IAM 角色 ARN。建立 IAM 角色時,IAM 會傳回角色的 Amazon Resource Name (ARN)。若要指定 IAM 角 ARN,請使用IAM_ROLE參數。以下範例顯示了IAM_ROLE參數。

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

要調用駐留在同一區域內其他帳户中的 Lambda 函數,請參閲鏈結 Amazon Redshift 中的 IAM 角色

使用 Amazon Redshift 和AWS Lambda

Amazon Redshift 對亞馬 Amazon Redshift 與之通信的所有 Lambda 函數使用通用界面。

下表顯示了指定的 Lambda 函數的輸入字段列表,您可以期望用於 JSON 有效負載。

欄位名稱

Description (描述)

值範圍
request_id 唯一識別每個呼叫請求的全域唯一識別符 (UUUID)。

有效的 UUID。

叢集

叢集的完整 Amazon Resource Name (ARN)。

有效的叢集 ARN。

使用者

發出呼叫的用户的名稱。 有效的使用者名稱。

database

查詢正在運行的資料庫的名稱。 有效的資料庫名稱。

外部函數

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

query_id

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

數字記錄

有效載荷中的參數數量。 值為 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 函數的傳回輸出包含下列字段。

欄位名稱

Description (描述)

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

值為"true"或者"false"

錯誤消息

如果成功值為"false"(如果函數失敗);否則,將忽略此字段。

有效的消息。

數字記錄

負載中的記錄數量。 值為 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 會確保連接的安全性,具有以下注意事項:

  • 授予和撤消權限。如需 UDF 安全和權限的詳細資訊,請參UDF 安全與權限

  • Amazon Redshift 僅將最小數據集提交給指定的 Lambda 函數。

  • Amazon Redshift 僅調用具有指定 IAM 角色的指定 Lambda 函數。