You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Lambda更新Aurora PostgreSQL数据库用户凭据

Aurora PostgreSQL 密码轮换:Lambda实现数据库端密码更新

核心流程

要完成完整的凭据轮换,Lambda需要执行以下步骤:

  • 从Secrets Manager获取当前的数据库凭据(旧密码)
  • 用旧凭据连接Aurora PostgreSQL,执行密码更新语句
  • 将新密码同步回Secrets Manager

Python代码实现

import boto3
import json
import psycopg2
from botocore.exceptions import ClientError

def generate_new_password():
    """调用Secrets Manager生成符合要求的随机密码"""
    secrets_client = boto3.client('secretsmanager')
    try:
        response = secrets_client.get_random_password(
            PasswordLength=16,
            ExcludeCharacters='/"\'\\',
            IncludeSpace=False,
            RequireEachIncludedType=True
        )
        return response['RandomPassword']
    except ClientError as e:
        raise e

def lambda_handler(event, context):
    secret_arn = event['SecretId']
    secrets_client = boto3.client('secretsmanager')

    # 1. 获取当前Secret中的数据库凭据
    try:
        get_secret_response = secrets_client.get_secret_value(SecretId=secret_arn)
        secret_data = json.loads(get_secret_response['SecretString'])
    except ClientError as e:
        raise e

    # 2. 生成新密码
    new_password = generate_new_password()

    # 3. 连接数据库并更新用户密码
    db_conn = None
    try:
        db_conn = psycopg2.connect(
            host=secret_data['host'],
            port=secret_data['port'],
            user=secret_data['username'],
            password=secret_data['password'],
            dbname='postgres'  # 使用默认postgres库连接,可根据实际调整
        )
        db_conn.autocommit = True  # 自动提交事务,避免手动commit
        cursor = db_conn.cursor()
        
        # 参数化执行ALTER USER,防止SQL注入
        cursor.execute(
            "ALTER USER %s WITH PASSWORD %s",
            (secret_data['username'], new_password)
        )
        
        cursor.close()
    except psycopg2.Error as e:
        # 数据库操作失败,抛出异常触发Secrets Manager重试
        raise Exception(f"数据库密码更新失败: {str(e)}")
    finally:
        if db_conn:
            db_conn.close()

    # 4. 将新密码同步回Secrets Manager
    secret_data['password'] = new_password
    try:
        secrets_client.put_secret_value(
            SecretId=secret_arn,
            SecretString=json.dumps(secret_data)
        )
    except ClientError as e:
        raise e

    return "凭据轮换完成"

关键注意事项

  • Lambda网络配置:必须将Lambda部署到能访问Aurora PostgreSQL的VPC中,同时数据库安全组要开放Lambda所在子网的IP访问5432端口。
  • 依赖处理:Lambda默认没有psycopg2库,需要创建包含psycopg2-binary的Lambda层,或者使用Lambda容器镜像打包依赖。
  • 权限配置:Lambda执行角色需要以下权限:
    • secretsmanager:GetSecretValue:读取当前凭据
    • secretsmanager:PutSecretValue:更新凭据
    • secretsmanager:GetRandomPassword:生成新密码(如果用上述生成逻辑)
  • 异常处理:任何步骤失败都要抛出异常,Secrets Manager会自动重试轮换流程;如果忽略异常,会导致Secret和数据库密码不一致。

内容的提问来源于stack exchange,提问作者Kashiiif3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:52:44