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将返回错误。
注意:在同一结构体字段上同时使用default
和required
标签的行为目前未定义。
支持的结构体字段类型
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
更多关于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)
}
最佳实践
- 错误处理:总是检查
Load
方法的错误返回 - 敏感信息:使用
secure
标签标记敏感参数 - 环境分离:使用前缀区分不同环境(开发/测试/生产)
- 默认值:为可选参数设置合理的默认值
- IAM 权限:确保执行代码的 IAM 角色有
ssm:GetParameters
权限
注意事项
- 参数存储有 API 调用限制,考虑批量获取参数
- 对于大量参数,考虑使用缓存策略
- 在 Lambda 等无服务器环境中,可以利用 SSM 参数缓存
go-ssm-config 提供了一种简洁的方式来管理 AWS 环境中的配置,避免了将敏感信息硬编码在代码或配置文件中。