This repository contains modules to load configuration analogous to the Global gem. Refere to Global's documentation for more details
See main Global documentation for setup instructions.
go get github.com/railsware/go-global/v2/aws
import (
"os"
awsConfig "github.com/aws/aws-sdk-go-v2/config"
globalAWS "github.com/railsware/go-global/v2/aws"
)
type Config struct {
Database struct {
PoolSize int `json:"pool_size"`
URLs []string `json:"urls"`
} `json:"database"`
}
var config Config
awsConfig, err := awsConfig.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatalf("cannot load aws config: %v", err)
}
awsParamPrefix := os.Getenv("AWS_PARAM_PREFIX")
err := globalAWS.LoadConfigFromParameterStore(
awsConfig,
globalAWS.LoadConfigOptions{ParamPrefix: awsParamPrefix},
&config
)
// config.Database.URLs[0] loaded from /param_prefix/database/urls/0
// config.Database.PoolSize loaded from /param_prefix/database/pool_size
-
Supported value types:
string
,int
,bool
("true"/"false"). -
A
[]byte
can be loaded from Base64 encoded string. -
Complex type should be either a
struct
, amap
or aslice
. You can arbitrarily nest them. -
For structs, use
global
orjson
tag to set field name. -
For maps, the key name is the map key (maps must use strings as keys.)
-
For slices, all subscripts in Parameter Store must be integers.
If you use Global in AWS environments, you can DRY up the code by following a convention:
- Set up param prefix in the
AWS_PARAM_PREFIX
environment variable. - Make sure the IAM role has permissions to the params
Then you can simply use:
var config Config
// Will panic if anything goes wrong
globalAWS.MustLoadConfig(&config)
By default, Global assumes that all params from Parameter Store must be mapped to config fields, and returns a warning if some param does not correspond to a config field.
Sometimes, it is expected that the config only contains a subset of the params, and such a warning is unnecessary.
In this case, set options.IgnoreUnmappedParams
to true. Note that other mapping issues, like a type mismatch, will still cause an error.