golang加载AWS环境变量配置插件库awsenv的使用
golang加载AWS环境变量配置插件库awsenv的使用
概述
awsenv是一个小型二进制工具,用于从~/.aws/credentials
文件中加载AWS环境变量配置。它对于需要频繁切换AWS凭证的用户特别有用,特别是在使用Vagrant等工具时。除了加载aws_access_key_id
和aws_secret_access_key
外,它还可以加载aws_keyname
和aws_keypath
设置。
安装
# 安装Go
export GOPATH=$HOME/go
go get -u github.com/soniah/awsenv
这将自动下载、编译并将awsenv
可执行文件安装到$GOPATH/bin
目录中。
使用
通过使用eval
命令调用awsenv
来导入环境变量:
eval `awsenv profile-name`
示例
假设有以下凭证文件:
% cat ~/.aws/credentials
[example1]
aws_access_key_id = DEADBEEFDEADBEEF
aws_secret_access_key = DEADBEEFDEADBEEF1vzfgefDEADBEEFDEADBEEF
% cat /var/tmp/credentials
[example2]
aws_access_key_id = DEADBEEFDEADBEEF
aws_secret_access_key = DEADBEEFDEADBEEF1vzfgefDEADBEEFDEADBEEF
aws_keyname = 'example2_key'
aws_keypath = "~/.ssh/example2.pem"
以下命令会将AWS变量导入到你的环境中:
% eval `awsenv example1`
% env | grep AWS
AWS_ACCESS_KEY_ID=DEADBEEFDEADBEEF
AWS_SECRET_ACCESS_KEY=DEADBEEFDEADBEEF1vzfgefDEADBEEFDEADBEEF
% eval `awsenv example2 -f /var/tmp/credentials -v`
AWS_ACCESS_KEY_ID=DEADBEEFDEADBEEF
AWS_SECRET_ACCESS_KEY=DEADBEEFDEADBEEF1vzfgefDEADBEEFDEADBEEF
AWS_KEYNAME=example2_key
AWS_KEYPATH=/Users/sonia/.ssh/example2.pem
Vagrant示例
在Vagrantfile中,你可以这样使用:
override.ssh.username = "ubuntu"
aws.keypair_name = ENV['AWS_KEYNAME']
override.ssh.private_key_path = ENV['AWS_KEYPATH']
命令行选项
使用-h
标志可以显示可用的选项:
% awsenv -h
Usage:
awsenv [OPTIONS] Profile
Application Options:
-v, --verbose Verbose output
-f, --filename= Credentials file (~/.aws/credentials)
Help Options:
-h, --help Show this help message
Arguments:
Profile
贡献
欢迎贡献代码,以下是使用hub的工作流程示例:
go get github.com/soniah/awsenv
cd $GOPATH/src/github.com/soniah/awsenv
hub fork
git co -b dev
(并编写代码)git push -u <your-github-username> dev
hub pull-request
更多关于golang加载AWS环境变量配置插件库awsenv的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang加载AWS环境变量配置插件库awsenv的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 awsenv 加载 AWS 环境变量配置
awsenv 是一个 Go 语言库,用于从 AWS 服务(如 SSM Parameter Store 或 Secrets Manager)加载环境变量。它可以帮助你在应用程序启动时将 AWS 中的配置注入到环境变量中。
安装 awsenv
首先安装 awsenv 库:
go get github.com/sethvargo/go-awsenv
基本使用方法
1. 从 SSM Parameter Store 加载环境变量
package main
import (
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/sethvargo/go-awsenv"
)
func main() {
// 创建 AWS session
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
})
if err != nil {
log.Fatalf("failed to create AWS session: %v", err)
}
// 创建 awsenv 加载器
loader := awsenv.NewSSMLoader(sess)
// 定义要加载的参数
params := map[string]string{
"DB_PASSWORD": "/myapp/production/db/password", // SSM 参数路径
"API_KEY": "/myapp/production/api/key",
}
// 加载环境变量
if err := loader.Load(params); err != nil {
log.Fatalf("failed to load environment variables: %v", err)
}
// 现在可以使用环境变量了
dbPassword := os.Getenv("DB_PASSWORD")
apiKey := os.Getenv("API_KEY")
log.Printf("DB Password: %s", dbPassword)
log.Printf("API Key: %s", apiKey)
}
2. 从 Secrets Manager 加载环境变量
package main
import (
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/sethvargo/go-awsenv"
)
func main() {
// 创建 AWS session
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-east-1"),
})
if err != nil {
log.Fatalf("failed to create AWS session: %v", err)
}
// 创建 awsenv 加载器
loader := awsenv.NewSecretsManagerLoader(sess)
// 定义要加载的密钥
secrets := map[string]string{
"DB_CREDENTIALS": "myapp/db-credentials", // Secrets Manager 密钥名称或ARN
"REDIS_URL": "myapp/redis-url",
}
// 加载环境变量
if err := loader.Load(secrets); err != nil {
log.Fatalf("failed to load environment variables: %v", err)
}
// 现在可以使用环境变量了
dbCreds := os.Getenv("DB_CREDENTIALS")
redisURL := os.Getenv("REDIS_URL")
log.Printf("DB Credentials: %s", dbCreds)
log.Printf("Redis URL: %s", redisURL)
}
高级用法
1. 使用前缀加载多个变量
// 从 SSM Parameter Store 加载所有以 "/myapp/" 开头的参数
loader := awsenv.NewSSMLoader(sess)
if err := loader.LoadFromPrefix("/myapp/"); err != nil {
log.Fatalf("failed to load environment variables: %v", err)
}
2. 自定义环境变量名称转换
loader := awsenv.NewSSMLoader(sess).WithNameFunc(func(s string) string {
// 将 SSM 路径转换为环境变量名称
// 例如: "/myapp/db/password" -> "MYAPP_DB_PASSWORD"
return strings.ToUpper(strings.ReplaceAll(strings.Trim(s, "/"), "/", "_"))
})
params := map[string]string{
"/myapp/db/password": "/myapp/db/password",
}
if err := loader.Load(params); err != nil {
log.Fatal(err)
}
3. 结合多个加载器使用
func loadEnv() error {
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
})
if err != nil {
return fmt.Errorf("failed to create AWS session: %w", err)
}
// 先尝试从 SSM 加载
ssmLoader := awsenv.NewSSMLoader(sess)
if err := ssmLoader.Load(map[string]string{
"DB_HOST": "/myapp/db/host",
}); err != nil {
return fmt.Errorf("failed to load from SSM: %w", err)
}
// 然后从 Secrets Manager 加载
smLoader := awsenv.NewSecretsManagerLoader(sess)
if err := smLoader.Load(map[string]string{
"DB_CREDENTIALS": "myapp/db-credentials",
}); err != nil {
return fmt.Errorf("failed to load from Secrets Manager: %w", err)
}
return nil
}
最佳实践
- 错误处理:始终检查 Load 方法的返回错误
- 本地开发:考虑添加回退机制,当不在 AWS 环境中运行时使用本地配置
- 敏感信息:不要在日志中打印敏感的环境变量值
- IAM 权限:确保执行代码的 IAM 角色有权限访问相应的 SSM 参数或 Secrets Manager 密钥
本地开发回退示例
func loadConfig() error {
// 尝试从 AWS 加载
if os.Getenv("AWS_REGION") != "" {
sess, err := session.NewSession()
if err != nil {
return err
}
loader := awsenv.NewSSMLoader(sess)
if err := loader.Load(map[string]string{
"DB_URL": "/myapp/db/url",
}); err == nil {
return nil // 成功从 AWS 加载
}
// 如果失败,继续尝试本地加载
}
// AWS 加载失败或不在 AWS 环境中,使用本地 .env 文件
if err := godotenv.Load(); err != nil {
return fmt.Errorf("failed to load .env file: %w", err)
}
return nil
}
awsenv 是一个简单但强大的工具,可以帮助你将 AWS 中的配置安全地注入到应用程序环境中,特别是在使用容器化部署或 serverless 架构时非常有用。