

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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，请确保您对每个调用的函数都拥有权限。预设情况下，向 PUBLIC 授予运行新 Lambda UDF 的权限。要限制使用，请从 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` 策略附加到 **Attach permissions policy**（附加权限策略）页面上。`AWSLambdaRole` 策略授予调用 Lambda 函数的权限，这是最低要求。有关更多信息和其他策略，请参阅 *AWS Lambda 开发人员指南*中的[AWS Lambda 的基于身份的 IAM 策略](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)。
+ 创建您自己的自定义策略以附加到您的 IAM 角色，该角色具有对所有资源或具有该函数 ARN 的特定 Lambda 函数的 `lambda:InvokeFunction` 权限。有关如何创建策略的更多信息，请参阅 *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 角色的同时在 **Attach permissions policy**（附加权限策略）页面上将策略附加到该 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 和 AWS Lambda 之间使用 JSON 界面
<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_cn/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_cn/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 函数。