如何通过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
相关产品推荐
相关产品推荐

