

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

# 從 RDS for PostgreSQL 資料庫執行個體叫用 AWS Lambda 函數
<a name="PostgreSQL-Lambda"></a>

AWS Lambda 是一種事件驅動的運算服務，可讓您執行程式碼，而無需佈建或管理伺服器。它可用於許多 AWS 服務，包括 RDS for PostgreSQL。例如，您可以使用 Lambda 函數處理來自資料庫的事件通知，或在新檔案上傳到 Simple Storage Service (Amazon S3) 時從檔案中載入資料。若要進一步了解 Lambda，請參閱《 開發人員指南》中的[什麼是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。 *AWS Lambda *

**注意**  
這些 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 函數是涉及 IAM AWS Lambda、VPC 和 RDS for PostgreSQL 資料庫執行個體的多步驟程序。以下提供必要步驟的摘要。

如需有關 Lambda 函數的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的 [Lambda 入門](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)和 [AWS Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/lambda-foundation.html)。

**Topics**
+ [步驟 1：為您的 RDS for PostgreSQL 資料庫執行個體設定傳出連線 AWS Lambda](#PostgreSQL-Lambda-network)
+ [步驟 2：為您的 RDS for PostgreSQL 資料庫執行個體和 設定 IAM AWS Lambda](#PostgreSQL-Lambda-access)
+ [步驟 3：安裝 RDS for PostgreSQL 資料庫執行個體的`aws_lambda`擴充功能](#PostgreSQL-Lambda-install-extension)
+ [步驟 4：搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用)](#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 資料庫執行個體** – 如果執行個體位於公有子網路中，且執行個體的「PubliclyAccessible able」屬性為 `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 資料庫執行個體** – 在此情況下，執行個體的「PubliclyAccessible」屬性為 `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 for PostgreSQL 無法使用 Lambda VPC 端點，除非您將 `rds.custom_dns_resolution` 從預設值 0 (未啟用) 改為 1。若要這麼做：
  + 建立自訂資料庫參數群組。
  + 將參數 `rds.custom_dns_resolution` 從預設值 `0` 變更為 `1`。
  + 修改資料庫執行個體以使用自訂資料庫參數群組。
  + 為了讓修改過的參數生效，請重新啟動執行個體。

您的 VPC 現在可以在網路層級與 AWS Lambda VPC 互動。下一步，您需要使用 IAM 來設定許可。

## 步驟 2：為您的 RDS for PostgreSQL 資料庫執行個體和 設定 IAM AWS Lambda
<a name="PostgreSQL-Lambda-access"></a>

從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數需要某些權限。若要設定必要的權限，建議您建立允許叫用 Lambda 函數的 IAM 政策，將政策指派給一個角色，然後將該角色套用至資料庫執行個體。此做法會提供資料庫執行個體權限，允許代表您叫用指定的 Lambda 函數。下列步驟說明如何在 AWS CLI中執行此操作。

**設定 IAM 許可以搭配 Lambda 使用Amazon RDS 執行個體**

1. 使用 [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) AWS CLI 命令建立 IAM 政策，允許 RDS for PostgreSQL 資料庫執行個體叫用指定的 Lambda 函數。(陳述式 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"
           }
       ]
   }'
   ```

   或者，您可以使用預先定義的 `AWSLambdaRole` 政策，該政策允許叫用任何 Lambda 函數。如需詳細資訊，請參閱[適用於 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` 擴充功能。它為 `aws_lambda` 提供了 helper 函數和 PostgreSQL 的許多其他 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：搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用)
<a name="PostgreSQL-Lambda-specify-function"></a>

您可以在 `aws_commons` 擴充功能中使用 helper 函數，準備可更輕鬆從 PostgreSQL 叫用的實體。若要執行此操作，您需要以下有關 Lambda 函數的資訊：
+ **函數名稱** – Lambda 函數的名稱、Amazon 資源名稱 (ARN)、版本或別名。在 [步驟 2：為 執行個體和 Lambda 設定 IAM](#PostgreSQL-Lambda-access) 中建立的 IAM 政策需要 ARN，因此建議您使用函數的 ARN。
+ **AWS 區域** – （選用） 如果 AWS Lambda 函數不在與 RDS for PostgreSQL 資料庫執行個體相同的區域中，則 Lambda 函數所在的區域。

若要保存 Lambda 函數名稱資訊，可使用 [aws\$1commons.create\$1lambda\$1function\$1arn](PostgreSQL-Lambda-functions.md#aws_commons.create_lambda_function_arn) 函數。此 helper 函數會建立一個 `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 函數。

![\[for 中顯示的範例 Lambda AWS CLI 函數 AWS Lambda\]](http://docs.aws.amazon.com/zh_tw/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：搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用)](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) 中建立的複合結構 `aws_lambda_arn_1` 來簡化函數詳細資訊的傳遞。如需非同步叫用的範例，請參閱[範例：Lambda 函數的非同步 (Event) 叫用](#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 函數的非同步 (Event) 叫用](#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'` – 此參數識別 [步驟 4：搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用)](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) 中使用 `aws_commons.create_lambda_function_arn` helper 函數建立的複合結構。您也可以在 `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 函數的非同步 (Event) 叫用
<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 函數限定詞，如下所示。

```
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 和 setup AWS PrivateLink，如 中所述[步驟 1：為您的 RDS for PostgreSQL 資料庫執行個體設定傳出連線 AWS Lambda](PostgreSQL-Lambda.md#PostgreSQL-Lambda-network)。如需詳細資訊，請參閱[介面 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 會從 AWS 中的完整 ARN 解析 `function_name` 區域，或使用 RDS for PostgreSQL 資料庫執行個體區域。如果此區域值與 `function_name` ARN 中提供的值衝突，則會引發錯誤。

*invocation\$1type*  
Lambda 函數的叫用類型。 值會區分大小寫。可能的值包括以下：  
+ `RequestResponse` – 預設值。Lambda 函數的這種叫用類型是同步的，並在結果中傳回回應承載。若您的工作流程依賴於立即接收 Lambda 函數，請使用 `RequestResponse` 叫用類型。
+ `Event` – Lambda 函數這種叫用類型是非同步的，並且在立即傳回時不含承載。若您在工作流程繼續進行之前不需要 Lambda 函數的結果，請使用 `Event` 叫用類型。
+ `DryRun` – 這種類型的叫用會測試存取而不執行該 Lambda 函數。

*log\$1type*  
`log_result` 輸出參數中要傳回的 Lambda 日誌類型。 值會區分大小寫。可能的值包括以下：  
+ 結尾 – 傳回的 `log_result` 輸出參數會包含執行日誌的最後 4 KB。
+ 無 – 沒有傳回 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 端點。您必須重新啟動資料庫，此靜態參數變更才能產生作用。 | 