https://github.com/phstc/param_store
Easy switch in between ENV, AWS Parameter Store, AWS Secrets Manager and EJSON
https://github.com/phstc/param_store
aws-ssm environment-variables ruby ruby-on-rails
Last synced: about 1 year ago
JSON representation
Easy switch in between ENV, AWS Parameter Store, AWS Secrets Manager and EJSON
- Host: GitHub
- URL: https://github.com/phstc/param_store
- Owner: phstc
- License: mit
- Created: 2018-12-25T19:53:11.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-12-27T03:10:00.000Z (over 2 years ago)
- Last Synced: 2025-03-24T11:21:32.952Z (about 1 year ago)
- Topics: aws-ssm, environment-variables, ruby, ruby-on-rails
- Language: Ruby
- Homepage:
- Size: 59.6 KB
- Stars: 12
- Watchers: 1
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
[](https://circleci.com/gh/phstc/param_store)
# ParamStore
This gem goal is to DRY some code I have been copying around for a while make easy switching in between ENV, [AWS Parameter Store (SSM)](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html), [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) and [EJSON](https://github.com/Shopify/ejson) for retrieving parameters.
This gem is not a replacement for [dotenv](https://github.com/bkeepers/dotenv). I still use and recommend it in development, in case it is "safe" to save your keys in `.env` files.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'param_store'
```
## Usage
### Configuring adapters
Available adapters: `:env`, `:aws_ssm`, `:aws_secrets_manager` and `:ejson_wrapper`.
```ruby
ParamStore.adapter = adapter
```
### Retrieving parameters
```ruby
# ParamStore.fetch is similar to Hash#fetch,
# If the key is not found and there's no default given, it will raise a `KeyError`
ParamStore.fetch('name')
ParamStore.fetch('name', 'default value')
ParamStore.fetch('name') { 'default value' }
```
### Copying from any adapter to ENV
```ruby
ParamStore.copy_to_env('name1', 'name2', 'name3')
ENV['name1'] # => value for name1
ENV['name2'] # => value for name2
ENV['name3'] # => value for name3
```
## Adapters
### ENV
```ruby
ParamStore.adapter :env
```
### AWS Parameter Store (SSM)
Add to your Gemfile:
```ruby
gem 'aws-sdk-ssm', '~> 1'
```
Configure the adapter:
```ruby
ParamStore.adapter :aws_ssm, default_path: '/Prod/App/'
```
#### Retrieving parameters
```ruby
ParamStore.fetch('name')
# => get parameter name, if default_path /Prod/App/ get parameter /Prod/App/name
ParamStore.fetch('name', path: '/Prod/App/')
# => get parameter /Prod/App/name
```
#### Copying from SSM adapter to ENV
```ruby
ParamStore.copy_to_env('name1', 'name2', 'name3', path: '/Environment/Type of computer/Application/')
# path overrides default_path
ENV['name1'] # => value for name1
ENV['name2'] # => value for name2
ENV['name3'] # => value for name3
```
#### SSM client
By default ParamStore will initiate `Aws::SSM::Client.new` without supplying any argument. If you want to control the initiation of the SSM client, you can define it by setting `ssm_client`.
```ruby
ParamStore.ssm_client = Aws::SSM::Client.new(
region: region_name,
credentials: credentials,
# ...
)
```
#### CLI
A few useful [aws ssm](https://docs.aws.amazon.com/cli/latest/reference/ssm/index.html) commands:
```sh
aws ssm get-parameters-by-path --path /Prod/ERP/SAP --with-decryption
aws ssm put-parameter --name /Prod/ERP/SAP --value ... --type SecureString
```
### Secrets Manager
Add to your Gemfile:
```ruby
gem 'aws-sdk-secretsmanager', '~> 1'
```
Configure the adapter:
```ruby
ParamStore.adapter :aws_secrets_manager
# ParaStore.fetch('secret_id')
# => {\n \"password\":\"pwd\"\n}\n
ParamStore.adapter :aws_secrets_manager, default_secret_id: 'secret_id'
# ParaStore.fetch('password')
# => pwd
```
#### Retrieving parameters
```ruby
ParamStore.fetch('secret_id')
ParamStore.fetch('password', secret_id: 'secret_id')
```
#### Copying from Secrets Manager adapter to ENV
```ruby
ParamStore.copy_to_env('key1', 'key2', 'key3', secret_id: 'secret_id')
# secret_id overrides default_secret_id
ENV['key1'] # => value for key1
ENV['key2'] # => value for key2
ENV['key3'] # => value for key3
```
### EJSON
Add to your Gemfile:
```ruby
gem 'ejson_wrapper', '~> 0.3.1'
```
Configure the adapter:
```ruby
ParamStore.adapter(
:ejson_wrapper,
file_path: '...',
key_dir: '...',
private_key: '...',
use_kms: '...',
region: '...'
)
# see https://github.com/envato/ejson_wrapper#usage
```
#### Rails
If you are using ParamStore in prod and dotenv in dev:
```ruby
# config/application.rb
# Bundler.require(*Rails.groups)
if Rails.env.production?
ParamStore.adapter(:aws_ssm)
ParamStore.copy_to_env('DATABASE_URL', require_keys: true, path: '/Prod/MyApp/')
else
Dotenv::Railtie.load
end
```
### Fail-fast
You can configure the required parameters for an app and fail at startup.
```ruby
# config/application.rb
# Bundler.require(*Rails.groups)
ParamStore.require_keys!('key1', 'key2', 'key3')
# this will raise an error if any key is missing
```
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/phstc/param_store. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
## Code of Conduct
Everyone interacting in the ParamStore project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/phstc/param_store/blob/master/CODE_OF_CONDUCT.md).