golang从AWS系统管理器参数存储获取参数的插件库go-aws-ssm的使用
golang从AWS系统管理器参数存储获取参数的插件库go-aws-ssm的使用
为什么使用go-aws-ssm而不是aws-sdk-go?
这个包封装了aws-sdk-go,隐藏了处理不太友好的AWS SDK的复杂性。当应用程序的安全参数使用路径层次结构存储在AWS参数存储中时,这个包是完美的选择。在应用程序启动时,您可以使用这个包获取它们并在应用程序中使用。
安装
go get github.com/PaddleHQ/go-aws-ssm
示例
基本用法
// 假设您有以下格式的参数:
// my-service/dev/param-1 -> 值为 `a`
// my-service/dev/param-2 -> 值为 `b`
pmstore, err := awsssm.NewParameterStore()
if err != nil {
return err
}
// 请求基础路径
params, err := pmstore.GetAllParametersByPath("/my-service/dev/", true)
if err!=nil{
return err
}
// 获取特定值
value:=params.GetValueByName("param-1")
// value应该是 `a`
轻松集成viper
// 假设您有以下格式的参数:
// my-service/dev/param-1 -> 值为 `a`
// my-service/dev/param-2 -> 值为 `b`
pmstore, err := awsssm.NewParameterStore()
if err != nil {
return err
}
// 请求基础路径
params, err := pmstore.GetAllParametersByPath("/my-service/dev/", true)
if err!=nil{
return err
}
// 配置viper将其作为json文档处理
v := viper.New()
v.SetConfigType(`json`)
// params对象实现了所需的io.Reader接口
err = v.ReadConfig(params)
if err != nil {
return err
}
value := v.Get(`param-1`)
// value应该是 `a`
更多关于golang从AWS系统管理器参数存储获取参数的插件库go-aws-ssm的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang从AWS系统管理器参数存储获取参数的插件库go-aws-ssm的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用go-aws-ssm从AWS系统管理器参数存储获取参数
AWS系统管理器参数存储(SSM Parameter Store)是AWS提供的安全存储配置数据和密钥的服务。在Go语言中,可以使用go-aws-ssm
库来方便地访问这些参数。
安装go-aws-ssm
首先安装go-aws-ssm库:
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/ssm
基本使用方法
1. 初始化SSM客户端
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/ssm"
)
func main() {
// 加载默认AWS配置
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatalf("无法加载AWS配置: %v", err)
}
// 创建SSM客户端
ssmClient := ssm.NewFromConfig(cfg)
// 现在可以使用ssmClient来获取参数了
}
2. 获取单个参数
func getParameter(ssmClient *ssm.Client, paramName string) (string, error) {
// 获取参数
resp, err := ssmClient.GetParameter(context.TODO(), &ssm.GetParameterInput{
Name: ¶mName,
WithDecryption: aws.Bool(true), // 如果是加密参数,需要解密
})
if err != nil {
return "", fmt.Errorf("获取参数失败: %v", err)
}
return *resp.Parameter.Value, nil
}
3. 获取多个参数
func getParameters(ssmClient *ssm.Client, paramNames []string) (map[string]string, error) {
// 准备参数名称列表
var names []string
for _, name := range paramNames {
names = append(names, name)
}
// 获取多个参数
resp, err := ssmClient.GetParameters(context.TODO(), &ssm.GetParametersInput{
Names: names,
WithDecryption: aws.Bool(true),
})
if err != nil {
return nil, fmt.Errorf("获取多个参数失败: %v", err)
}
// 将结果转换为map
result := make(map[string]string)
for _, param := range resp.Parameters {
result[*param.Name] = *param.Value
}
return result, nil
}
4. 按路径获取参数
func getParametersByPath(ssmClient *ssm.Client, path string) (map[string]string, error) {
var params map[string]string
var nextToken *string
for {
// 获取路径下的参数
resp, err := ssmClient.GetParametersByPath(context.TODO(), &ssm.GetParametersByPathInput{
Path: &path,
Recursive: aws.Bool(true),
WithDecryption: aws.Bool(true),
NextToken: nextToken,
})
if err != nil {
return nil, fmt.Errorf("按路径获取参数失败: %v", err)
}
// 将结果添加到map中
if params == nil {
params = make(map[string]string)
}
for _, param := range resp.Parameters {
params[*param.Name] = *param.Value
}
// 检查是否有更多结果
if resp.NextToken == nil {
break
}
nextToken = resp.NextToken
}
return params, nil
}
完整示例
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/ssm"
)
func main() {
// 1. 初始化SSM客户端
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatalf("无法加载AWS配置: %v", err)
}
ssmClient := ssm.NewFromConfig(cfg)
// 2. 获取单个参数
singleParam, err := getParameter(ssmClient, "/myapp/database/username")
if err != nil {
log.Printf("获取单个参数错误: %v", err)
} else {
fmt.Printf("数据库用户名: %s\n", singleParam)
}
// 3. 获取多个参数
multiParams, err := getParameters(ssmClient, []string{
"/myapp/database/username",
"/myapp/database/password",
})
if err != nil {
log.Printf("获取多个参数错误: %v", err)
} else {
for name, value := range multiParams {
fmt.Printf("%s: %s\n", name, value)
}
}
// 4. 按路径获取参数
pathParams, err := getParametersByPath(ssmClient, "/myapp/")
if err != nil {
log.Printf("按路径获取参数错误: %v", err)
} else {
for name, value := range pathParams {
fmt.Printf("%s: %s\n", name, value)
}
}
}
// 前面定义的那些函数...
最佳实践
- 错误处理:始终检查错误并适当处理
- 缓存参数:频繁访问的参数应该缓存,而不是每次都从SSM获取
- IAM权限:确保应用程序有足够的权限访问参数存储
- 参数版本:考虑使用特定版本的参数以确保一致性
- 环境区分:使用不同的参数路径区分开发、测试和生产环境
高级用法
使用自定义配置
// 使用自定义区域和凭证
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("us-west-2"),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("AKID", "SECRET_KEY", "TOKEN")),
)
使用SSM参数缓存
type SSMCache struct {
client *ssm.Client
cache map[string]string
}
func NewSSMCache(client *ssm.Client) *SSMCache {
return &SSMCache{
client: client,
cache: make(map[string]string),
}
}
func (c *SSMCache) GetParameter(name string) (string, error) {
// 检查缓存
if val, ok := c.cache[name]; ok {
return val, nil
}
// 从SSM获取
val, err := getParameter(c.client, name)
if err != nil {
return "", err
}
// 存入缓存
c.cache[name] = val
return val, nil
}
通过使用go-aws-ssm库,你可以轻松地从AWS系统管理器参数存储中获取配置参数,使你的应用程序更加安全和可配置。