Amazon Aurora Serverless 提供了彈性的資料函式庫容量管理方案,讓開發者可以根據應用程式需求自動調整資源。透過 AWS CLI 可以輕鬆建立和管理 Aurora Serverless PostgreSQL 叢集,並設定自動擴充套件引數以最佳化成本效益。建立叢集後,可以使用 psql 工具連線到資料函式庫,並執行 SQL 指令。為了提升安全性,建議使用 IAM 驗證取代傳統密碼驗證,避免密碼外洩風險。此外,在無伺服器架構中,RDS Proxy 可有效管理 Lambda 函式與 RDS 的連線,藉由建立連線池來降低連線負擔並提升效能。

使用 Amazon Aurora Serverless PostgreSQL 資料函式庫的自動擴充套件與連線

Amazon Aurora Serverless 是一種完全託管的資料函式庫服務,能夠根據應用程式的需求自動擴充套件或縮減容量。透過使用 Aurora Serverless,您可以建立一個 PostgreSQL 相容的資料函式庫叢集,並根據需要調整其容量。

建立 Aurora Serverless PostgreSQL 資料函式庫叢集

首先,您需要建立一個 Aurora Serverless PostgreSQL 資料函式庫叢集。您可以使用 AWS CLI 來完成此操作:

aws rds create-db-cluster \
--db-cluster-identifier awscookbook401dbcluster \
--engine aurora-postgresql \
--engine-mode serverless \
--master-username dbadmin \
--master-user-password $ADMIN_PASSWORD \
--scaling-configuration MinCapacity=2,MaxCapacity=16,AutoPause=true,SecondsUntilAutoPause=300

內容解密:

  • create-db-cluster:用於建立新的資料函式庫叢集。
  • --db-cluster-identifier:指定資料函式庫叢集的唯一識別符。
  • --engine:指定資料函式庫引擎為 aurora-postgresql,表示使用 PostgreSQL 相容的 Aurora 資料函式庫。
  • --engine-mode serverless:啟用 Serverless 模式,使資料函式庫能夠根據需求自動擴充套件。
  • --master-username--master-user-password:設定資料函式倉管理員的使用者名稱和密碼。
  • --scaling-configuration:定義自動擴充套件的組態,包括最小和最大容量、是否自動暫停以及暫停前的閒置時間(以秒為單位)。

連線到資料函式庫叢集

建立資料函式庫叢集後,您需要連線到該叢集。首先,檢索資料函式庫叢集的端點:

aws rds describe-db-clusters \
--db-cluster-identifier awscookbook401dbcluster \
--output text --query DBClusters[0].Endpoint

內容解密:

  • describe-db-clusters:用於檢索有關特定資料函式庫叢集的資訊。
  • --db-cluster-identifier:指定要查詢的資料函式庫叢集識別符。
  • --output text --query DBClusters[0].Endpoint:輸出查詢結果中的端點地址。

然後,使用 psql 命令連線到資料函式庫:

psql -h $HOST_NAME -U dbadmin -W -d postgres

內容解密:

  • psql:PostgreSQL 的互動式客戶端工具。
  • -h $HOST_NAME:指定要連線的主機名稱,即之前檢索到的端點地址。
  • -U dbadmin:指定要使用的資料函式庫使用者名稱。
  • -W:提示輸入密碼。
  • -d postgres:指定要連線的資料函式庫名稱。

自動擴充套件與成本效益

Aurora Serverless 的一大優點是其自動擴充套件能力。當資料函式庫閒置時,它會自動縮減容量以節省成本。當有新的連線請求時,它會自動擴充套件以滿足需求。

圖表說明:Aurora Serverless 自動擴充套件流程

此圖示說明瞭 Aurora Serverless 的自動擴充套件流程。當資料函式庫閒置時,它會自動暫停並縮減容量。當有新的連線請求時,它會自動擴充套件至最小容量,並根據負載變化繼續調整。

使用 IAM 驗證連線 RDS 資料函式庫

實作 IAM 驗證的 RDS 連線

AWS 提供了一種更安全的方式來連線 RDS 資料函式庫,即使用 IAM 驗證取代傳統的密碼驗證。這種方法可以提高資料函式庫的安全性,並且避免了密碼輪換的麻煩。

步驟1:檢查支援的資料函式庫引擎

首先,需要確認所使用的資料函式庫引擎是否支援 IAM 驗證。AWS 官方檔案列出了支援 IAM 驗證的資料函式庫引擎,請參考相關檔案進行確認。

步驟2:取得 RDS 資料函式庫例項資源 ID

DB_RESOURCE_ID=$(aws rds describe-db-instances \
--query 'DBInstances[?DBName==`AWSCookbookRecipe402`].DbiResourceId' \
--output text)

步驟3:建立 IAM 策略檔案

建立一個名為 policy.json 的檔案,內容如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:AWS_REGION:AWS_ACCOUNT_ID:dbuser:DBResourceId/db_user"
            ]
        }
    ]
}

內容解密:

  • "Version" 指定了策略的版本。
  • "Statement" 定義了策略的主要內容。
  • "Effect": "Allow" 表示允許執行指定的動作。
  • "Action": ["rds-db:connect"] 指定了允許的操作是連線 RDS 資料函式庫。
  • "Resource" 指定了允許操作的資源,需替換成實際的資源 ID 和使用者名稱。

步驟4:替換策略檔案中的變數

sed -e "s/AWS_ACCOUNT_ID/${AWS_ACCOUNT_ID}/g" \
-e "s|AWS_REGION|${AWS_REGION}|g" \
-e "s|DBResourceId|${DB_RESOURCE_ID}|g" \
policy-template.json > policy.json

內容解密:

  • 使用 sed 命令替換 policy-template.json 檔案中的變數。
  • ${AWS_ACCOUNT_ID}${AWS_REGION}${DB_RESOURCE_ID} 需要替換成實際的值。

步驟5:建立 IAM 策略

aws iam create-policy --policy-name AWSCookbook402EC2RDSPolicy \
--policy-document file://policy.json

內容解密:

  • 建立一個名為 AWSCookbook402EC2RDSPolicy 的 IAM 策略。
  • --policy-document 指定了策略檔案的路徑。

連線 RDS 資料函式庫並進行驗證

  1. 連線 EC2 例項:使用 SSM Session Manager 連線 EC2 例項。
  2. 安裝 MySQL:在 EC2 例項上安裝 MySQL。
  3. 連線 RDS 資料函式庫:使用 MySQL 命令連線 RDS 資料函式庫。
  4. 建立新資料函式庫使用者:建立一個新的資料函式庫使用者並授權。
  5. 生成 RDS 驗證 Token:使用 AWS CLI 生成 RDS 驗證 Token。
  6. 使用 Token 連線資料函式庫:使用生成的 Token 連線 RDS 資料函式庫。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Aurora Serverless PostgreSQL 自動擴充套件與連線

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

此圖示展示了使用 IAM 驗證連線 RDS 資料函式庫的主要步驟。

使用 RDS Proxy 最佳化 Lambda 連線資料函式庫的效能

在無伺服器架構中,資料函式庫連線管理是一項重要的挑戰。AWS RDS Proxy 提供了一種高效的方式來管理和共用資料函式庫連線,從而提高應用程式的效能和可擴充套件性。

挑戰:Lambda 連線 RDS 資料函式庫的效能問題

當 Lambda 函式需要頻繁地連線和斷開與 RDS 資料函式庫的連線時,可能會導致資料函式庫連線數過多,進而影響效能。為瞭解決這個問題,我們可以使用 RDS Proxy 來建立一個連線池,從而減少資料函式庫連線數並提高效能。

解決方案:使用 RDS Proxy 建立連線池

步驟 1:建立 RDS Proxy

首先,我們需要建立一個 RDS Proxy,並將其與 RDS MySQL 資料函式庫關聯起來。以下是建立 RDS Proxy 的命令:

RDS_PROXY_ENDPOINT_ARN=$(aws rds create-db-proxy \
--db-proxy-name $DB_NAME \
--engine-family MYSQL \
--auth '{
"AuthScheme": "SECRETS",
"SecretArn": "'"$RDS_SECRET_ARN"'",
"IAMAuth": "REQUIRED"
}' \
--role-arn arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbook403RDSProxy \
--vpc-subnet-ids $ISOLATED_SUBNETS \
--vpc-security-group-ids $RDS_PROXY_SG_ID \
--require-tls --output text \
--query DBProxy.DBProxyArn)

步驟 2:設定 Lambda 函式使用 RDS Proxy

接下來,我們需要設定 Lambda 函式使用 RDS Proxy,而不是直接連線 RDS 資料函式庫。以下是設定 Lambda 函式的步驟:

  1. 建立一個 IAM policy,允許 Lambda 函式生成 IAM 認證 token。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:AWS_REGION:AWS_ACCOUNT_ID:dbuser:RDSProxyID/admin"
]
}
]
}
  1. 將 IAM policy 附加到 Lambda 函式的角色上。
aws iam attach-role-policy --role-name $DB_APP_FUNCTION_ROLE_NAME \
--policy-arn arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSCookbook403RdsIamPolicy
  1. 更新 Lambda 函式的程式碼,以使用 RDS Proxy 的端點連線資料函式庫。

程式碼範例

以下是使用 RDS Proxy 連線 MySQL 資料函式庫的 Python 程式碼範例:

import mysql.connector

# RDS Proxy 端點
rds_proxy_endpoint = 'your-rds-proxy-endpoint.rds.amazonaws.com'

# 資料函式庫連線引數
username = 'your-username'
password = 'your-password'
database = 'your-database'

# 建立資料函式庫連線
cnx = mysql.connector.connect(
    user=username,
    password=password,
    host=rds_proxy_endpoint,
    database=database,
    ssl_ca='path/to/rds-ca-2019-root.pem'
)

# 執行查詢
cursor = cnx.cursor()
query = 'SELECT * FROM your-table'
cursor.execute(query)

# 處理查詢結果
for row in cursor:
    print(row)

# 關閉資料函式庫連線
cursor.close()
cnx.close()

內容解密:

  1. RDS Proxy 端點:使用 RDS Proxy 的端點連線資料函式庫,而不是直接連線 RDS 資料函式庫。
  2. 資料函式庫連線引數:設定資料函式庫連線引數,包括使用者名稱、密碼、資料函式庫名稱等。
  3. 建立資料函式庫連線:使用 mysql.connector 函式庫建立資料函式庫連線,並指定 RDS Proxy 端點和 SSL/TLS 設定。
  4. 執行查詢:執行 SQL 查詢,並處理查詢結果。
  5. 關閉資料函式庫連線:關閉資料函式庫連線,釋放資源。

使用 RDS Proxy 最佳化 Lambda 連線 RDS 的資料函式庫連線管理

在無伺服器架構中,AWS Lambda 經常需要與 Amazon RDS 資料函式庫進行互動。然而,當 Lambda 函式的平行執行數量增加時,直接連線到 RDS 可能會導致資料函式庫連線數過多,進而影響效能。為瞭解決這個問題,AWS 提供了 RDS Proxy,一種完全託管的資料函式庫代理服務,能夠有效地管理資料函式庫連線池,從而提高應用程式的效能和可擴充套件性。

步驟一:建立 RDS Proxy

首先,我們需要建立一個 RDS Proxy。RDS Proxy 可以與現有的 RDS 資料函式庫例項進行整合,並提供一個統一的連線端點給應用程式使用。

aws rds create-db-proxy \
  --db-proxy-name $DB_NAME \
  --engine-family MYSQL \
  --auth AuthScheme="SECRETS",SecretArn="$SECRET_ARN",IAMAuth="DISABLED" \
  --role-arn $RDS_PROXY_ROLE

內容解密:

  • create-db-proxy 命令用於建立一個新的 RDS Proxy。
  • --db-proxy-name 指定了 RDS Proxy 的名稱。
  • --engine-family 指定了資料函式庫引擎家族,這裡使用的是 MySQL。
  • --auth 設定了驗證方式,使用了 Secrets Manager 中的秘密來進行驗證。
  • --role-arn 指定了 RDS Proxy 所需的 IAM 角色。

步驟二:設定安全群組

為了允許 Lambda 函式透過 RDS Proxy 連線到 RDS 資料函式庫,需要在安全群組中新增相應的入站規則。

aws ec2 authorize-security-group-ingress \
  --protocol tcp --port 3306 \
  --source-group $DB_APP_FUNCTION_SG_ID \
  --group-id $RDS_PROXY_SG_ID

內容解密:

  • authorize-security-group-ingress 命令用於新增安全群組的入站規則。
  • --protocol tcp --port 3306 指定了允許 TCP 協定透過 3306 埠的流量。
  • --source-group 指定了允許存取的安全群組 ID,這裡是 Lambda 函式的安全群組。
  • --group-id 指定了需要修改的安全群組 ID,這裡是 RDS Proxy 的安全群組。

步驟三:註冊目標並更新 Lambda 函式組態

接下來,需要將 RDS 資料函式庫例項註冊為 RDS Proxy 的目標,並更新 Lambda 函式的組態,使其透過 RDS Proxy 連線到資料函式庫。

aws rds register-db-proxy-targets \
  --db-proxy-name $DB_NAME \
  --db-instance-identifiers $RDS_DATABASE_ID

aws lambda update-function-configuration \
  --function-name $DB_APP_FUNCTION_NAME \
  --environment Variables={DB_HOST=$RDS_PROXY_ENDPOINT}

內容解密:

  • register-db-proxy-targets 命令用於將指定的 RDS 資料函式庫例項註冊為 RDS Proxy 的目標。
  • update-function-configuration 命令用於更新 Lambda 函式的組態,將 DB_HOST 環境變數設定為 RDS Proxy 的端點。