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

如何将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编写脚本批量处理:

  1. 确保已安装yq(v4及以上版本)
  2. 运行以下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:45:43