golang从AWS SSM参数存储加载配置参数插件库go-ssm-config的使用

Golang从AWS SSM参数存储加载配置参数插件库go-ssm-config的使用

简介

go-ssm-config是一个用于从AWS SSM(Parameter Store)直接加载配置参数到结构体的实用工具库。该库受到kelseyhightower/envconfig的启发。

动机

这个库的创建是为了减少在使用Parameter Store为AWS Lambda函数提供配置时所需的样板代码。它也适用于其他应用场景。

使用示例

首先在AWS Parameter Store中设置一些参数:

Name Value Type Key ID
/example_service/prod/debug false String -
/example_service/prod/port 8080 String -
/example_service/prod/user Ian String -
/example_service/prod/rate 0.5 String -
/example_service/prod/secret zOcZkAGB6aEjN7SAoVBT SecureString alias/aws/ssm

然后编写代码:

package main

import (
    "fmt"
    "log"

    ssmconfig "github.com/ianlopshire/go-ssm-config"
)

// 定义配置结构体
type Config struct {
    Debug  bool    `ssm:"debug" default:"true"`  // 有默认值
    Port   int     `ssm:"port"`                 // 必填参数
    User   string  `ssm:"user"`                 // 必填参数
    Rate   float32 `ssm:"rate"`                 // 必填参数
    Secret string  `ssm:"secret" required:"true"` // 必填参数
}

func main() {
    var c Config
    // 从SSM加载配置,前缀为/example_service/prod/
    err := ssmconfig.Process("/example_service/prod/", &c)
    if err != nil {
        log.Fatal(err.Error())
    }
    
    // 打印加载的配置
    format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nSecret: %s\n"
    _, err = fmt.Printf(format, c.Debug, c.Port, c.User, c.Rate, c.Secret)
    if err != nil {
        log.Fatal(err.Error())
    }
}

运行结果:

Debug: false
Port: 8080
User: Ian
Rate: 0.500000
Secret: zOcZkAGB6aEjN7SAoVBT

结构体标签支持

go-ssm-config支持使用结构体标签来指定参数名称、默认值和必填参数。

type Config struct {
    Param         string `ssm:"param"`                  // 可选参数
    RequiredParam string `ssm:"required_param" required:"true"` // 必填参数
    DefaultParam  string `ssm:"default_param" default:"foobar"` // 有默认值的参数
}
  • ssm标签用于在Parameter Store中查找参数。它会与传递给Process()的基本路径连接起来。如果缺少ssm标签,ssmconfig会忽略该结构体字段。
  • default标签用于设置参数的默认值。只有当Parameter Store返回参数无效时才会设置默认值。
  • required标签用于将参数标记为必填。如果Parameter Store返回的必填参数无效,ssmconfig将返回错误。

注意:在同一结构体字段上同时使用defaultrequired标签的行为目前未定义。

支持的结构体字段类型

ssmconfig支持以下结构体字段类型:

  • string
  • int, int8, int16, int32, int64
  • bool
  • float32, float64

未来可能会添加更多支持的类型。

许可证

MIT


更多关于golang从AWS SSM参数存储加载配置参数插件库go-ssm-config的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang从AWS SSM参数存储加载配置参数插件库go-ssm-config的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 go-ssm-config 从 AWS SSM 参数存储加载配置

go-ssm-config 是一个方便的 Go 库,用于从 AWS Systems Manager (SSM) 参数存储中加载配置参数。下面我将详细介绍如何使用这个库。

安装

首先安装 go-ssm-config 库:

go get github.com/ianlopshire/go-ssm-config

基本用法

1. 定义配置结构

首先定义一个结构体来映射你的配置参数:

type Config struct {
    DatabaseURL      string `ssm:"/myapp/database_url"`
    APIKey           string `ssm:"/myapp/api_key,required"`
    MaxConnections   int    `ssm:"/myapp/max_connections"`
    DebugMode        bool   `ssm:"/myapp/debug_mode"`
    FeatureFlags     string `ssm:"/myapp/feature_flags,default=stable"`
}

标签说明:

  • ssm:"path" - 指定 SSM 中的参数路径
  • required - 表示该参数是必需的
  • default=value - 设置默认值(当参数不存在时使用)

2. 加载配置

package main

import (
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/ianlopshire/go-ssm-config"
)

func main() {
    // 创建 AWS 会话
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    // 初始化配置
    var cfg Config
    err := ssmconfig.Load(sess, &cfg)
    if err != nil {
        log.Fatalf("failed to load config: %v", err)
    }

    fmt.Printf("Loaded config: %+v\n", cfg)
}

高级用法

1. 使用前缀

如果你的所有参数都有共同的前缀,可以使用 WithPrefix 选项:

err := ssmconfig.Load(sess, &cfg, 
    ssmconfig.WithPrefix("/myapp/production/"))

这样结构体标签中的路径会自动添加此前缀。

2. 自定义参数名称转换

默认情况下,结构体字段名会转换为小写加下划线的形式。你可以自定义这个行为:

err := ssmconfig.Load(sess, &cfg,
    ssmconfig.WithFieldNameFn(func(fieldName string) string {
        // 自定义转换逻辑
        return strings.ToLower(fieldName)
    }))

3. 从环境变量覆盖

你可以设置优先从环境变量读取值:

err := ssmconfig.Load(sess, &cfg,
    ssmconfig.WithEnvOverride(true))

4. 解密安全字符串

对于 SecureString 类型的参数,库会自动解密:

type Config struct {
    SecretToken string `ssm:"/myapp/secret_token,secure"`
}

完整示例

package main

import (
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/ianlopshire/go-ssm-config"
)

type AppConfig struct {
    DBHost     string `ssm:"/app/db_host,required"`
    DBPort     int    `ssm:"/app/db_port,default=5432"`
    DBUser     string `ssm:"/app/db_user"`
    DBPassword string `ssm:"/app/db_password,secure"`
    Debug      bool   `ssm:"/app/debug_mode,default=false"`
}

func main() {
    // 初始化 AWS 会话
    sess, err := session.NewSession()
    if err != nil {
        log.Fatalf("failed to create AWS session: %v", err)
    }

    // 加载配置
    var cfg AppConfig
    err = ssmconfig.Load(sess, &cfg, 
        ssmconfig.WithPrefix("/production/"),
        ssmconfig.WithEnvOverride(true))
    
    if err != nil {
        log.Fatalf("failed to load config: %v", err)
    }

    fmt.Printf("Database configuration:\n")
    fmt.Printf("Host: %s\n", cfg.DBHost)
    fmt.Printf("Port: %d\n", cfg.DBPort)
    fmt.Printf("User: %s\n", cfg.DBUser)
    fmt.Printf("Debug mode: %v\n", cfg.Debug)
}

最佳实践

  1. 错误处理:总是检查 Load 方法的错误返回
  2. 敏感信息:使用 secure 标签标记敏感参数
  3. 环境分离:使用前缀区分不同环境(开发/测试/生产)
  4. 默认值:为可选参数设置合理的默认值
  5. IAM 权限:确保执行代码的 IAM 角色有 ssm:GetParameters 权限

注意事项

  1. 参数存储有 API 调用限制,考虑批量获取参数
  2. 对于大量参数,考虑使用缓存策略
  3. 在 Lambda 等无服务器环境中,可以利用 SSM 参数缓存

go-ssm-config 提供了一种简洁的方式来管理 AWS 环境中的配置,避免了将敏感信息硬编码在代码或配置文件中。

回到顶部