本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS Lambda 是一項事件驅動的運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。它可與許多 AWS 服務搭配使用,包括適用 PostgreSQL 的 Aurora。例如,您可以使用 Lambda 函數處理來自資料庫的事件通知,或在新檔案上傳到 Simple Storage Service (Amazon S3) 時從檔案中載入資料。若要進一步了解 Lambda,請參閱什麼是 AWS Lambda? 在AWS Lambda 開發人員指南中。
注意
在 Aurora PostgreSQL 11.9 及更高版本 (包括) 中支援叫用 AWS Lambda 函式。Aurora Serverless v2
以下提供必要步驟的摘要。
如需有關 Lambda 函數的詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的 Lambda 入門和 AWS Lambda 函數。
主題
- 步驟 1:AWS Lambda
- 步驟 2:為您的 Aurora PostgreSQL 資料庫叢集個體和 AWS Lambda
- 步驟 3:為 Aurora PostgreSQL 資料庫叢集安裝 aws_lambda 擴充功能
- 步驟 4:搭配 Aurora PostgreSQL 資料庫叢集使用 Lambda helper 函數 (選用)
- 步驟 5:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。
- 步驟 6:授予其他使用者呼叫 Lambda 函數的許可權限
- 範例:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數
- Lambda 函數錯誤訊息
- AWS Lambda函數和參數參考
步驟 1:AWS Lambda
Lambda 函數一律在 AWS Lambda 服務擁有的 Amazon VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC,並自動維護和監控 VPC。您的 Aurora PostgreSQL 資料庫叢集 會將網路流量傳送到 Lambda 服務的 VPC。具體設定取決於 Aurora 資料庫叢集的主要資料庫執行個體是公有的或私有。
公有 Aurora PostgreSQL 資料庫叢集 — 如果資料庫叢集的主要資料行個體位於 VPC 的公有子網路中,且執行個體的 "" 內容為,則該執行個體為公用資料庫執行個體。PubliclyAccessible
true
若要尋找此屬性的值,您可以使用描述-db 執行個體 AWS CLI 指令。或者可以使用 AWS Management Console 開啟 Connectivity & security (連線與安全性) 索引標籤,檢查 Publicly accessible (可公開存取) 是否為 Yes (是)。若要驗證執行個體是否在您的 VPC 公有子網路中,您可以使用 AWS Management Console 或 AWS CLI。若要設定 Lambda 的存取權,您可以使 AWS CLI 用 AWS Management Console 或在 VPC 的安全群組上建立輸出規則。傳出規則會指定 TCP 可以使用連接埠 443 將封包傳至任何 IPv4 位址 (0.0.0.0/0)。
私有 Aurora PostgreSQL 資料庫叢集 個體) — 在此情況下,執行個體的 "PubliclyAccessible" 內容為
false
或位於私有子網路中。若要允許執行個體使用 Lambda,您可以使用網路位址轉譯 (NAT) 閘道。如需更多詳細資訊,請參閱 NAT 閘道。或者,您可以使用 Lambda 的 VPC 端點來設定 VPC。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 VPC 端點。端點將 Aurora PostgreSQL 資料庫叢集 所發出呼叫的回傳至 Lambda 函數。
您的 VPC 現在可以在網路層級與 AWS Lambda VPC 互動。下一步,您需要使用 IAM 來設定許可。
步驟 2:為您的 Aurora PostgreSQL 資料庫叢集個體和 AWS Lambda
從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數需要某些權限。若要設定必要的權限,建議您建立允許叫用 Lambda 函數的 IAM 政策,將政策指派給一個角色,然後將該角色套用至資料庫叢集。此做法會提供資料庫叢集權限,允許代表您叫用指定的 Lambda 函數。下列步驟說明如何在 AWS CLI中執行此操作。
設定 IAM 許可以搭配 Lambda 使用叢集
使用建立政策 AWS CLI 命令建立 IAM 政策
,以允許您的 Aurora PostgreSQL 資料庫叢集 RDS 版 PostgreSQL 資料庫 ambda 函數。(陳述式 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 政策。使用建立角色
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" } ] }'使用附件角色原則命令將原則套用至角色
AWS CLI 。 aws iam attach-role-policy \ --policy-arn arn:aws:iam::
444455556666
:policy/rds-lambda-policy
\ --role-namerds-lambda-role
--regionaws-region
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/add-role-to-db-cluster.html
AWS CLI 最後這個步驟允許資料庫叢集的資料庫使用者叫用 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
\ --regionaws-region
完成 VPC 和 IAM 設定後,現在可以安裝 aws_lambda
擴充功能。(請注意,您可以隨時安裝擴充功能,但在設定正確的 VPC 支援和 IAM 權限之前,aws_lambda
擴充功能不會為 Aurora PostgreSQL 資料庫叢集的功能新增任何項目。)
步驟 3:為 Aurora PostgreSQL 資料庫叢集安裝 aws_lambda
擴充功能
此擴充功能讓 Aurora PostgreSQL 資料庫叢集能夠從 PostgreSQL 呼叫 Lambda 函數。
在 Aurora PostgreSQL 資料庫叢集中安裝 aws_lambda
擴充功能
使用 PostgreSQL psql
命令列或 pgAdmin 工具連線到Aurora PostgreSQL 資料庫叢集 。
以具有
rds_superuser
權限的使用者身分連線至 Aurora PostgreSQL 資料庫叢集 執行個體。預設postgres
使用者顯示於範例中。psql -h
cluster-instance.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
-
安裝
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 函數 (選用)
您可以在 aws_commons
擴充功能中使用 helper 函數,準備可更輕鬆從 PostgreSQL 叫用的實體。若要執行此操作,您需要以下有關 Lambda 函數的資訊:
-
函數名稱 – Lambda 函數的名稱、Amazon 資源名稱 (ARN)、版本或別名。在 步驟 2:為叢集 和 Lambda 設定 IAM 中建立的 IAM 政策需要 ARN,因此建議您使用函數的 ARN。
-
AWS 區域 — (選 版 PostgreSQL 資料庫執行個體不在相同的區域。
若要保存 Lambda 函數名稱資訊,可使用 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_lambda.invoke 函數呼叫。如需範例,請參閱 步驟 5:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。。
步驟 5:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。
aws_lambda.invoke
函數採同步或異步行為,具體取決於 invocation_type
。此參數的兩個替代項目是 RequestResponse
(預設值) 和 Event
,如下所示:
-
RequestResponse
– 此叫用類型為同步。這是在未指定叫用類型的情況下進行呼叫時的預設行為。回應承載包括aws_lambda.invoke
函數的結果。如果您的工作流程需要接收 Lambda 函數的結果才能繼續執行,請使用此叫用類型。 -
Event
– 此叫用類型為非同步。回應不包括含有結果的承載。如果您的工作流程不需要 Lambda 函數的結果即可繼續執行,請使用此叫用類型。
如要簡單測試您的設定,可以使用 psql
連線至資料庫執行個體,並從命令列叫用範例函數。假設您在 Lambda 服務上設定了一個基本函數,例如下方螢幕擷取畫面中顯示的簡單 Python 函數。
![中顯示的 AWS CLI 範例 Lambda 函數 AWS Lambda](images/lambda_simple_function.png)
叫用範例函數
使用
psql
或 pgAdmin 連線至主要資料庫執行個體。psql -h
cluster.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
使用函數的 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 函數錯誤訊息 。
步驟 6:授予其他使用者呼叫 Lambda 函數的許可權限
在程序中的這一點上,只有身為 rds_superuser
的您可以叫用 Lambda 函式。如要允許其他使用者呼叫您建立的任何函數,您需要授予其許可權限。
如要授予叫用 Lambda 函數的許可權限
使用
psql
或 pgAdmin 連線至主要資料庫執行個體。psql -h
cluster.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
執行下列 SQL 命令:
postgres=>
GRANT USAGE ON SCHEMA aws_lambda TOdb_username
; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TOdb_username
;
範例:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數
以下提供幾個呼叫 aws_lambda.invoke 函數的範例。大多數範例都使用您在中建立aws_lambda_arn_1
的複合結構步驟 4:搭配 Aurora PostgreSQL 資料庫叢集使用 Lambda helper 函數 (選用)來簡化傳遞函數詳細資訊。如需非同步叫用的範例,請參閱範例:Lambda 函數的非同步 (Event) 叫用。列出的所有其他範例都使用同步叫用。
若要進一步了解 Lambda 叫用類型,請參閱《AWS Lambda 開發人員指南》中的叫用 Lambda 函數。如需 aws_lambda_arn_1
的詳細資訊,請參閱 aws_commons.create_lambda_function_arn。
範例清單
範例:Lambda 函數的同步 (RequestResponse) 叫用
下面是同步 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 函數 (選用) 中使用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) 叫用
以下是非同步 Lambda 函數叫用的範例。Event
叫用類型會使用指定的輸入承載,來排程 Lambda 函數叫用並立即傳回。在某些工作流程中,使用不依賴於 Lambda 函數結果的 Event
叫用類型。
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'Event');
範例:在函數回應中擷取 Lambda 執行日誌
在 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_lambda.invoke log_type
函數的 Tail
參數設定為在回應中包含執行日誌。log_type
參數的預設值為 None
。
log_result
傳回的是 base64
編碼字串。您可以使用 decode
和 convert_from
PostgreSQL 函數的組合,來解碼內容。
如需 log_type
的詳細資訊,請參閱 aws_lambda.invoke。
範例:在 Lambda 函數中包含用戶端內容
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_lambda.invoke 函數的 context
參數。
如需 context
參數的詳細資訊,請參閱 aws_lambda.invoke 參考。
範例:叫用特定版本的 Lambda 函數
使用 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_lambda.invoke 參考。
Lambda 函數錯誤訊息
於下列清單中,您可找到有關錯誤訊息的資訊,及可能的原因和解決方案。
-
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 函數的許可權限。
不正確處理 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 應用程式中的錯誤。