本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從 叫用 AWS Lambda 函數
AWS Lambda 是一項事件驅動的運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。它可與許多 AWS 服務搭配使用,包括適用於 。例如,您可以使用 Lambda 函數處理來自資料庫的事件通知,或在新檔案上傳到 Simple Storage Service (Amazon S3) 時從檔案中載入資料。若要進一步了解 Lambda,請參閱什麼是 AWS Lambda? 在AWS Lambda 開發人員指南中。
注意
以下 RDS 版本支援叫用 AWS Lambda 函數:
PostgreSQL 本
所有 PostgreSQL 15 版本
PostgreSQL 14.1 版和更高次要版本
-
PostgreSQL 13.2 版和更新次要版本
-
PostgreSQL 12.6 版和更新次要版本
以下提供必要步驟的摘要。
如需有關 Lambda 函數的詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的 Lambda 入門和 AWS Lambda 函數。
主題
- 步驟 1:為輸出連 stgreSQL 資料庫執行個體AWS Lambda
- 步驟 2:為您的 RDS 資料庫執行個體和 AWS Lambda
- 步驟 3:為 RDS for PostgreSQL 資料庫執行個體安裝 aws_lambda 擴充功能
- 步驟 4:搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用)
- 步驟 5:從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數。
- 步驟 6:授予其他使用者呼叫 Lambda 函數的許可權限
- 範例:從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數
- Lambda 函數錯誤訊息
- AWS Lambda函數和參數參考
步驟 1:為輸出連 stgreSQL 資料庫執行個體AWS Lambda
Lambda 函數一律在 AWS Lambda 服務擁有的 Amazon VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC,並自動維護和監控 VPC。您的 RDS for PostgreSQL 資料庫執行個體會將網路流量傳送到 Lambda 服務的 VPC。具體設定取決於 資料庫執行個體是公有的或私有。
公有 RDS for PostgreSQL 資料庫執行個體 — 如果個體位於 VPC 的公有子網路中,且執行個體的 "" 內容為,則該執行個體為公用資料庫執行個體。PubliclyAccessible
true
若要尋找此屬性的值,您可以使用describe-db-instances 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)。
私有 RDS (適用於 PostgreSQL 資料庫執行個體) — 在此情況下,執行個體的 "PubliclyAccessible" 內容為
false
或位於私有子網路中。若要允許執行個體使用 Lambda,您可以使用網路位址轉譯 (NAT) 閘道。如需更多詳細資訊,請參閱 NAT 閘道。或者,您可以使用 Lambda 的 VPC 端點來設定 VPC。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 VPC 端點。端點將 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 資料庫執行個體和 AWS Lambda
從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數需要某些權限。若要設定必要的權限,建議您建立允許叫用 Lambda 函數的 IAM 政策,將政策指派給一個角色,然後將該角色套用至資料庫執行個體。此做法會提供資料庫執行個體權限,允許代表您叫用指定的 Lambda 函數。下列步驟說明如何在 AWS CLI中執行此操作。
設定 IAM 許可以搭配 Lambda 使用Amazon RDS 執行個體
使用建立政策 AWS CLI 命令建立 IAM 政策
,以允許您的 執行個體叫用指定的 L ambda 函數。(陳述式 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 政策。使用建立角色
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" } ] }'使用attach-role-policy
AWS CLI 命令將原則套用至角色。 aws iam attach-role-policy \ --policy-arn arn:aws:iam::
444455556666
:policy/rds-lambda-policy
\ --role-namerds-lambda-role
--regionaws-region
AWS CLI 最後這個步驟允許資料庫執行個體的資料庫使用者叫用 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
\ --regionaws-region
完成 VPC 和 IAM 設定後,現在可以安裝 aws_lambda
擴充功能。(請注意,您可以隨時安裝擴充功能,但在設定正確的 VPC 支援和 IAM 權限之前,aws_lambda
擴充功能不會為 RDS for PostgreSQL 資料庫執行個體的功能新增任何項目。)
步驟 3:為 RDS for PostgreSQL 資料庫執行個體安裝 aws_lambda
擴充功能
若要 AWS Lambda 與您的 RDS 資料庫執行個體搭配使用,請將 PostgreSQL 擴充功能新增至您的資料庫叢集 RDS 資料執行個體。aws_lambda
此擴充功能讓 RDS for PostgreSQL 資料庫執行個體能夠從 PostgreSQL 呼叫 Lambda 函數。
在 RDS for PostgreSQL 資料庫執行個體中安裝 aws_lambda
擴充功能
使用 PostgreSQL psql
命令列或 pgAdmin 工具連線到 RDS for PostgreSQL 資料庫執行個體。
以具有
rds_superuser
權限的使用者身分連線至 RDS for PostgreSQL 資料庫執行個體。預設postgres
使用者顯示於範例中。psql -h
instance.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
-
安裝
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 函數 (選用)
您可以在 aws_commons
擴充功能中使用 helper 函數,準備可更輕鬆從 PostgreSQL 叫用的實體。若要執行此操作,您需要以下有關 Lambda 函數的資訊:
-
函數名稱 – Lambda 函數的名稱、Amazon 資源名稱 (ARN)、版本或別名。在 步驟 2:為 執行個體和 Lambda 設定 IAM 中建立的 IAM 政策需要 ARN,因此建議您使用函數的 ARN。
-
AWS 區域 — (選用) 如果 Lambda 函數所在的 AWS 區域與 Aurora PostgreSQL 資料庫叢集 RDS 執行個體不在相同的區域。
若要保存 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:從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數。。
步驟 5:從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數。
aws_lambda.invoke
函數採同步或異步行為,具體取決於 invocation_type
。此參數的兩個替代項目是 RequestResponse
(預設值) 和 Event
,如下所示:
-
RequestResponse
– 此叫用類型為同步。這是在未指定叫用類型的情況下進行呼叫時的預設行為。回應承載包括aws_lambda.invoke
函數的結果。如果您的工作流程需要接收 Lambda 函數的結果才能繼續執行,請使用此叫用類型。 -
Event
– 此叫用類型為非同步。回應不包括含有結果的承載。如果您的工作流程不需要 Lambda 函數的結果即可繼續執行,請使用此叫用類型。
如要簡單測試您的設定,可以使用 psql
連線至資料庫執行個體,並從命令列叫用範例函數。假設您在 Lambda 服務上設定了一個基本函數,例如下方螢幕擷取畫面中顯示的簡單 Python 函數。
叫用範例函數
使用
psql
或 pgAdmin 連線至資料庫執行個體。psql -h
instance.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
instance.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
;
範例:從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數
以下提供幾個呼叫 aws_lambda.invoke 函數的範例。大部分範例使用您在 步驟 4:搭配 RDS for PostgreSQL 資料庫執行個體使用 Lambda helper 函數 (選用) 中建立的複合結構 aws_lambda_arn_1
來簡化函數詳細資訊的傳遞。如需非同步叫用的範例,請參閱範例: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:搭配 RDS for 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。
如果您的資料庫執行個體是私有的,請檢查 VPC 的私有 DNS 設定。請確定您將
rds.custom_dns_resolution
參數設定 AWS PrivateLink 為 1,並按照中所述的方式進行設定步驟 1:為輸出連 stgreSQL 資料庫執行個體AWS Lambda。如需詳細資訊,請參閱介面 VPC 端點 (AWS PrivateLink)。 缺乏叫用 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 應用程式中的錯誤。