

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

# 從 Aurora PostgreSQL 資料庫叢集 叫用 AWS Lambda 函數
<a name="PostgreSQL-Lambda"></a>

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

**注意**  
Aurora PostgreSQL 11.9 及更高版本 （包括 Aurora Serverless v2) 支援叫用 AWS Lambda 函數。

設定 Aurora PostgreSQL 以使用 Lambda 函數是涉及 IAM AWS Lambda、VPC 和 Aurora 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：為您的 Aurora PostgreSQL 資料庫叢集 設定傳出連線 AWS Lambda](#PostgreSQL-Lambda-network)
+ [步驟 2：為您的 Aurora PostgreSQL 資料庫叢集 和 設定 IAM AWS Lambda](#PostgreSQL-Lambda-access)
+ [步驟 3：安裝 Aurora PostgreSQL 資料庫叢集 的`aws_lambda`擴充功能](#PostgreSQL-Lambda-install-extension)
+ [步驟 4：搭配 Aurora PostgreSQL 資料庫叢集使用 Lambda helper 函數 (選用)](#PostgreSQL-Lambda-specify-function)
+ [步驟 5：從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。](#PostgreSQL-Lambda-invoke)
+ [步驟 6：授予其他使用者呼叫 Lambda 函數的許可權限](#PostgreSQL-Lambda-grant-users-permissions)
+ [範例：從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數](PostgreSQL-Lambda-examples.md)
+ [Lambda 函數錯誤訊息](PostgreSQL-Lambda-errors.md)
+ [AWS Lambda 函數和參數參考](PostgreSQL-Lambda-functions.md)

## 步驟 1：為您的 Aurora PostgreSQL 資料庫叢集 設定傳出連線 AWS Lambda
<a name="PostgreSQL-Lambda-network"></a>

Lambda 函數一律會在 AWS Lambda 服務擁有的 Amazon VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC，並自動維護和監控 VPC。您的 Aurora PostgreSQL 資料庫叢集 會將網路流量傳送到 Lambda 服務的 VPC。具體設定取決於 Aurora 資料庫叢集的主要資料庫執行個體是公有的或私有。
+ **公有 Aurora 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)。
+ **私有 Aurora 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)。端點將 Aurora PostgreSQL 資料庫叢集 所發出呼叫的回傳至 Lambda 函數。

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

## 步驟 2：為您的 Aurora PostgreSQL 資料庫叢集 和 設定 IAM AWS Lambda
<a name="PostgreSQL-Lambda-access"></a>

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

**設定 IAM 許可以搭配 Lambda 使用叢集**

1. 使用 [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) AWS CLI 命令建立 IAM 政策，允許 Aurora PostgreSQL 資料庫叢集叫用指定的 Lambda 函數。(陳述式 ID (Sid) 是政策陳述式的選用描述，不會影響使用。) 此政策為 Aurora 資料庫叢集提供叫用指定 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-cluster](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/add-role-to-db-cluster.html)  AWS CLI 命令，將角色套用至 Aurora PostgreSQL 資料庫叢集 。最後這個步驟允許資料庫叢集的資料庫使用者叫用 Lambda 函數。

   ```
   aws rds add-role-to-db-cluster \
          --db-cluster-identifier my-cluster-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` 擴充功能不會為 Aurora PostgreSQL 資料庫叢集的功能新增任何項目。)

## 步驟 3：安裝 Aurora PostgreSQL 資料庫叢集 的`aws_lambda`擴充功能
<a name="PostgreSQL-Lambda-install-extension"></a>

若要 AWS Lambda 搭配 Aurora PostgreSQL 資料庫叢集使用 ，請將 `aws_lambda` PostgreSQL 延伸模組新增至 Aurora PostgreSQL 資料庫叢集。此擴充功能讓 Aurora PostgreSQL 資料庫叢集能夠從 PostgreSQL 呼叫 Lambda 函數。

**在 Aurora PostgreSQL 資料庫叢集 中安裝`aws_lambda`擴充功能**

使用 PostgreSQL `psql` 命令列或 pgAdmin 工具連線到Aurora PostgreSQL 資料庫叢集 。

1. 以具有 `rds_superuser` 權限的使用者身分連線至 Aurora PostgreSQL 資料庫叢集 執行個體。預設 `postgres` 使用者顯示於範例中。

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

1. 安裝 `aws_lambda` 擴充功能。另外也需要 `aws_commons` 擴充功能。它為 `aws_lambda` 提供了 helper 函數和 PostgreSQL 的許多其他 Aurora 擴充功能。如果尚未裝在 Aurora PostgreSQL 資料庫叢集 上，會透過 `aws_lambda` 進行安裝，如下所示。

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

`aws_lambda` 擴充功能已安裝在 Aurora PostgreSQL 資料庫叢集的主要資料庫執行個體上。您現在可以建立便利的結構，用於叫用 Lambda 函數。

## 步驟 4：搭配 Aurora 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 函數不在與 Aurora 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：從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。](#PostgreSQL-Lambda-invoke)。

## 步驟 5：從 Aurora 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/AuroraUserGuide/images/lambda_simple_function.png)


**叫用範例函數**

1. 使用 `psql` 或 pgAdmin 連線至主要資料庫執行個體。

   ```
   psql -h cluster.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 cluster.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;
   ```

# 範例：從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數
<a name="PostgreSQL-Lambda-examples"></a>

以下提供幾個呼叫 [aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 函數的範例。大部分範例使用您在 [步驟 4：搭配 Aurora 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：搭配 Aurora 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。
+ **缺乏叫用 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>

以下是函數用於以 Aurora 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>

為 Aurora 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 區域。根據預設，Aurora 會從 AWS 中的完整 ARN 解析 `function_name` 區域，或使用 Aurora 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 區域。如需區域名稱和相關聯值的清單，請參閱[區域和可用區域](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 端點。您必須重新啟動資料庫，此靜態參數變更才能產生作用。 | 