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").
Complex type should be either a struct
, a map
or a slice
. You can arbitrarily nest them.
For structs, use global
or json
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.