创建标量 Lambda UDF - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建标量 Lambda UDF

Amazon Redshift 可以使用 AWS Lambda 中定义的自定义函数作为 SQL 查询的一部分。您可以使用 Lambda 支持的任何编程语言编写标量 UDFs Lambda,例如 Java、Go、PowerShell、Node.js、C#、Python 和 Ruby。或者,您可以使用自定义运行时。

Lambda UDFs 在 Lambda 中定义和管理,您可以控制在 UDFs 中调用这些 Amazon Redshift 的访问权限。您可以在同一个查询中调用多个 Lambda 函数,也可以多次调用同一个函数。

在支持标量函数的 SQL 语句的任何子句中使用 Lambda UDFs。您还可以在任何 SQL 语句(如 SELECT、UPDATE、INSERT 或 DELETE)中使用 Lambda UDFs。

注意

使用 Lambda UDFs 可能会从 Lambda 服务产生额外费用。是否这样做取决于 Lambda 请求(UDF 调用)的数量和 Lambda 程序执行的总持续时间等因素。但是,在 Lambda 中使用 UDFs Amazon Redshift 不会产生额外费用。有关 AWS Lambda 定价的信息,请参阅 AWS Lambda 定价

请求数因使用 Lambda UDF 的特定 SQL 语句子句而异。Lambda例如,假设函数在 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 角色。

  • UDF 调用的一个 Lambda 函数名称。Lambda

有关 CREATE EXTERNAL FUNCTION 的信息,请参阅创建外部函数

此函数的输入和返回数据类型可以是任何标准 Amazon Redshift 数据类型。

Amazon Redshift 确保外部函数可以发送和接收批处理参数和结果。

管理 Lambda UDF 安全性和权限

要创建 Lambda UDF,请确保您具有对 LANUGAGE EXFUNC 的使用权限。您必须明确授予 USAGE ON LANGUAGE EXFUNC 权限或撤销 USAGE ON LANGUAGE 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,请确保您具有每个调用函数的权限。默认情况下,向 PUBLIC 授予运行新 Lambda UDFs 的权限。要限制使用,请从 PUBLIC 撤销该函数的此权限。然后,向特定用户或组授予权限。

以下示例从 PUBLIC 撤销对函数 exfunc_sum 的执行权限。然后,它会向用户组 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 的授权参数

CREATE EXTERNAL FUNCTION 命令需要授权才能调用 Lambda 中的 AWS Lambda 函数。要启动授权,请在运行 CREATE EXTERNAL FUNCTION 命令时指定 AWS Identity and Access Management (IAM) 角色。有关 IAM 角色的更多信息,请参阅 中的 IAM 角色。IAM 用户指南

如果存在有权调用附加到集群的 Lambda 函数的现有 IAM 角色,则您可以在命令的 IAM_ROLE 参数中替换您的角色 Amazon 资源名称 (ARN)。以下部分介绍在 CREATE EXTERNAL FUNCTION 命令中使用 IAM 角色的步骤。

为 Lambda 创建 IAM 角色

角色需要调用 IAM 函数的权限。Lambda在创建 IAM 角色时,使用以下方法之一提供权限:

  • 创建 AWSLambdaRole 角色时,在 Attach permissions policy (附加权限策略) 页面上附加 IAM 策略。策略授予调用 AWSLambdaRole 函数的权限,这是最低要求。Lambda有关更多信息和其他策略,请参阅 https://docs.amazonaws.cn/lambda/latest/dg/access-control-identity-based.html 中的 AWS Lambda 的基于身份的 IAM 策略AWS Lambda Developer Guide。

  • 创建您自己的自定义策略,以使用所有资源的 IAM 权限附加到您的 lambda:InvokeFunction 角色,或使用具有该函数的 ARN 的特定 Lambda 函数。有关如何创建策略的更多信息,请参阅 中的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 函数资源的更多信息,请参阅 中的 Lambda 操作的资源和条件IAM API 参考

    使用所需权限创建自定义策略后,您可以在创建 角色时将策略附加到 Attach permissions policy (附加权限策略)IAM 页面上的 IAM 角色。

有关创建 IAM 角色的步骤,请参阅 中的Amazon Redshift授权 AWS 代表您访问其他 服务。Amazon Redshift Cluster Management Guide

如果您不想创建新的 IAM 角色,则可将之前提到的权限添加到现有 IAM 角色。

将 IAM 角色与集群关联

将 IAM 角色附加到您的集群。您可以使用 Amazon Redshift 管理控制台、CLI 或 API 将角色添加到集群,或者查看与集群关联的角色。有关更多信息,请参阅 中的IAM将 角色与集群关联。Amazon Redshift Cluster Management Guide

在命令中包含 IAM 角色

在 CREATE EXTERNAL FUNCTION 命令中包含 IAM 角色 ARN。在创建 IAM 角色时,IAM 返回该角色的 Amazon 资源名称 (ARN)。要指定 IAM 角色,请为角色 ARN 提供 IAM_ROLE 参数。下面显示了 IAM_ROLE 参数的语法。

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

要调用驻留在同一区域的其他账户中的 Lambda 函数,请参阅在 IAM 中串联 Amazon Redshift 角色

使用 Amazon Redshift 和 AWS Lambda 之间的 JSON 接口

Amazon Redshift 对 Lambda 与之通信的所有 Amazon Redshift 函数使用通用接口。

下表显示了您预期为 JSON 负载使用的指定 Lambda 函数的输入字段列表。

字段名称

描述

值范围
request_id 唯一标识每个调用请求的通用唯一标识符 (UUID)。

有效的 UUID。

集群

集群的完整 Amazon 资源名称 (ARN)。

有效的集群 ARN。

user

进行调用的用户的名称。 有效的用户名。

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" : "master", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }

函数的返回输出包含以下字段。Lambda

字段名称

描述

值范围
success 函数成功或失败的指示。

值为 "true""false"

错误 - msg

如果成功值为 "false"(如果函数失败),则为错误消息;否则,将忽略此字段。

一条有效消息。

num_records

负载中的记录数。 值为 1 – 2^64。

结果

指定格式的调用结果。 不适用

以下是 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 函数。