golang加载AWS环境变量配置插件库awsenv的使用

golang加载AWS环境变量配置插件库awsenv的使用

概述

awsenv是一个小型二进制工具,用于从~/.aws/credentials文件中加载AWS环境变量配置。它对于需要频繁切换AWS凭证的用户特别有用,特别是在使用Vagrant等工具时。除了加载aws_access_key_idaws_secret_access_key外,它还可以加载aws_keynameaws_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的工作流程示例:

  1. go get github.com/soniah/awsenv
  2. cd $GOPATH/src/github.com/soniah/awsenv
  3. hub fork
  4. git co -b dev (并编写代码)
  5. git push -u <your-github-username> dev
  6. hub pull-request

更多关于golang加载AWS环境变量配置插件库awsenv的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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
}

最佳实践

  1. 错误处理:始终检查 Load 方法的返回错误
  2. 本地开发:考虑添加回退机制,当不在 AWS 环境中运行时使用本地配置
  3. 敏感信息:不要在日志中打印敏感的环境变量值
  4. 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 架构时非常有用。

回到顶部