求助:使用AWS CDK(Python)在Secrets Manager中读写多键值对
使用AWS CDK(Python)创建含多键值对的Secrets Manager密钥
场景一:固定部分字段+自动生成敏感字段
适合需要手动设置用户名、数据库名这类固定值,同时让CDK自动生成密码这类敏感随机值的场景:
from aws_cdk import ( Stack, aws_secretsmanager as secretsmanager, RemovalPolicy ) from constructs import Construct class SecretDemoStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 创建多键值对密钥 db_creds_secret = secretsmanager.Secret( self, "DatabaseCredentials", secret_name="MyApp/Prod/DbCreds", # 自定义密钥的层级名称 removal_policy=RemovalPolicy.DESTROY, # 测试环境用,生产环境换成RETAIN secret_string_generator=secretsmanager.SecretStringGenerator( # 预先定义固定键值的JSON模板 secret_string_template='{"username": "db_admin", "database": "prod_app_db"}', # 让CDK自动生成随机值的字段,可添加多个 generate_string_key="password", generate_string_key="root_password", password_length=18 # 指定生成密码的长度 ) )
场景二:直接传入完整固定键值对(仅测试用)
如果是测试环境需要固定的多键值密钥,可以直接传入完整的JSON字符串(生产环境绝对不要这么做):
# 创建固定多键值的测试密钥 test_api_secret = secretsmanager.Secret( self, "TestApiSecrets", secret_name="MyApp/Test/ApiKeys", removal_policy=RemovalPolicy.DESTROY, secret_string='{"api_key": "test_abc123", "webhook_url": "https://test.example.com/hook", "timeout": "20"}' )
在CDK中引用密钥的指定字段
如果后续要把密钥里的某个值传给其他资源(比如RDS、Lambda),可以用secret_value_from_json提取指定字段:
# 提取密钥中的password字段 db_password = db_creds_secret.secret_value_from_json("password").to_string() # 示例:将密码传入RDS实例(需提前导入aws_rds模块) # aws_rds.DatabaseInstance( # self, "ProdDB", # credentials=aws_rds.Credentials.from_username("db_admin", password=db_password), # engine=aws_rds.DatabaseInstanceEngine.mysql(version=aws_rds.MysqlEngineVersion.VER_8_0), # instance_type=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.SMALL), # # 其他必填参数... # )
运行时读取完整多键值密钥
在Lambda这类运行时环境中,用boto3读取完整的多键值对:
# Lambda函数示例代码 import boto3 import json def handler(event, context): sm_client = boto3.client("secretsmanager") secret_response = sm_client.get_secret_value(SecretId="MyApp/Prod/DbCreds") secret_data = json.loads(secret_response["SecretString"]) # 取出各个字段 db_user = secret_data["username"] db_pass = secret_data["password"] db_name = secret_data["database"] return { "statusCode": 200, "body": json.dumps(f"Connected to {db_name} as {db_user}") }
关键注意事项
- 生产环境禁止用固定明文的
secret_string,必须用secret_string_generator自动生成敏感值,避免代码泄露密钥。 RemovalPolicy.DESTROY只用于测试,生产环境一定要用RemovalPolicy.RETAIN,防止销毁栈时误删密钥。- 密钥名称用层级结构(如
MyApp/Prod/DbCreds),方便后续做权限管控和分类管理。
内容的提问来源于stack exchange,提问作者yaml learning
相关产品推荐
相关产品推荐

