如何将YAML文件按键值对存入AWS SSM参数存储?
解决方案:将YAML属性转为AWS SSM层级参数
一、有没有现成的yaml2SSM库?
目前没有专门的yaml2SSM官方或主流第三方库,但可以通过YAML转JSON + 现有json2SSM工具的组合快速实现需求。用yq(常用YAML命令行处理工具)先把YAML转成JSON,再传入json2SSM即可:
yq -o json your-config.yaml | json2SSM --prefix xmas-fifth-day
yq可通过各系统包管理器安装(如apt install yq、brew install yq)。
二、用AWS CLI直接实现的方法
AWS CLI本身没有原生支持YAML转SSM层级参数的命令,但可以结合yq编写脚本批量处理:
- 确保已安装
yq(v4及以上版本) - 运行以下bash脚本,自动遍历YAML所有键值对并创建SSM参数:
#!/bin/bash PREFIX="xmas-fifth-day" # 遍历YAML所有路径和值,格式化为"键路径=值" yq e '.. | (path | map(tostring) | join("/")) + "=" + (tostring)' your-config.yaml | while read -r line; do KEY="${PREFIX}/${line%%=*}" VALUE="${line#*=}" # 上传到SSM参数存储,允许覆盖已有参数 aws ssm put-parameter --name "$KEY" --value "$VALUE" --type String --overwrite done
注:如果YAML包含数组,上述脚本会自动将数组索引加入路径(如items/0/name),符合SSM层级命名规则。
三、自定义转换的简便方法及编程语言库
如果需要更灵活的逻辑控制,以下是各语言的常用实现方案:
Python
用PyYAML解析YAML,递归生成层级路径,再通过boto3调用SSM API上传:
import yaml import boto3 def flatten_yaml(yaml_data, parent_path=""): items = [] for key, value in yaml_data.items(): current_path = f"{parent_path}/{key}" if parent_path else key if isinstance(value, dict): items.extend(flatten_yaml(value, current_path)) else: items.append((current_path, str(value))) return items # 初始化SSM客户端 ssm = boto3.client('ssm') # 加载YAML文件 with open("your-config.yaml") as f: data = yaml.safe_load(f) # 批量上传参数 for path, value in flatten_yaml(data): ssm.put_parameter( Name=f"xmas-fifth-day/{path}", Value=value, Type='String', Overwrite=True )
依赖安装:pip install pyyaml boto3
JavaScript/Node.js
用js-yaml解析YAML,递归生成路径后通过AWS SDK上传:
const yaml = require('js-yaml'); const fs = require('fs'); const AWS = require('aws-sdk'); const ssm = new AWS.SSM(); function flattenYaml(obj, parentPath = '') { const result = []; for (const [key, value] of Object.entries(obj)) { const currentPath = parentPath ? `${parentPath}/${key}` : key; if (typeof value === 'object' && !Array.isArray(value)) { result.push(...flattenYaml(value, currentPath)); } else { result.push({ path: currentPath, value: String(value) }); } } return result; } // 加载并处理YAML const yamlData = yaml.load(fs.readFileSync('your-config.yaml', 'utf8')); const params = flattenYaml(yamlData); // 批量上传 params.forEach(async (item) => { await ssm.putParameter({ Name: `xmas-fifth-day/${item.path}`, Value: item.value, Type: 'String', Overwrite: true }).promise(); });
依赖安装:npm install js-yaml aws-sdk
Java
用SnakeYAML解析YAML,递归遍历生成路径后通过AWS SDK for Java上传:
import org.yaml.snakeyaml.Yaml; import software.amazon.awssdk.services.ssm.SsmClient; import software.amazon.awssdk.services.ssm.model.PutParameterRequest; import java.io.FileInputStream; import java.util.Map; import java.util.ArrayList; import java.util.List; public class YamlToSsm { public static void main(String[] args) { Yaml yaml = new Yaml(); try (FileInputStream fis = new FileInputStream("your-config.yaml")) { Map<String, Object> data = yaml.load(fis); List<Map.Entry<String, String>> flattened = flattenYaml(data, ""); SsmClient ssm = SsmClient.create(); for (var entry : flattened) { PutParameterRequest request = PutParameterRequest.builder() .name("xmas-fifth-day/" + entry.getKey()) .value(entry.getValue()) .type("String") .overwrite(true) .build(); ssm.putParameter(request); } } catch (Exception e) { e.printStackTrace(); } } private static List<Map.Entry<String, String>> flattenYaml(Map<String, Object> obj, String parentPath) { List<Map.Entry<String, String>> result = new ArrayList<>(); for (var entry : obj.entrySet()) { String currentPath = parentPath.isEmpty() ? entry.getKey() : parentPath + "/" + entry.getKey(); if (entry.getValue() instanceof Map) { result.addAll(flattenYaml((Map<String, Object>) entry.getValue(), currentPath)); } else { result.add(Map.entry(currentPath, entry.getValue().toString())); } } return result; } }
Maven依赖:
<dependencies> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssm</artifactId> <version>2.25.0</version> </dependency> </dependencies>
关于AWS SSM的yaml-input参数
AWS CLI的aws ssm put-parameters的--yaml-input要求的是SSM批量导入的特定格式(需包含Parameters数组,每个元素指定Name、Value等字段),和普通配置YAML结构不兼容,因此无法直接用于你的场景,必须先转换为SSM要求的格式,或使用上述方法逐个创建参数。
内容的提问来源于stack exchange,提问作者VelNaga
相关产品推荐
相关产品推荐

