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:           &paramName,
		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)
		}
	}
}

// 前面定义的那些函数...

最佳实践

  1. 错误处理:始终检查错误并适当处理
  2. 缓存参数:频繁访问的参数应该缓存,而不是每次都从SSM获取
  3. IAM权限:确保应用程序有足够的权限访问参数存储
  4. 参数版本:考虑使用特定版本的参数以确保一致性
  5. 环境区分:使用不同的参数路径区分开发、测试和生产环境

高级用法

使用自定义配置

// 使用自定义区域和凭证
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系统管理器参数存储中获取配置参数,使你的应用程序更加安全和可配置。

回到顶部