從 叫用 AWS Lambda 函數 - Amazon Relational Database Service

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

從 叫用 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

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 執行個體
  1. 使用建立政策 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 政策

  2. 使用建立角色 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" } ] }'
  3. 使用attach-role-policy 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
  4. 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 \ --region aws-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 資料庫執行個體

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

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. 安裝 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 函數。


            中顯示的 AWS CLI 範例 Lambda 函數 AWS Lambda
叫用範例函數
  1. 使用 psql 或 pgAdmin 連線至資料庫執行個體。

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. 使用函數的 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 函數的許可權限
  1. 使用 psql 或 pgAdmin 連線至資料庫執行個體。

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. 執行下列 SQL 命令:

    postgres=> GRANT USAGE ON SCHEMA aws_lambda TO db_username; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TO db_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 編碼字串。您可以使用 decodeconvert_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 應用程式中的錯誤。