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

求助:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:25:19