

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# 純量 Lambda UDF
<a name="udf-creating-a-lambda-sql-udf"></a>

Amazon Redshift 可以使用 中定義的自訂函數 AWS Lambda 作為 SQL 查詢的一部分。您可以使用 Lambda 支援的任何程式設計語言來撰寫純量 Lambda UDF，例如 Java、Go、PowerShell、Node.js、C\$1、Python 和 Ruby。或者，您也可以使用自訂執行期。

[CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md) 命令會建立下列參數：
+ (選用) 具有資料類型的引數清單。
+ 一個傳回資料類型。
+ 由 Amazon Redshift 呼叫之外部函數的一個函數名稱。
+ Amazon Redshift 叢集有權擔任和呼叫 Lambda 的一個 IAM 角色。
+ Lambda UDF 調用的一個 Lambda 函數名稱。

如需 CREATE EXTERNAL FUNCTION 的相關資訊，請參閱 [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)。

Lambda UDF 的輸入和傳回資料類型可以是下列任一類型：
+  SMALLINT 
+  INTEGER 
+  BIGINT 
+  DECIMAL 
+  REAL 
+  DOUBLE PRECISION 
+  CHAR 
+  VARCHAR 
+  BOOLEAN 
+  DATE 
+  TIMESTAMP 

這些類型的別名也有效。如需資料類型及其別名的完整清單，請參閱 [資料類型](c_Supported_data_types.md)。

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

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

在支援純量函數的 SQL 陳述式的任何子句中使用 Lambda UDF。您也可以在任何 SQL 陳述式 (例如 SELECT、UPDATE、INSERT 或 DELETE) 中使用 Lambda UDF。

**注意**  
使用 Lambda UDF 可能會產生來自 Lambda 服務的額外費用。是否如此取決於 Lambda 請求 (UDF 調用) 的數量和 Lambda 程式執行的總持續時間等因素。但是，在 Amazon Redshift 中使用 Lambda UDF 無需額外收費。如需 AWS Lambda 定價的資訊，請參閱 [AWS Lambda 定價](https://aws.amazon.com/lambda/pricing)。  
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 函數一次。

## UDF 安全與許可
<a name="udf-lambda-security"></a>

若要建立 Lambda UDF，請確定您擁有使用 LANGUAGE EXFUNC 的許可。您必須對特定使用者、群組或公眾明確授予 USAGE ON LANGUAGE EXFUNC 或撤銷 USAGE ON LANGUAGE EXFUNC 的使用。

下列範例將 EXFUNC 的使用權授予 PUBLIC。

```
grant usage on language exfunc to PUBLIC; 
```

下列範例會從 PUBLIC 撤銷 exfunc 的使用權，然後將使用權授予使用者群組 lambda\$1udf\$1devs。

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

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

下列範例撤銷從 PUBLIC 執行函數 exfunc\$1sum。然後，它會將使用權授予使用者群組 lambda\$1udf\$1devs。

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

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

如需授予和撤銷權限的相關資訊，請參閱 [GRANT](r_GRANT.md) 和 [REVOKE](r_REVOKE.md)。

## 設定 Lambda UDF 的授權參數
<a name="udf-lambda-authorization"></a>

CREATE EXTERNAL FUNCTION 命令需要授權才能在 AWS Lambda中調用 Lambda 函數。若要啟動授權，請在執行 CREATE EXTERNAL FUNCTION 命令時指定 AWS Identity and Access Management (IAM) 角色。如需 IAM 角色的相關資訊，請參閱《IAM 使用者指南》**中的 [IAM 角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles.html)。

如果現有 IAM 角色有權調用連接到叢集的 Lambda 函數，則您可以將命令的 IAM\$1ROLE 參數中的角色 Amazon Resource Name (ARN) 替換為您的角色。以下各節說明在 CREATE EXTERNAL FUNCTION 命令中使用 IAM 角色的步驟。

### 建立適用於 Lambda 的 IAM 角色
<a name="udf-lambda-create-iam"></a>

IAM 角色需要許可才能調用 Lambda 函數。建立 IAM 角色時，請使用下列其中一種方式提供許可：
+ 建立 IAM 角色時，請在**連接許可政策**頁面上連接 `AWSLambdaRole` 政策。`AWSLambdaRole` 政策授予調用 Lambda 函數的許可，這是最低要求。如需詳細資訊和其他政策，請參閱《AWS Lambda 開發人員指南》**中的 [AWS Lambda的身分型 IAM 政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)。
+ 建立您自己的自訂政策，並使用具有該函數 ARN 之所有資源或特定 Lambda 函數的 `lambda:InvokeFunction` 許可，連接到您的 IAM 角色。如需如何建立政策的相關資訊，請參閱《IAM 使用者指南》**中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

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

------
#### [ JSON ]

****  

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

------

  如需 Lambda 函數資源的相關資訊，請參閱《IAM API 參考》**中的 [Lambda 動作的資源和條件](https://docs.aws.amazon.com/lambda/latest/dg/lambda-api-permissions-ref.html)。

  使用所需許可建立自訂政策後，您可以在建立 IAM 角色時，在**連接許可政策**頁面上將政策連接到 IAM 角色。

如需建立 IAM 角色的步驟，請參閱《[Amazon Redshift 管理指南》中的授權 Amazon Redshift 代表您存取其他 AWS 服務](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)。 **

如果您不要建立新的 IAM 角色，可以將先前提到的許可新增至現有的 IAM 角色。

### 將 IAM 角色與叢集建立關聯
<a name="udf-lambda-associate-iam"></a>

將 IAM 角色連接至您的叢集。您可以使用 Amazon Redshift 管理主控台、CLI 或 API 將角色新增至叢集，或檢視與叢集相關聯的角色。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[將 IAM 角色與叢集建立關聯](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)。

### 在命令中包含 IAM 角色
<a name="udf-lambda-include-iam"></a>

在 CREATE EXTERNAL FUNCTION 命令中包含 IAM 角色 ARN。建立 IAM 角色時，IAM 會傳回角色的 Amazon Resource Name (ARN)。若要指定 IAM 角色，請使用 `IAM_ROLE` 參數來提供角色 ARN。以下顯示 `IAM_ROLE` 參數的語法。

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

若要調用位於相同區域內其他帳戶的 Lambda 函數，請參閱[在 Amazon Redshift 中鏈結 IAM 角色](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles.html)。

## 在 Amazon Redshift 和 之間使用 JSON 界面 AWS Lambda
<a name="udf-lambda-json"></a>

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/udf-creating-a-lambda-sql-udf.html)

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 函數的傳回輸出包含下列欄位。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/udf-creating-a-lambda-sql-udf.html)

以下是 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 安全與許可](udf-security-and-privileges.md)。
+ Amazon Redshift 只會向指定的 Lambda 函數提交最小資料集。
+ Amazon Redshift 只會使用指定的 IAM 角色呼叫指定的 Lambda 函數。