

# 从 RDS for PostgreSQL 数据库实例中调用 AWS Lambda 函数
<a name="PostgreSQL-Lambda"></a>

AWS Lambda 是事件驱动型计算服务，无需您预置或管理服务器即可运行代码。该服务可与许多 AWS 服务搭配使用，其中包括 RDS for PostgreSQL。例如，您可以使用 Lambda 函数处理来自数据库的事件通知，或者在将新文件上传到 Amazon S3 时从文件中加载数据。若要了解 Lambda 的更多信息，请参阅《AWS Lambda 开发人员指南**》中的[什么是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 

**注意**  
这些 RDS for PostgreSQL 版本支持调用 AWS Lambda 函数：  
所有的 PostgreSQL 18 版本
所有 PostgreSQL 17 版本
所有 PostgreSQL 16 版本
所有 PostgreSQL 15 版本
PostgreSQL 14.1 及更高的次要版本
PostgreSQL 13.2 及更高的次要版本
PostgreSQL 12.6 及更高的次要版本

设置 RDS for PostgreSQL 使用 Lambda 函数的过程包含多个步骤，其中涉及 AWS Lambda、IAM、VPC 和 RDS for PostgreSQL 数据库实例。下文对必要步骤进行了总结。

有关 Lambda 函数的更多信息，请参阅《AWS 开发人员指南[https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)》中的 [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/lambda-foundation.html)和 *AWS Lambda Lambda 函数*。

**Topics**
+ [步骤 1：配置 RDS for PostgreSQL 数据库实例，实现与 AWS Lambda 的出站连接](#PostgreSQL-Lambda-network)
+ [步骤 2：为 RDS for PostgreSQL 数据库实例和 AWS Lambda 配置 IAM](#PostgreSQL-Lambda-access)
+ [步骤 3：为 RDS for PostgreSQL 数据库实例安装 `aws_lambda` 扩展](#PostgreSQL-Lambda-install-extension)
+ [步骤 4：将 Lambda 帮助程序函数与 RDS for PostgreSQL 数据库实例搭配使用（可选）](#PostgreSQL-Lambda-specify-function)
+ [步骤 5：从 RDS for PostgreSQL 数据库实例调用 Lambda 函数](#PostgreSQL-Lambda-invoke)
+ [步骤 6：授予其他用户调用 Lambda 函数的权限](#PostgreSQL-Lambda-grant-users-permissions)
+ [示例：从 RDS for PostgreSQL 数据库实例调用 Lambda 函数](PostgreSQL-Lambda-examples.md)
+ [Lambda 函数错误消息](PostgreSQL-Lambda-errors.md)
+ [AWS Lambda 函数和参数参考](PostgreSQL-Lambda-functions.md)

## 步骤 1：配置 RDS for PostgreSQL 数据库实例，实现与 AWS Lambda 的出站连接
<a name="PostgreSQL-Lambda-network"></a>

Lambda 函数始终在 AWS Lambda 服务拥有的 Amazon VPC 中运行。Lambda 将向此 VPC 应用网络访问和安全规则，并且会自动维护和监控 VPC。RDS for PostgreSQL 数据库实例向 Lambda 服务的 VPC 发送网络流量。其配置方式取决于 数据库实例是公有实例，还是私有实例。
+ **公有 RDS for PostgreSQL 数据库实例** – 如果数据库实例位于 VPC 的公有子网中，并且该实例的“PublicyAccessible”属性为 `true`，则该实例是公有的。若要查找此属性的值，您可以使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) AWS CLI 命令。您也可以使用 AWS 管理控制台 打开 **Connectivity & security**（连接和安全性）选项卡，然后检查 **Publicly accessible**（公开访问）是否为 **Yes**（是）。要验证实例是否在您的 VPC 的公有子网中，您可以使用 AWS 管理控制台或 AWS CLI。

  要设置对 Lambda 的访问权限，您可以使用 AWS 管理控制台 或 AWS CLI 在 VPC 的安全组上创建出站规则。出站规则指定 TCP 可以使用端口 443 将数据包发送到任何 IPv4 地址（0.0.0.0/0）。
+ **私有 RDS for PostgreSQL数据库实例** – 在这种情况下，实例的“PublicyAccessible”属性为 `false` 或它位于私有子网中。要允许实例使用 Lambda，您可以使用网络地址转换（NAT）网关。有关更多信息，请参阅 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。或者，您可以使用用于 Lambda 的 VPC 端点配置 VPC。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)。该端点响应 RDS for PostgreSQL 数据库实例对 Lambda 函数发出的调用。VPC 端点使用自己的私有 DNS 解析。在您将 `rds.custom_dns_resolution` 的值从其默认值 0（未启用）更改为 1 之前，RDS for PostgreSQL 无法使用 Lambda VPC 端点。为此，请执行以下操作：
  + 创建自定义数据库参数组。
  + 将 `rds.custom_dns_resolution` 参数的值由默认值 `0` 更改为 `1`。
  + 修改数据库实例以使用自定义数据库参数组。
  + 重启实例，使修改的参数生效。

您的 VPC 现在可以在网络级别与 AWS Lambda VPC 交互。接下来，您使用 IAM 配置权限。

## 步骤 2：为 RDS for PostgreSQL 数据库实例和 AWS Lambda 配置 IAM
<a name="PostgreSQL-Lambda-access"></a>

从 RDS for PostgreSQL 数据库实例调用 Lambda 函数需要特定权限。若要配置必要权限，建议创建允许调用 Lambda 函数的 IAM 策略，将该策略分配给一个角色，然后将该角色应用于数据库实例。这种方法授予数据库实例代表您调用指定 Lambda 函数的权限。以下步骤说明如何使用 AWS CLI 执行此操作。

**配置 IAM 权限以将Amazon RDS 实例与 Lambda 搭配使用**

1. 使用 [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) AWS CLI 命令创建允许 RDS for PostgreSQL 数据库实例调用指定 Lambda 函数的 IAM 策略。（语句 ID (Sid) 是策略语句的可选描述，对使用没有影响。） 此策略授予 数据库实例调用指定 Lambda 函数所需的最低权限。

   ```
   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:aws-region:444455556666:function:my-function"
           }
       ]
   }'
   ```

   您也可以使用允许您调用任何 Lambda 函数的预定义 `AWSLambdaRole` 策略。有关更多信息，请参阅 [Lambda 的基于身份的 IAM 策略](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html#access-policy-examples-aws-managed) 

1. 使用 [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) AWS CLI 命令创建该策略可在运行时担任的 IAM 角色。

   ```
   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"
           }
       ]
   }'
   ```

1. 使用 [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html) AWS CLI 命令将策略应用于角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \
       --role-name rds-lambda-role --region aws-region
   ```

1. 使用  [add-role-to-db-instance](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/add-role-to-db-instance.html) AWS CLI 命令，将该角色应用于 RDS for PostgreSQL 数据库实例。最后一步允许数据库实例的数据库用户调用 Lambda 函数。

   ```
   aws rds add-role-to-db-instance \
          --db-instance-identifier my-instance-name \
          --feature-name Lambda \
          --role-arn  arn:aws:iam::444455556666:role/rds-lambda-role   \
          --region aws-region
   ```

完成 VPC 和 IAM 配置后，便可以安装 `aws_lambda` 扩展。（请注意，您可以随时安装扩展，但只有在您设置正确的 VPC 支持和 IAM 权限之后，`aws_lambda` 扩展才会对 RDS for PostgreSQL 数据库实例的功能添加内容。）

## 步骤 3：为 RDS for PostgreSQL 数据库实例安装 `aws_lambda` 扩展
<a name="PostgreSQL-Lambda-install-extension"></a>

要将 AWS Lambda 与 RDS for PostgreSQL 数据库实例结合使用，请将 `aws_lambda` PostgreSQL 扩展添加到 RDS for PostgreSQL 数据库实例。此扩展允许 RDS for PostgreSQL 数据库实例能从 PostgreSQL 调用 Lambda 函数。

**在 RDS for PostgreSQL 数据库实例中安装 `aws_lambda` 扩展**

使用 PostgreSQL `psql` 命令行或 pgAdmin 工具连接到 RDS for PostgreSQL 数据库实例。

1. 以具有 `rds_superuser` 权限的用户身份，连接到 RDS for PostgreSQL 数据库实例。默认 `postgres` 用户如示例所示。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. 安装 `aws_lambda` 扩展。`aws_commons` 扩展也是必要项。其为 PostgreSQL 的 `aws_lambda` 和许多其他 Aurora 扩展提供帮助程序函数。如果其尚未安装到 RDS for PostgreSQL 数据库实例上，则会按如下所示一并安装该扩展和 `aws_lambda`。

   ```
   CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;
   NOTICE:  installing required extension "aws_commons"
   CREATE EXTENSION
   ```

`aws_lambda` 扩展已安装在 数据库实例中。现在，您可以创建易于使用结构来调用 Lambda 函数。

## 步骤 4：将 Lambda 帮助程序函数与 RDS for PostgreSQL 数据库实例搭配使用（可选）
<a name="PostgreSQL-Lambda-specify-function"></a>

您可以使用 `aws_commons` 扩展中的帮助程序函数来准备实体，以便更轻松地从 PostgreSQL 调用这些实体。为此，您需要获得有关 Lambda 函数的以下信息：
+ **Function name**（函数名称）：Lambda 函数的名称、Amazon Resource Name (ARN)、版本或别名。在 [步骤 2：为实例和 Lambda 配置 IAM](#PostgreSQL-Lambda-access) 中创建的 IAM 策略需要 ARN，所以建议您使用函数的 ARN。
+ **AWS 区域** —（可选）如果与 RDS for PostgreSQL 数据库实例不在同一个区域中，则此区域为 Lambda 函数所在的 AWS 区域。

您可以使用 [aws\$1commons.create\$1lambda\$1function\$1arn](PostgreSQL-Lambda-functions.md#aws_commons.create_lambda_function_arn) 函数保存 Lambda 函数名称信息。此帮助程序函数创建了 `aws_commons._lambda_function_arn_1` 复合结构，其中包含调用函数所需的详细信息。在下文中，您可以找到三种替代方法来设置此复合结构。

```
SELECT aws_commons.create_lambda_function_arn(
   'my-function',
   'aws-region'
) AS aws_lambda_arn_1 \gset
```

```
SELECT aws_commons.create_lambda_function_arn(
   '111122223333:function:my-function',
   'aws-region'
) AS lambda_partial_arn_1 \gset
```

```
SELECT aws_commons.create_lambda_function_arn(
   'arn:aws:lambda:aws-region:111122223333:function:my-function'
) AS lambda_arn_1 \gset
```

这些值均可用于 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 函数调用。有关示例，请参阅 [步骤 5：从 RDS for PostgreSQL 数据库实例调用 Lambda 函数](#PostgreSQL-Lambda-invoke)。

## 步骤 5：从 RDS for PostgreSQL 数据库实例调用 Lambda 函数
<a name="PostgreSQL-Lambda-invoke"></a>

`aws_lambda.invoke` 函数采用同步还是异步调用方式取决于 `invocation_type`。此参数的两个可用选项分别为 `RequestResponse`（默认）和 `Event`，如下所示。
+ **`RequestResponse`**：此为*同步*调用类型。如果调用时未指定调用类型，默认此调用方式。响应有效负载包含 `aws_lambda.invoke` 函数的结果。如果工作流程需要接收 Lambda 函数的结果才能继续进行操作，请使用此调用类型。
+ **`Event`**：此为*异步*调用类型。响应不包含包含结果的有效负载。如果工作流程不需要 Lambda 函数的结果即可继续进行操作，请使用此调用类型。

要对设置进行简单测试，您可以使用 `psql` 连接到数据库实例，然后从命令行调用示例函数。假设在 Lambda 服务上设置了一个基本函数，例如下面屏幕截图中所示的简单 Python 函数。

![\[AWS Lambda 的 AWS CLI 中显示的示例 Lambda 函数\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/lambda_simple_function.png)


**调用示例函数**

1. 使用 `psql` 或 pgAdmin 连接到数据库实例。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. 使用函数的 ARN 调用该函数。

   ```
   SELECT * from aws_lambda.invoke(aws_commons.create_lambda_function_arn('arn:aws:lambda:aws-region:444455556666:function:simple', 'us-west-1'), '{"body": "Hello from Postgres!"}'::json );
   ```

   响应如下所示。

   ```
   status_code |                        payload                        | executed_version | log_result
   -------------+-------------------------------------------------------+------------------+------------
            200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST          |
   (1 row)
   ```

如果调用尝试不成功，请参阅 [Lambda 函数错误消息](PostgreSQL-Lambda-errors.md)。

## 步骤 6：授予其他用户调用 Lambda 函数的权限
<a name="PostgreSQL-Lambda-grant-users-permissions"></a>

在程序的这一步骤中，仅当您是 `rds_superuser` 才能调用 Lambda 函数。要允许其他用户调用您创建的任何函数，您需要向他们授予权限。

**要授予调用 Lambda 函数的其他权限，请执行以下操作：**

1. 使用 `psql` 或 pgAdmin 连接到数据库实例。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. 运行以下 SQL 命令：

   ```
   postgres=>  GRANT USAGE ON SCHEMA aws_lambda TO db_username;
   GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TO db_username;
   ```

# 示例：从 RDS for PostgreSQL 数据库实例调用 Lambda 函数
<a name="PostgreSQL-Lambda-examples"></a>

在下文中，您可以找到调用 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 函数的一些示例。大多数示例都使用您在 [步骤 4：将 Lambda 帮助程序函数与 RDS for PostgreSQL 数据库实例搭配使用（可选）](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) 中创建的复合结构 `aws_lambda_arn_1` 来简化函数详细信息的传递。有关异步调用的示例，请参阅 [示例：Lambda 函数的异步（事件）调用](#PostgreSQL-Lambda-Event)。列出的其他示例均使用同步调用。

要了解有关 Lambda 调用类型的更多信息，请参阅《AWS Lambda 开发人员指南**》中的[调用 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)。有关 `aws_lambda_arn_1` 的更多信息，请参阅[aws\$1commons.create\$1lambda\$1function\$1arn](PostgreSQL-Lambda-functions.md#aws_commons.create_lambda_function_arn)。

**Topics**
+ [示例：Lambda 函数的同步 (RequestResponse) 调用](#PostgreSQL-Lambda-RequestResponse)
+ [示例：Lambda 函数的异步（事件）调用](#PostgreSQL-Lambda-Event)
+ [示例：在函数响应中捕获 Lambda 执行日志](#PostgreSQL-Lambda-log-response)
+ [示例：在 Lambda 函数中包含客户端上下文](#PostgreSQL-Lambda-client-context)
+ [示例：调用 Lambda 函数的特定版本](#PostgreSQL-Lambda-function-version)

## 示例：Lambda 函数的同步 (RequestResponse) 调用
<a name="PostgreSQL-Lambda-RequestResponse"></a>

以下是 Lambda 函数同步调用的两个示例。这些 `aws_lambda.invoke` 函数调用的结果相同。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json);
```

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse');
```

参数如下所述：
+ `:'aws_lambda_arn_1'`：此参数使用 `aws_commons.create_lambda_function_arn` 帮助程序函数标识在 [步骤 4：将 Lambda 帮助程序函数与 RDS for PostgreSQL 数据库实例搭配使用（可选）](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) 中创建的复合结构。您还可以通过内联方式在 `aws_lambda.invoke` 调用中创建此结构，如下所示。

  ```
  SELECT * FROM aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function', 'aws-region'),
  '{"body": "Hello from Postgres!"}'::json
  );
  ```
+ `'{"body": "Hello from PostgreSQL!"}'::json` – 要传递到 Lambda 函数的 JSON 负载。
+ `'RequestResponse'` – Lambda 调用类型。

## 示例：Lambda 函数的异步（事件）调用
<a name="PostgreSQL-Lambda-Event"></a>

以下是异步 Lambda 函数调用的示例。`Event` 调用类型使用指定的输入负载计划 Lambda 函数调用并立即返回。在某些不依赖于 Lambda 函数结果的工作流程中使用 `Event` 调用类型。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'Event');
```

## 示例：在函数响应中捕获 Lambda 执行日志
<a name="PostgreSQL-Lambda-log-response"></a>

您可以使用 `aws_lambda.invoke` 函数调用中的 `log_type` 参数，在函数响应中包含执行日志的最后 4 kB。默认情况下，此参数设置为 `None`，但您可以指定 `Tail` 在响应中捕获 Lambda 执行日志的结果，如下所示。

```
SELECT *, 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');
```

将 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 函数的 `log_type` 参数设置为 `Tail`，以在响应中包含执行日志。`log_type` 参数的默认值为 `None`。

返回的 `log_result` 是 `base64` 编码的字符串。您可以使用 `decode` 和 `convert_from` PostgreSQL 函数的组合来解码内容。

有关 `log_type` 的更多信息，请参阅[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke)。

## 示例：在 Lambda 函数中包含客户端上下文
<a name="PostgreSQL-Lambda-client-context"></a>

`aws_lambda.invoke` 函数具有 `context` 参数，可用于传递独立于有效负载的信息，如下所示。

```
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');
```

要包含客户端上下文，请将 JSON 对象用于 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 函数的 `context` 参数。

有关 `context` 参数的更多信息，请参阅 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 参考。

## 示例：调用 Lambda 函数的特定版本
<a name="PostgreSQL-Lambda-function-version"></a>

通过在 `aws_lambda.invoke` 调用中包含 `qualifier` 参数，您可以指定 Lambda 函数的特定版本。在下文中，您可以找到一个使用 `'custom_version'` 作为版本别名完成此操作的示例。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse', 'None', NULL, 'custom_version');
```

您还可以改为提供包含 Lambda 函数名称详细信息的 Lambda 函数限定符，如下所示。

```
SELECT * FROM aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function:custom_version', 'us-west-2'),
'{"body": "Hello from Postgres!"}'::json);
```

有关 `qualifier` 和其他参数的详细信息，请参阅 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 参考。

# Lambda 函数错误消息
<a name="PostgreSQL-Lambda-errors"></a>

在下面的列表中，您可以找到有关错误消息的信息，以及可能的原因和解决方案。
+ **VPC 配置问题**

  在尝试连接时，VPC 配置问题可能会引发以下错误消息：

  ```
  ERROR:  invoke API failed
  DETAIL: AWS Lambda client returned 'Unable to connect to endpoint'.
  CONTEXT:  SQL function "invoke" statement 1
  ```

  导致此错误的常见原因是 VPC 安全组配置不当。确保在 VPC 安全组的端口 443 上打开 TCP 的出站规则，以便 VPC 能够连接到 Lambda VPC。

  如果数据库实例为私有实例，请检查 VPC 的私有 DNS 设置。确保将 `rds.custom_dns_resolution` 参数设置为 1 并按照 [步骤 1：配置 RDS for PostgreSQL 数据库实例，实现与 AWS Lambda 的出站连接](PostgreSQL-Lambda.md#PostgreSQL-Lambda-network) 所述设置 AWS PrivateLink。有关更多信息，请参阅[接口 VPC 端点 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)。
+ **缺乏调用 Lambda 函数所需的权限**

  如果看到以下任一错误消息，说明调用此函数的用户（角色）没有适当的权限。

  ```
  ERROR:  permission denied for schema aws_lambda
  ```

  ```
  ERROR:  permission denied for function invoke
  ```

  必须向用户（角色）授予特定权限才能调用 Lambda 函数。有关更多信息，请参阅 [步骤 6：授予其他用户调用 Lambda 函数的权限](PostgreSQL-Lambda.md#PostgreSQL-Lambda-grant-users-permissions)。
+ **对 Lambda 函数中的错误处理不当**

  如果 Lambda 函数在请求处理过程中抛出异常，则 `aws_lambda.invoke` 会失败并显示 PostgreSQL 错误，如下所示。

  ```
  SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json);
  ERROR:  lambda invocation failed
  DETAIL:  "arn:aws:lambda:us-west-2:555555555555:function:my-function" returned error "Unhandled", details: "<Error details string>".
  ```

  务必处理 Lambda 函数或 PostgreSQL 应用程序中的错误。

# AWS Lambda 函数和参数参考
<a name="PostgreSQL-Lambda-functions"></a>

以下是通过 RDS for PostgreSQL 调用 Lambda 所用函数和参数的参考。

**Topics**
+ [aws\$1lambda.invoke](#aws_lambda.invoke)
+ [aws\$1commons.create\$1lambda\$1function\$1arn](#aws_commons.create_lambda_function_arn)
+ [aws\$1lambda 参数](#aws_lambda.parameters)

## aws\$1lambda.invoke
<a name="aws_lambda.invoke"></a>

为 RDS for PostgreSQL 数据库实例 运行 Lambda 函数。

有关调用 Lambda 函数的更多详细信息，另请参阅 *AWS Lambda 开发人员指南*中的[调用](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)。

**语法**

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

```
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 payload JSON,
OUT executed_version TEXT,
OUT log_result TEXT)
```

```
aws_lambda.invoke(
IN function_name aws_commons._lambda_function_arn_1,
IN payload JSON,
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 payload JSON,
OUT executed_version TEXT,
OUT log_result TEXT)
```

------
#### [ JSONB ]

```
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 executed_version TEXT,
OUT log_result TEXT)
```

```
aws_lambda.invoke(
IN function_name aws_commons._lambda_function_arn_1,
IN payload JSONB,
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 executed_version TEXT,
OUT log_result TEXT
)
```

------输入参数

**function\$1name**  
Lambda 函数的标识名称。该值可以是函数名称、ARN 或部分 ARN。有关可能的格式的列表，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 函数名称格式](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestParameters)。

*payload*  
Lambda 函数的输入。格式可以是 JSON 或 JSONB。有关更多信息，请参阅 PostgreSQL 文档中的 [JSON 类型](https://www.postgresql.org/docs/current/datatype-json.html)。

*区域*  
（可选）函数的 Lambda 区域。默认情况下，RDS 会从 `function_name` 的完整 ARN 中解析 AWS 区域，或使用 RDS for PostgreSQL 数据库实例区域。如果此区域值与 `function_name` ARN 中提供的值冲突，则会引发错误。

*invocation\$1type*  
Lambda 函数的调用类型。 值区分大小写。可能的值包括：  
+ `RequestResponse` – 默认值。Lambda 函数的这种调用类型是同步的，并在结果中返回响应负载。当工作流程依赖于立即接收 Lambda 函数结果时，请使用 `RequestResponse` 调用类型。
+ `Event` – Lambda 函数的这种调用类型是异步的，并在没有返回负载的情况下立即返回。如果您不需要在工作流程开始之前了解 Lambda 函数的结果，请使用 `Event` 调用类型。
+ `DryRun` – 这种类型的调用在不允许 Lambda 函数的情况下测试访问权限。

*log\$1type*  
要在 `log_result` 输出参数中返回的 Lambda 日志类型。 值区分大小写。可能的值包括：  
+ Tail – 返回的 `log_result` 输出参数将包含执行日志的最后 4 kB。
+ None – 未返回 Lambda 日志信息。

*context*  
JSON 或 JSONB 格式的客户端上下文。要使用的字段包括 `custom` 和 `env`。

*限定符*  
标识要调用的 Lambda 函数版本的限定符。如果此值与 `function_name` ARN 中提供的值冲突，则会引发错误。输出参数

*status\$1code*  
HTTP 状态响应代码。有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 调用响应元素](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_ResponseElements)。

*payload*  
从运行的 Lambda 函数返回的信息。格式为 JSON 或 JSONB。

*executed\$1version*  
运行的 Lambda 函数的版本。

*log\$1result*  
如果 `log_type` 值在调用 Lambda 函数时为 `Tail`，则会返回执行日志信息。结果包含以 Base64 编码的执行日志的最后 4 kB。

## aws\$1commons.create\$1lambda\$1function\$1arn
<a name="aws_commons.create_lambda_function_arn"></a>

创建一个 `aws_commons._lambda_function_arn_1` 结构来保存 Lambda 函数名称信息。您可以在 aws\$1lambda.invoke `aws_commons.create_lambda_function_arn` 函数的 `function_name` 参数中使用 [aws\$1lambda.invoke](#aws_lambda.invoke) 函数的结果。

**语法**

```
aws_commons.create_lambda_function_arn(
    function_name TEXT,
    region TEXT DEFAULT NULL
    )
    RETURNS aws_commons._lambda_function_arn_1
```输入参数

*function\$1name*  
包含 Lambda 函数名称的必需文本字符串。该值可以是函数名称、部分 ARN 或完整 ARN。

*区域*  
一个包含 Lambda 函数所在的AWS区域的可选文本字符串。有关 区域名称和关联值的列表，请参阅[区域、可用区和 Local Zones ](Concepts.RegionsAndAvailabilityZones.md)。

## aws\$1lambda 参数
<a name="aws_lambda.parameters"></a>

在该表中，您可以找到与 `aws_lambda` 函数关联的参数。


| 参数 | 描述 | 
| --- | --- | 
| `aws_lambda.connect_timeout_ms` | 这是一个动态参数，用于设置连接到 AWS Lambda 时的最大等待时间。默认值为 `1000`。此参数允许的值为 1 - 900000。 | 
| `aws_lambda.request_timeout_ms` | 这是一个动态参数，它设置了等待来自 AWS Lambda 的响应时的最大等待时间。默认值为 `3000`。此参数允许的值为 1 - 900000。 | 
| `aws_lambda.endpoint_override` | 指定可用于连接到 AWS Lambda 的端点。空字符串会选择该区域的默认 AWS Lambda 端点。必须重启数据库，此静态参数更改才能生效。 | 