本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從 叫用 AWS Lambda 函數RDS for PostgreSQL 資料庫執行個體
AWS Lambda 是一種事件驅動的運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。它可與許多 AWS 服務搭配使用,包括 RDS for PostgreSQL。例如,您可以使用 Lambda 函數處理來自資料庫的事件通知,或在新檔案上傳到 Simple Storage Service (Amazon S3) 時從檔案中載入資料。若要進一步了解 Lambda,請參閱《 開發人員指南》中的什麼是 AWS Lambda?。 AWS Lambda
注意
這些 RDS for PostgreSQL 版本支援叫用 AWS Lambda 函數:
所有 PostgreSQL 17 版本
所有 PostgreSQL 16 版本
所有 PostgreSQL 15 版本
PostgreSQL 14.1 版和更高次要版本
-
PostgreSQL 13.2 版和更新次要版本
-
PostgreSQL 12.6 版和更新次要版本
設定 RDS for PostgreSQL 使用 Lambda 函數是一個多步驟程序 AWS Lambda,涉及 IAM、VPC 和 RDS for PostgreSQL 資料庫執行個體。以下提供必要步驟的摘要。
如需有關 Lambda 函數的詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的 Lambda 入門和 AWS Lambda 函數。
主題
步驟 1:設定 RDS for PostgreSQL 資料庫執行個體的傳出連線 AWS Lambda
Lambda 函數一律會在 AWS Lambda 服務擁有的 Amazon VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC,並自動維護和監控 VPC。您的 RDS for PostgreSQL 資料庫執行個體會將網路流量傳送到 Lambda 服務的 VPC。具體設定取決於 資料庫執行個體是公有的或私有。
公有 RDS for PostgreSQL 資料庫執行個體 – 如果執行個體位於公有子網路中,且執行個體的「PubliclyAccessible able」屬性為
true
,則資料庫執行個體為公有的。若要尋找此屬性的值,您可以使用 describe-db-instances AWS CLI 命令。或者可以使用 AWS Management Console 開啟 Connectivity & security (連線與安全性) 索引標籤,檢查 Publicly accessible (可公開存取) 是否為 Yes (是)。若要驗證執行個體是否在您的 VPC 公有子網路中,您可以使用 AWS Management Console 或 AWS CLI。若要設定 Lambda 的存取權,您可以使用 AWS Management Console 或 AWS CLI ,在 VPC 的安全群組上建立傳出規則。傳出規則會指定 TCP 可以使用連接埠 443 將封包傳至任何 IPv4 位址 (0.0.0.0/0)。
私有 RDS for 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:為您的 設定 IAMRDS for PostgreSQL 資料庫執行個體和 AWS Lambda
從 RDS for PostgreSQL 資料庫執行個體叫用 Lambda 函數需要某些權限。若要設定必要的權限,建議您建立允許叫用 Lambda 函數的 IAM 政策,將政策指派給一個角色,然後將該角色套用至資料庫執行個體。此做法會提供資料庫執行個體權限,允許代表您叫用指定的 Lambda 函數。下列步驟說明如何在 AWS CLI中執行此操作。
設定 IAM 許可以搭配 Lambda 使用Amazon RDS 執行個體
使用 create-policy
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 政策。使用 create-role
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
使用 add-role-to-db-instance
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
\ --regionaws-region
完成 VPC 和 IAM 設定後,現在可以安裝 aws_lambda
擴充功能。(請注意,您可以隨時安裝擴充功能,但在設定正確的 VPC 支援和 IAM 權限之前,aws_lambda
擴充功能不會為 RDS for PostgreSQL 資料庫執行個體的功能新增任何項目。)
步驟 3:為 RDS for PostgreSQL 資料庫執行個體安裝 aws_lambda
擴充功能
若要 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 資料庫執行個體。
以具有
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 區域 – (選用) 如果 AWS Lambda 函數與 RDS for PostgreSQL 資料庫執行個體不在同一個區域中,則表示 Lambda 函數所在的區域。
若要保存 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
;