View a markdown version of this page

從 Aurora PostgreSQL 資料庫叢集 叫用 AWS Lambda 函數 - Amazon Aurora

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

Aurora PostgreSQL 資料庫叢集 叫用 AWS Lambda 函數

AWS Lambda 是一種事件驅動的運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。它可與許多 AWS 服務搭配使用,包括 Aurora PostgreSQL。例如,您可以使用 Lambda 函數處理來自資料庫的事件通知,或在新檔案上傳到 Simple Storage Service (Amazon S3) 時從檔案中載入資料。若要進一步了解 Lambda,請參閱什麼是 AWS Lambda?AWS Lambda 開發人員指南》中的 。

注意

Aurora PostgreSQL 11.9 及更高版本 (包括 Aurora Serverless v2) 支援叫用 AWS Lambda 函數。

設定 Aurora PostgreSQL 以使用 Lambda 函數是涉及 IAM AWS Lambda、VPC 和 Aurora PostgreSQL 資料庫叢集的多步驟程序。以下提供必要步驟的摘要。

如需有關 Lambda 函數的詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的 Lambda 入門AWS Lambda 函數

步驟 1:設定 Aurora PostgreSQL 資料庫叢集 的傳出連線 AWS Lambda

Lambda 函數一律會在 AWS Lambda 服務擁有的 Amazon VPC 內執行。Lambda 會將網路存取和安全性規則套用至此 VPC,並自動維護和監控 VPC。您的 Aurora PostgreSQL 資料庫叢集 會將網路流量傳送到 Lambda 服務的 VPC。具體設定取決於 Aurora 資料庫叢集的主要資料庫執行個體是公有的或私有。

  • 公有 Aurora PostgreSQL 資料庫叢集 – 如果執行個體位於公有子網路中,且執行個體的「PubliclyAccessible able」屬性為 true,則資料庫叢集的主要資料庫執行個體為公有的。若要尋找此屬性的值,您可以使用 describe-db-instances 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 閘道。或者,您可以使用 Lambda 的 VPC 端點來設定 VPC。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 VPC 端點。端點將 Aurora PostgreSQL 資料庫叢集 所發出呼叫的回傳至 Lambda 函數。

您的 VPC 現在可以在網路層級與 AWS Lambda VPC 互動。下一步,您需要使用 IAM 來設定許可。

步驟 2:為您的 Aurora PostgreSQL 資料庫叢集 和 設定 IAM AWS Lambda

Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數需要某些權限。若要設定必要的權限,建議您建立允許叫用 Lambda 函數的 IAM 政策,將政策指派給一個角色,然後將該角色套用至資料庫叢集。此做法會提供資料庫叢集權限,允許代表您叫用指定的 Lambda 函數。下列步驟說明如何在 AWS CLI中執行此操作。

設定 IAM 許可以搭配 Lambda 使用叢集
  1. 使用 create-policy 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 政策

  2. 使用 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" } ] }'
  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. 使用 add-role-to-db-cluster 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擴充功能

若要 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
  2. 安裝 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 區域 – (選用) 如果 AWS Lambda 函數不在與 Aurora 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:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。

步驟 5:從 Aurora PostgreSQL 資料庫叢集叫用 Lambda 函數。

aws_lambda.invoke 函數採同步或異步行為,具體取決於 invocation_type。此參數的兩個替代項目是 RequestResponse (預設值) 和 Event,如下所示:

  • RequestResponse – 此叫用類型為同步。這是在未指定叫用類型的情況下進行呼叫時的預設行為。回應承載包括 aws_lambda.invoke 函數的結果。如果您的工作流程需要接收 Lambda 函數的結果才能繼續執行,請使用此叫用類型。

  • Event – 此叫用類型為非同步。回應不包括含有結果的承載。如果您的工作流程不需要 Lambda 函數的結果即可繼續執行,請使用此叫用類型。

如要簡單測試您的設定,可以使用 psql 連線至資料庫執行個體,並從命令列叫用範例函數。假設您在 Lambda 服務上設定了一個基本函數,例如下方螢幕擷取畫面中顯示的簡單 Python 函數。

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

    psql -h cluster.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 cluster.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;