教學課程:使用 Lambda 函數來存取 Amazon RDS 資料庫 - Amazon Relational Database Service

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

教學課程:使用 Lambda 函數來存取 Amazon RDS 資料庫

在本教學課程中,您會透過 RDS Proxy 使用 Lambda 函數將資料寫入 Amazon Relational Database Service (Amazon RDS) 資料庫。每當有訊息新增,您的 Lambda 函數就會從 Amazon Simple Queue Service (Amazon SQS) 佇列中讀取記錄,然後將新項目寫入資料庫中的資料表。在此範例中,您可以使用 AWS Management Console 手動將訊息新增至佇列。下圖顯示您用來完成自學課程的 AWS 資源。

AWS Management Console 連線至 Amazon SQS 標準佇列的執行個體,該佇列會連線至 Lambda 函數,該函數會透過 RDS 代理伺服器進一步連線至適用於 MySQL 的 RDS 資料庫。

透過 Amazon RDS,您可以使用常見的資料庫產品 (如 Microsoft SQL Server、MariaDB、MySQL、Oracle 資料庫和 PostgreSQL) 在雲端中執行受管關聯式資料庫。透過使用 Lambda 存取您的資料庫,您可以讀取和寫入資料以回應事件,例如在您網站上註冊的新客戶。您的函數、資料庫執行個體和代理也會自動擴展,以滿足高需求的期間。

請完成下列任務以完成本教學課程:

  1. 在您 AWS 帳戶的預設虛擬私人雲端中啟動適用於 MySQL 的 RDS 資料庫執行個體和代理伺服器。

  2. 建立並測試 Lambda 函數,用於在資料庫中建立新資料表並將資料寫入。

  3. 建立 Amazon SQS 佇列並將其設定為在新增訊息時調用 Lambda 函數。

  4. 使用 [記錄] 將訊息新增至佇列, AWS Management Console 並使用 CloudWatch 記錄監視結果,以測試完整的設定。

完成這些步驟的過程中,您將了解:

  • 如何使用 Amazon RDS 建立資料庫執行個體和代理,以及將 Lambda 函數連線至代理。

  • 如何使用 Lambda 在 Amazon RDS 資料庫上執行建立和讀取操作。

  • 如何使用 Amazon SQS 調用 Lambda 函數。

您可以使用 AWS Management Console 或 AWS Command Line Interface (AWS CLI) 來完成本自學課程。

必要條件

在開始之前,請先完成下節所含步驟:

建立 Amazon RDS 資料庫執行個體

教學課程工作流程圖顯示您正在進行建立資料庫步驟。

Amazon RDS 資料庫執行個體是在 AWS 雲端中執行的隔離資料庫環境。執行個體可以包含一或多個使用者建立的資料庫。除非另有指定,否則 Amazon RDS 會 VPC 您 AWS 帳戶的. 如需 Amazon VPC 的詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》

在本教學課程中,您 AWS 帳戶會在預設 VPC 中建立新執行個體,並建立ExampleDB在該執行個體中命名的資料庫。您可以使用 AWS Management Console 或建立資料庫執行個體和資料庫 AWS CLI。

建立資料庫執行個體
  1. 開啟 Amazon RDS 主控台並選擇建立資料庫

  2. 保持選取標準建立選項,然後在引擎選項中選擇MySQL

  3. 範本 區段中,選擇 免費方案

  4. 設定 中,在 資料庫執行個體識別符 輸入 MySQLForLambda

  5. 執行以下操作以設定您的使用者名稱和密碼:

    1. 憑證設定中,將主要使用者名稱設為 admin

    2. 主要密碼輸入並確認用於存取資料庫的密碼。

  6. 執行下列操作以指定資料庫名稱:

    • 保持選取所有剩餘的預設選項,並向下捲動至其他組態部分。

    • 展開此區段並在初始資料庫名稱輸入 ExampleDB

  7. 保持選取所有剩餘的預設選項,然後選擇建立資料庫

建立 Lambda 函數和代理

教學課程工作流程圖顯示您正在進行建立執行角色的 Lambda 函數步驟。

您可以使用 RDS 主控台在與資料庫相同的 VPC 中建立 Lambda 函數和代理。

注意

只有當資料庫已完成建立並處於可用狀態時,才能建立這些關聯的資源。

建立關聯的函數和代理
  1. 資料庫頁面中,檢查您的資料庫是否處於可用狀態。若是,則請繼續下一個步驟。否則,請等待您的資料庫直到為可用狀態。

  2. 選取您的資料庫並從動作選擇設定 Lambda 連線

  3. 設定 Lambda 連線頁面上,選擇建立新函數

    新的 Lambda 函數名稱設定為 LambdaFunctionWithRDS

  4. RDS Proxy 區段中,選取使用 RDS Proxy 連線選項。進一步選擇建立新的代理

    • 針對資料庫憑證,選擇資料庫使用者名稱和密碼

    • 針對使用者名稱,指定 admin

    • 針對密碼,輸入資料庫執行個體的密碼。

  5. 選取設定以完成代理和 Lambda 函數的建立。

精靈會完成設定,並提供 Lambda 主控台的連結,以檢閱您的新功能。切換至 Lambda 主控台之前,請注意代理端點。

建立函數執行角色

教學課程工作流程圖顯示您正在進行建立執行角色的 Lambda 函數步驟。

建立 Lambda 函數之前須先建立執行角色,為函數提供必要的許可。在本教學課程中,Lambda 需要許可,才能管理與包含資料庫執行個體之 VPC 的網路連線,以及輪詢來自 Amazon SQS 佇列的訊息。

為了提供 Lambda 函數所需的許可,本教學課程使用 IAM 受管政策。這些政策會授予適用於許多常見使用案例的許可,並可在您的 AWS 帳戶中取用。如需使用受管政策的詳細資訊,請參閱:政策最佳實務

建立 Lambda 執行角色
  1. 開啟 IAM 主控台的角色頁面,然後選擇 建立角色

  2. 信任的實體類型請選擇 AWS 服務,而針對使用案例,請選擇 Lambda

  3. 選擇 下一步

  4. 執行下列操作以新增 IAM 受管政策:

    1. 使用政策搜尋方塊,搜尋 AWSLambdaSQSQueueExecutionRole

    2. 在結果清單中,選取角色旁的核取方塊,然後選擇清除篩選條件

    3. 使用政策搜尋方塊,搜尋 AWSLambdaVPCAccessExecutionRole

    4. 在結果清單中,選取角色旁的核取方塊,然後選擇下一步

  5. 角色名稱 輸入 lambda-vpc-sqs-role,然後選擇 建立角色

在教學課程的後續階段中,需用到您剛才建立的執行角色之 Amazon Resource Name (ARN)。

尋找執行角色 ARN 的方式
  1. 開啟 IAM 主控台的角色頁面,然後選擇您的角色 (lambda-vpc-sqs-role)。

  2. 複製 ARN 區段中顯示的摘要

建立 Lambda 部署套件

教學課程工作流程圖顯示您正在進行建立部署套件的 Lambda 函數步驟

下面的示例 Python 代碼使用 PyMySQL 包打開到數據庫的連接。您第一次調用函數時,它還會建立一個名為 Customer 的新資料表。該資料表使用以下結構描述,其中 CustID 是主索引鍵:

Customer(CustID, Name)

該函數還使用 PyMy SQL 將記錄添加到此表中。函數會使用您要新增至 Amazon SQS 佇列的訊息中指定的客戶 ID 和名稱以新增記錄。

程式碼會在處理常式函數之外建立與資料庫的連線。在初始化程式碼中建立連線,允許後續的函數調用重複使用連線並提高效能。在生產應用程式中,您也可以使用佈建並行初始化請求的資料庫連線數目。只要函數調用後就可以使用這些連線。

import sys import logging import pymysql import json import os # rds settings user_name = os.environ['USER_NAME'] password = os.environ['PASSWORD'] rds_proxy_host = os.environ['RDS_PROXY_HOST'] db_name = os.environ['DB_NAME'] logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_proxy_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit(1) logger.info("SUCCESS: Connection to RDS for MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values(%s, %s)" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string, (CustID, Name)) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS for MySQL table" %(item_count)
注意

在此範例中,您的資料庫存取憑證會儲存為環境變數。在生產應用程式中,我們建議您將 AWS Secrets Manager 用作更安全的選項。請注意,如果您的 Lambda 函數在 VPC 中,若要連線到 Secrets Manager,您需要建立 VPC 端點。請參閱 How to connect to Secrets Manager service within a Virtual Private Cloud,以了解更多內容。

若要在函數程式碼中包含 PyMy SQL 相依性,請建立 .zip 部署套件。下列指令適用於 Linux、macOS 或 Unix:

建立 .zip 部署套件的方式
  1. 將程式碼範例儲存為名為 lambda_function.py 的檔案。

  2. 在您建立lambda_function.py檔案的相同目錄中,建立名為的新目錄package並安裝 PyMy SQL 程式庫。

    mkdir package pip install --target package pymysql
  3. 創建一個包含您的應用程序代碼和 PyMy SQL 庫的 zip 文件。在 Linux 或 MacOS 中,執行下列 CLI 命令。在 Windows 中,使用您偏好的 zip 工具建立 lambda_function.zip 檔案。您的 lambda_function.py 原始程式碼檔案和包含相依項的資料夾必須安裝在 .zip 檔案的根目錄中。

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    您也可以使用 Python 虛擬環境建立部署套件。請參閱使用 .zip 封存檔部署 Python Lambda 函數

更新 Lambda 函數

現在您可以使用剛才建立的 .zip 套件,使用 Lambda 主控台更新 Lambda 函數。若要讓函數存取資料庫,還需要使用存取憑證來設定環境變數。

更新 Lambda 函數
  1. 開啟 Lambda 主控台的函數頁面,然後選擇您的函數 LambdaFunctionWithRDS

  2. 在 [執行階段設定] 索引標籤中,選取 [編輯],將函數的執行階段變更為 Python 3.10

  3. 處理器變更為 lambda_function.lambda_handler

  4. 程式碼標籤中,選擇上傳來源,然後選擇 .zip 檔案

  5. 選取您在上一個階段建立的 lambda_function.zip 檔案,然後選擇儲存

現在,請使用您先前建立的執行角色設定函數。這會授予函數存取資料庫執行個體和輪詢 Amazon SQS 佇列所需的許可。

函數的執行角色。
  1. 在 Lambda 主控台的函數頁面中,選取組態索引標籤,然後選擇許可

  2. 執行角色中,選擇編輯

  3. 現有角色中,選擇您的執行角色 (lambda-vpc-sqs-role)。

  4. 選擇儲存

設定函數的環境變數
  1. 在 Lambda 主控台的函數頁面中,選取組態索引標籤,然後選擇環境變數

  2. 選擇編輯

  3. 若要新增資料庫存取憑證,請執行下列動作:

    1. 選擇新增環境變數,然後針對索引鍵輸入 USER_NAME,針對輸入 admin

    2. 選擇新增環境變數,然後針對索引鍵輸入 DB_NAME,針對輸入 ExampleDB

    3. 選擇新增環境變數,然後針對索引鍵輸入 PASSWORD,針對輸入您在建立資料庫時選擇的密碼。

    4. 選擇新增環境變數,然後針對索引鍵輸入 RDS_PROXY_HOST,針對輸入您先前備註的 RDS Proxy 端點。

    5. 選擇儲存

在主控台中測試您的 Lambda 函數

教學課程工作流程圖顯示您正在進行測試函數的 Lambda 函數步驟

您現在可使用 Lambda 主控台來測試您的函數。請建立一個測試事件,該事件會模擬您在教學課程的最後階段中,使用 Amazon SQS 調用函數時會接收到的資料。測試事件會包含一個 JSON 物件,指定要新增到函數所建立 Customer 資料表中的客戶 ID 和客戶名稱。

測試 Lambda 函數
  1. 開啟 Lambda 主控台的函數頁面,然後選擇您的函數。

  2. 選擇測試區段。

  3. 選擇建立新活動並輸入 myTestEvent 對於事件的名稱。

  4. 將下列程式碼複製到事件 JSON 中,然後選擇儲存

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
  5. 選擇 測試

執行結果索引標籤中,您應該會看到類似函數日誌中顯示的結果:

[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')

建立 Amazon SQS 佇列

教學課程工作流程圖顯示您正在進行建立佇列的訊息佇列步驟。

您已成功測試 Lambda 函數和 Amazon RDS 資料庫執行個體的整合。現在請建立 Amazon SQS 佇列,用於在教學課程的最後階段調用您的 Lambda 函數。

建立 Amazon SQS 佇列的方式 (主控台)
  1. 開啟 Amazon SQS 主控台的佇列頁面,然後選取建立佇列

  2. 類型保留為標準,然後在佇列名稱輸入 LambdaRDSQueue

  3. 保持選取所有預設選項,然後選擇建立佇列

建立事件來源映射以調用 Lambda 函數

教學課程工作流程圖顯示您正在進行建立事件來源映射的訊息佇列步驟。

事件來源映射是一種 Lambda 資源,它可從串流或佇列中讀取項目並調用 Lambda 函數。設定事件來源映射時,您可以指定批次大小,以便將串流或佇列中的記錄批次處理成單一承載。在此範例中,您將批次大小設定為 1,以便在每次傳送訊息到佇列時都調用 Lambda 函數。您可以使用 AWS CLI 或 Lambda 主控台來設定事件來源對應。

建立事件來源映射的方式 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇您的函數 (LambdaFunctionWithRDS)。

  2. 函數概觀區段中,選擇新增觸發條件

  3. 來源請選取 Amazon SQS,然後選取佇列的名稱 (LambdaRDSQueue)。

  4. 批次大小請輸入 1

  5. 將所有其他選項設定保留為預設值,然後選擇新增

您現在可以透過將訊息新增至 Amazon SQS 佇列以測試完整的設定。

測試和監控設定

教學課程工作流程圖顯示您正在進行測試和監控步驟。

若要測試完整的設定,請使用主控台將訊息新增至 Amazon SQS 佇列。然後,您可以使用記 CloudWatch 錄來確認 Lambda 函數正如預期將記錄寫入資料庫。

測試和監控設定的方式
  1. 開啟 Amazon SQS 主控台的佇列頁面,然後選取您的佇列 (LambdaRDSQueue)。

  2. 選擇傳送和接收訊息,然後將以下 JSON 貼到傳送訊息區段裡的訊息內文中。

    { "CustID": 1054, "Name": "Richard Roe" }
  3. 選擇 傳送訊息

    將訊息傳送至佇列會導致 Lambda 透過事件來源映射調用您的函數。若要確認 Lambda 已如預期般叫用您的函數,請使用 CloudWatch 記錄來確認函數是否已將客戶名稱和 ID 寫入您的資料庫資料表。

  4. 開啟主 CloudWatch 控台的 [記錄群組] 頁面,然後選取函數的記錄群組 (/aws/lambda/LambdaFunctionWithRDS)。

  5. 日誌串流區段中,選擇最新的日誌串流。

    您的資料表應該會包含兩個客戶記錄,分別來自您的函數的每次調用。在日誌串流中,您應該會看到類似以下的訊息:

    [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')

清除您的資源

除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。刪除不再使用的 AWS 資源,即可避免 AWS 帳戶產生不必要的費用。

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作)、Delete (刪除)。

  4. 選擇 Delete (刪除)。

若要刪除執行角色
  1. 開啟 IAM 主控台中的 角色頁面

  2. 選取您建立的執行角色。

  3. 選擇 Delete role (刪除角色)。

  4. 選擇 Yes, delete (是,刪除)

刪除 MySQL 資料庫執行個體
  1. 在 Amazon RDS 主控台開啟 Databases (資料庫) 頁面

  2. 選取您建立的資料庫。

  3. 選擇 動作刪除

  4. 取消勾選 建立最終快照 核取方塊。

  5. 在文字方塊中輸入 delete me

  6. 選擇 刪除

刪除 Amazon SQS 佇列
  1. 登入 AWS Management Console 並開啟 Amazon SQS 主控台,網址為 https://console.aws.amazon.com/sqs/

  2. 選取您建立的佇列。

  3. 選擇 刪除

  4. 在文字方塊中輸入 delete

  5. 選擇 刪除