

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

# 從 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;
   ```