AWS Lambda 與 Amazon RDS 一起使用 - AWS Lambda

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

AWS Lambda 與 Amazon RDS 一起使用

您可以直接或透過 Amazon RDS Proxy 將 Lambda 函數連線到 Amazon Relational Database Service (Amazon RDS)。直接連線適用於簡單的案例,生產環境則建議使用代理。資料庫代理管理許多共用資料庫連線,讓函數在不耗盡資料庫連線的情況下達到高並行層級。

我們建議將 Amazon RDS Proxy 用於 Lambda 函數,這些函數會頻繁進行短資料庫連線,或是開啟和關閉大量資料庫連線。

設定函數

在 Lambda 主控台中,您可以佈建和設定 Amazon RDS 資料庫執行個體和代理資源。如需詳細資訊,請參閱組態索引標籤下的 RDS 資料庫。或者,您也可以在 Amazon RDS 主控台中建立與設定 Lambda 函數的連線。

  • 若要連線到資料庫,您的函數必須位於資料庫執行所在的相同 Amazon VPC 內。

  • 您可以搭配 MySQL、MariaDB、PostgreSQL 或 Microsoft SQL Server 引擎,使用 Amazon RDS 資料庫。

  • 您也可以搭配 MySQL 或 PostgreSQL 引擎,使用 Aurora DB 叢集。

  • 您需要提供 Secrets Manager 秘密以用於資料庫身分驗證。

  • IAM 角色必須提供使用秘密的許可,而受信任的政策必須允許 Amazon RDS 擔任該角色。

  • 使用主控台設定 Amazon RDS 資源並將其連接到您的函數的 IAM 原則必須具有下列許可:

    注意

    只有在將 Amazon RDS 代理設定為管理資料庫連線集區時,才需要 Amazon RDS 代理許可。

    範例 許可政策
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateSecurityGroup", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "ec2:AuthorizeSecurityGroupIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:RevokeSecurityGroupEgress", "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "rds-db:connect", "rds:CreateDBProxy", "rds:CreateDBInstance", "rds:CreateDBSubnetGroup", "rds:DescribeDBClusters", "rds:DescribeDBInstances", "rds:DescribeDBSubnetGroups", "rds:DescribeDBProxies", "rds:DescribeDBProxyTargets", "rds:DescribeDBProxyTargetGroups", "rds:RegisterDBProxyTargets", "rds:ModifyDBInstance", "rds:ModifyDBProxy" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "lambda:CreateFunction", "lambda:ListFunctions", "lambda:UpdateFunctionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:AttachRolePolicy", "iam:AttachPolicy", "iam:CreateRole", "iam:CreatePolicy" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds", "secretsmanager:CreateSecret" ], "Resource": "*" } ] }

Amazon RDS 會按資料庫執行個體大小收取代理程式的小時費率,請參閱 RDS 代理定價以了解詳細資訊。如需代理連線的一般詳細資訊,請參閱《Amazon RDS 使用者指南》中的使用 Amazon RDS Proxy

Lambda 和 Amazon RDS 設定

Lambda 和 Amazon RDS 主控台都將協助您自動設定一些必要的資源,以便在 Lambda 和 Amazon RDS 之間建立連線。

處理來自 Amazon RDS 的事件通知

您可以使用 Lambda 來處理 Amazon RDS 資料庫的事件通知。Amazon RDS 會將通知傳送到 Amazon Simple Notification Service (Amazon SNS) 主題,您可以進行設定,透過該主題叫用 Lambda 函數。Amazon SNS 會將來自 Amazon RDS 的訊息包裝在自己的事件文件中,並將其傳送到函數。

如需設定 Amazon RDS 資料庫以傳送通知的詳細資訊,請參閱使用 Amazon RDS 事件通知

範例 Amazon SNS 事件中的 Amazon RDS 訊息
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:rds-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2023-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "{\"Event Source\":\"db-instance\",\"Event Time\":\"2023-01-02 12:45:06.000\",\"Identifier Link\":\"https://console.aws.amazon.com/rds/home?region=eu-west-1#dbinstance:id=dbinstanceid\",\"Source ID\":\"dbinstanceid\",\"Event ID\":\"http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_Events.html#RDS-EVENT-0002\",\"Event Message\":\"Finished DB Instance backup\"}", "MessageAttributes": {}, "Type": "Notification", "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn":"arn:aws:sns:us-east-2:123456789012:sns-lambda", "Subject": "RDS Notification Message" } } ] }

Lambda 和 Amazon RDS 教學

  • 使用 Lambda 函數來存取 Amazon RDS – 在《Amazon RDS 誰用著指南》中,學習如何使用 Lambda 函數並透過 Amazon RDS Proxy 將資料寫入 Amazon RDS 資料庫。每當新增訊息,您的 Lambda 函數將從 Amazon SQS 佇列中讀取記錄,然後將新項目寫入資料庫中的資料表。