直接从 Postgres 调用 Lambda 函数

2021-08-06 09:52:04

您可以从 RDS for PostgreSQL 数据库实例调用 AWS Lambda 函数。为此,请使用 RDS for PostgreSQL 随附的 aws_lambda PostgreSQL 扩展。 AWS Lambda 是一种可用于运行代码的计算服务。例如,您可以使用 Lambda 函数来处理来自数据库实例的事件通知。有关 Lambda 的更多信息,请参阅什么是 AWS Lambda?在 AWS Lambda 开发人员指南中。您可以使用以下过程从 RDS for PostgreSQL 数据库调用 Lambda 函数。安装所需的 PostgreSQL 扩展。其中包括 aws_lambda 和 aws_commons 扩展。为此,请启动 psql 并运行以下命令。 aws_lambda 扩展提供了用于在 Lambda 中调用函数的 aws_lambda.invoke 函数。包含 aws_commons 扩展以提供额外的辅助函数。确定要使用的 Lambda 函数的名称或 Amazon 资源名称 (ARN)。有关此过程的详细信息,请参阅指定要使用的 Lambda 函数。要调用 Lambda 函数,请授予 RDS for PostgreSQL 数据库实例访问 Lambda 调用 API 操作的权限。这样做包括以下步骤:

创建 AWS Identity and Access Management (IAM) 策略,以提供对您要调用的 Lambda 函数的访问权限。使用 aws_lambda.invoke 函数运行 Lambda 函数。有关此过程的详细信息,请参阅调用 Lambda 函数。函数名称 – Lambda 函数的名称、ARN、版本或别名。有关可能格式的列表,请参阅 Lambda 函数名称格式。 AWS 区域 –(可选)Lambda 函数所在的 AWS 区域。如果您未指定 Region 值且未在函数 ARN 中指定,则 RDS 使用与数据库实例相同的 Region。有关 AWS 区域名称和关联值的列表,请参阅区域、可用区和本地区域。要保存 Lambda 函数名称信息,您可以使用 aws_commons.create_lambda_function_arn 函数。该函数创建一个 aws_commons._lambda_function_arn_1 复合结构来存储名称信息,如下所示。 psql=> SELECT aws_commons.create_lambda_function_arn('my-function', 'us-west-2') AS aws_lambda_arn_1 \gsetpsql=> SELECT aws_commons.create_lambda_function_arn('123456789012:function:my-function'- ) AS lambda_partial_arn_1 \gsetpsql=> SELECT aws_commons.create_lambda_function_arn('arn:aws:lambda:us-west-2:123456789012:function:my-function') AS lambda_arn_1 \gset

您可以稍后在调用 aws_lambda.invoke 函数时提供这些值中的任何一个作为参数。有关示例,请参阅调用 Lambda 函数。要使用 Lambda 函数,请授予您的 PostgreSQL 数据库实例访问 Lambda 的权限。为此,请使用以下过程。此策略提供允许您的 PostgreSQL 数据库实例调用 Lambda 函数的权限。在策略中包含所需的操作 lambda:InvokeFunction 以允许从 RDS for PostgreSQL 数据库实例调用 Lambda。包括标识 Lambda 函数的 Amazon 资源名称 (ARN)。访问 Lambda 的 ARN 格式为:arn:aws:lambda::function:example_function/* 有关为 RDS for PostgreSQL 创建 IAM 策略的更多信息,请参阅为 IAM 数据库访问创建和使用 IAM 策略。另请参阅 IAM 用户指南中的 IAM 教程:创建并附加您的第一个客户托管策略。以下 AWS CLI 命令使用这些选项创建名为 rds-lambda-policy 的 IAM 策略。它授予对名为 example_function 的函数的访问权限。

aws iam create-policy --policy-name rds-lambda-policy --policy-document ' { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToExampleFunction", "Effect ": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:<region>:<123456789012>:function:example_function" } ]}' 创建策略后,请注意策略的 ARN。将策略附加到 IAM 角色时,您需要 ARN 用于后续步骤。您这样做是为了让 RDS for PostgreSQL 可以代表您代入此 IAM 角色以访问您的 Lambda 函数。有关更多信息,请参阅 IAM 用户指南中的创建角色以将权限委派给 IAM 用户。以下示例显示使用 AWS CLI 命令创建名为 rds-lambda-role 的角色。 aws iam create-role --role-name rds-lambda-role --assume-role-policy-document ' { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow ", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }' 以下 AWS CLI 命令将之前创建的策略附加到名为 rds-lambda 的角色-角色。将 your-policy-arn 替换为您在前面步骤中记下的策略 ARN。将 IAM 角色添加到数据库实例。您可以使用 AWS CLI 执行此操作,如下所述。

使用以下 CLI 命令将 IAM 角色添加到名为 my-db-instance 的 RDS for PostgreSQL 数据库实例。将 your-role-arn 替换为您在上一步中记下的角色 ARN。使用 Lambda 作为 --feature-name 选项的值,如下所示。下面,您可以找到一些调用 aws_lambda.invoke 函数的示例。在使用 aws_lambda.invoke 函数之前,请确保完成以下先决条件: 如指定要使用的 Lambda 函数中所述确定要调用的 Lambda 函数。确保数据库实例具有对 Lambda 的调用访问权限,如授予 RDS 对 Lambda 的访问权限中所述。您可以同步或异步调用 Lambda 函数。您可以使用 aws_lambda.invoke 函数的 invocation_type 参数的以下值控制此操作: Lambda 函数的 RequestResponse 调用类型是同步的,并在 aws_lambda.invoke 函数的结果中返回响应负载。当您的工作流依赖于立即接收 Lambda 函数结果时,请使用 RequestResponse 调用类型。以下大多数示例使用同步调用。 Lambda 函数的事件调用类型是异步的,并立即返回而不返回负载。当您在工作流程继续之前不需要知道 Lambda 函数的结果时,请使用事件类型的调用。有关异步调用的示例,请参阅 Lambda 函数的异步事件调用。

以下 aws_lambda.invoke 示例使用 aws_lambda_arn_1 结构,其中包含 Lambda 函数的识别信息。要创建结构,请使用 aws_commons.create_lambda_function_arn 函数。有关使用 aws_commons.create_lambda_function_arn 函数的示例,请参阅指定要使用的 Lambda 函数。以下是同步 Lambda 函数调用的示例。下面两个 aws_lambda.invoke 函数调用结果是一样的。 psql=> SELECT * FROM aws_lambda.invoke(:'aws_lambda_arn_1', ' {"body": "Hello from Postgres!"}'::json);psql=> SELECT * FROM aws_lambda.invoke(:'aws_lambda_arn_1', ' {"body": "来自 Postgres 的你好!"}'::json, 'RequestResponse'); :'aws_lambda_arn_1' – 此参数是标识要调用的 Lambda 函数的结构。此示例使用一个变量来标识先前创建的结构。您可以改为通过在 aws_lambda.invoke 函数调用中包含 aws_commons.create_lambda_function_arn 函数调用内联来创建结构,如下所示。以下是异步 Lambda 函数调用的示例。事件调用类型使用指定的输入负载安排 Lambda 函数调用并立即返回。在不依赖于 Lambda 函数结果的某些工作流中使用事件调用类型。您可以请求在函数响应中包含执行日志的最后 4 KB,如下所示。 psql=> SELECT *, select convert_from(decode(log_result, 'base64'), 'utf-8') 作为日志 FROM aws_lambda.invoke(:'aws_lambda_arn_1', ' {"body": "Hello from Postgres!"}' ::json, 'RequestResponse', 'Tail');

将 aws_lambda.invoke 函数的 log_type 参数设置为 Tail 以在响应中包含执行日志。 log_type 参数的默认值为 None。返回的 log_result 是一个 base64 编码的字符串。您可以使用 decode 和 convert_from PostgreSQL 函数的组合来解码内容。您可以传入与有效负载分开的客户端上下文信息,如下所示。 psql=> SELECT *, convert_from(decode(log_result, 'base64'), 'utf-8') as log FROM aws_lambda.invoke(:'aws_lambda_arn_1', ' {"body": "Hello from Postgres!"}': :json, 'RequestResponse', 'Tail');有关调用特定版本的 Lambda 函数的示例,请参阅以下内容。要识别 Lambda 函数的版本,请使用 aws_lambda.invoke 函数的限定符参数。在此示例中,“custom_version”是标识要调用的函数版本的别名或版本。您可以改为提供带有函数名称信息的 Lambda 函数限定符,如下所示。

如果 Lambda 函数在请求处理期间抛出异常,则 aws_lambda.invoke 将失败并显示 PostgreSQL 错误,如下所示。 psql=> SELECT * FROM aws_lambda.invoke(:'aws_lambda_arn_1', ' {"body": "Hello from Postgres!"}'::json);ERROR: lambda invocation failedDETAIL: "arn:aws:lambda:us-west -2:123456789012:function:my-function" 返回错误“未处理”,详细信息:“<错误详细信息字符串>”。以下是用于使用 RDS for PostgreSQL 调用 Lambda 函数的函数的参考。有关调用 Lambda 函数的更多详细信息,另请参阅 AWS Lambda 开发人员指南中的调用。 aws_lambda.invoke(IN function_name TEXT,IN payload JSON,IN region TEXT DEFAULT NULL,IN invocation_type TEXT DEFAULT 'RequestResponse',IN log_type TEXT DEFAULT 'None',IN context JSON DEFAULT NULL,IN qualifier VARCHAR(128) DEFAULT NULL,OUT status_code INT,OUT 有效载荷 JSON,OUT 执行的_版本文本,OUT log_result TEXT) aws_lambda.invoke(IN function_name aws_commons._lambda_function_arn_1,IN 有效载荷 JSON,IN invocation_type TEXT DEFAULT 'RequestResponse',IN log_type TEXT DEFAULT NULL 上下文 'None',FAULIN ,IN qualifier VARCHAR(128) DEFAULT NULL,OUT status_code INT,OUT payload JSON,OUT execution_version TEXT,OUT log_result TEXT) aws_lambda.invoke(IN function_name TEXT,IN payload JSONB,IN region TEXT DEFAULT NULL,IN invocation_type TEXT DEFAULT 'RequestResponse ',IN log_type TEXT DEFAULT 'None',IN context JSONB DEFAULT NULL,IN qualifier VARCHAR(128) DEFAULT NULL,OUT status_code INT,OUT payload JSONB,OUT execution_version TEXT,OUT log_result TEXT)

aws_lambda.invoke(IN function_name aws_commons._lambda_function_arn_1,IN 有效载荷 JSONB,IN invocation_type TEXT DEFAULT 'RequestResponse',IN log_type TEXT DEFAULT 'None',IN 上下文 JSONB DEFAULT NULL,IN 限定符 VARCHAR(128, DEFAULT 状态)有效负载 JSONB,OUT 执行版本 TEXT,OUT log_result TEXT) Lambda 函数的标识名称。该值可以是函数名称、ARN 或部分 ARN。有关可能格式的列表,请参阅 AWS Lambda 开发人员指南中的 Lambda 函数名称格式。 Lambda 函数的输入。格式可以是 JSON 或 JSONB。有关更多信息,请参阅 PostgreSQL 文档中的 JSON 类型。 (可选)函数的 Lambda 区域。默认情况下,RDS 从 function_name 中的完整 ARN 解析 AWS 区域,或者它使用 RDS for PostgreSQL 数据库实例区域。如果此 Region 值与 function_name ARN 中提供的值冲突,则会引发错误。 Lambda 函数的调用类型。该值区分大小写。可能的值包括: RequestResponse – 默认值。这种类型的 Lambda 函数调用是同步的,并在结果中返回响应负载。当您的工作流依赖于立即接收 Lambda 函数结果时,请使用 RequestResponse 调用类型。事件 – 对 Lambda 函数的这种类型的调用是异步的,并且在没有返回负载的情况下立即返回。如果您在工作流程继续之前不需要 Lambda 函数的结果,请使用事件调用类型。

要在 log_result 输出参数中返回的 Lambda 日志的类型。该值区分大小写。可能的值包括以下内容: Tail – 返回的 log_result 输出参数将包括执行日志的最后 4 KB。 JSON 或 JSONB 格式的客户端上下文。要使用的字段包括 custom 和 env。标识要调用的 Lambda 函数版本的限定符。如果此值与 function_name ARN 中提供的值冲突,则会引发错误。 HTTP 状态响应代码。有关更多信息,请参阅 AWS Lambda 开发人员指南中的 Lambda 调用响应元素。从运行的 Lambda 函数返回的信息。格式为 JSON 或 JSONB。调用Lambda函数时log_type值为Tail时返回的执行日志信息。结果包含以 Base64 编码的执行日志的最后 4 KB。

创建 aws_commons._lambda_function_arn_1 结构以保存 Lambda 函数名称信息。您可以在 aws_lambda.invoke aws_lambda.invoke 函数的 function_name 参数中使用 aws_commons.create_lambda_function_arn 函数的结果。包含 Lambda 函数名称的必需文本字符串。该值可以是函数名称、部分 ARN 或完整 ARN。包含 Lambda 函数所在 AWS 区域的可选文本字符串。有关区域名称和关联值的列表,请参阅区域、可用区和本地区域。