Python如何将DynamoDB存储的SSM参数串转为boto3要求的字典格式
实现方案
可以实现,以下是两种成熟的可行方案,优先选择安全度更高的第一种:
方案1:占位符替换+安全字典解析(生产环境推荐,无代码注入风险)
- 第一步:从DynamoDB中取出
parameters_name对应的字符串模板,同时从触发事件中获取所有Variable变量的实际字符串值 - 第二步:遍历替换字符串模板中的所有Variable占位符为实际值
- 第三步:使用
ast.literal_eval方法安全将字符串转换为符合要求的字典格式,示例代码如下:
import ast import boto3 # 从DynamoDB查询返回结果中取参数字符串模板 param_template_str = dynamodb_query_result['parameters_name']['S'] # 从Lambda触发事件中取所有变量的实际值 event_variable_map = { "Variable1": "从事件获取的实际值1", "Variable2": "从事件获取的实际值2", "Variable3": "从事件获取的实际值3", "Variable4": "从事件获取的实际值4" } # 替换所有占位符,注意字符串值需要包裹单引号符合Python语法 for var_name, actual_val in event_variable_map.items(): param_template_str = param_template_str.replace(var_name, f"'{actual_val}'") # 字符串外层补{}转完整字典结构,用ast.literal_eval安全解析,不会执行任意代码 ssm_parameters = ast.literal_eval(f"{{{param_template_str}}}") # 调用SSM启动自动化执行接口 ssm_client = boto3.client('ssm') response = ssm_client.start_automation_execution( DocumentName=dynamodb_query_result['document_name']['S'], Parameters=ssm_parameters )
注意:禁止使用
eval做字符串转字典操作,eval会执行任意代码存在严重安全风险,ast.literal_eval仅会解析Python基础数据结构,安全合规。
方案2:调整DynamoDB存储结构(可修改表结构时推荐,维护成本更低)
如果允许修改DynamoDB表的存储格式,建议直接将参数模板存为Map类型而非字符串类型,仅在参数值位置留占位符,取出后直接遍历替换即可,不需要做字符串转字典的操作,逻辑更简单故障率更低:
- 调整后的DynamoDB存储示例:
"parameters_name": { "M": { "ParameterName1": { "S": "Variable1" }, "ParameterName2": { "S": "Variable2" }, "ParameterName3": { "S": "Variable3" }, "ParameterName4": { "S": "Variable4" } } }, "document_name": { "S": "XYZ" } - 取出后遍历Map的键值对,替换占位符后把值封装为列表即可直接使用。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

