smps 0.3.4 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +116 -10
- data/changelog.md +17 -0
- data/exe/smps +97 -108
- data/lib/smps.rb +8 -76
- data/lib/smps/aws.rb +100 -0
- data/lib/smps/client.rb +92 -0
- data/lib/smps/parameter.rb +10 -3
- data/lib/smps/version.rb +5 -2
- data/license.txt +1 -1
- metadata +8 -101
- data/.gitignore +0 -15
- data/.rspec +0 -2
- data/.travis.yml +0 -5
- data/Gemfile +0 -6
- data/Rakefile +0 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/bin/smps-use-ec2.rb +0 -16
- data/bin/smps-use.rb +0 -44
- data/smps.gemspec +0 -42
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 41828ccf94fe65db48d50e5f9f6ad9fb3f8bb90966bc2693d30f6b4f19bc2d76
|
|
4
|
+
data.tar.gz: 1939b73e01b471a4f9501db5cf16723b2a655ab7e0bfd38d5714e26759c0a9be
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 82b6f70310a2478a8144bc6bf2a97a905dc5c4c1717ba8ffc9a127dfd2f7116592dbf971ac256a7d127966c9389284d9ec44d659b5806bfe035e70e91f868a70
|
|
7
|
+
data.tar.gz: c8f71027b2bf3738269c05eb07c2f0fe3cc2278d3860b988f3e231466b6f77eccb0e3ae1b591dfd264fe9149440f3c5f7ec115bc47d46ca3d89a1e9c40b1d6ea
|
data/README.md
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SMPS - System Manager Parameter Store
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
|
3
|
+
A command line tool and library to interact with the Amazon System Manager Parameter Store
|
|
6
4
|
|
|
7
5
|
## Installation
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
$ gem install smps
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
### Library
|
|
12
|
+
|
|
13
|
+
To use this gem in your own tools, add this line to your application's Gemfile:
|
|
10
14
|
|
|
11
15
|
```ruby
|
|
12
16
|
gem 'smps'
|
|
@@ -16,13 +20,105 @@ And then execute:
|
|
|
16
20
|
|
|
17
21
|
$ bundle
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
### CLI
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
After installation, 2 executeable scripts will be installed: `smps` & `smps-cli`:
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
- smps: the simple version of this utility.
|
|
28
|
+
- smps-cli: The thor cli executable offers a different interface.
|
|
24
29
|
|
|
25
|
-
|
|
30
|
+
#### smps
|
|
31
|
+
|
|
32
|
+
Run the command with `--help` for more information.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
smps [OPTION]
|
|
36
|
+
|
|
37
|
+
-h, --help:
|
|
38
|
+
show help
|
|
39
|
+
|
|
40
|
+
-r, --role <rolename>
|
|
41
|
+
IAM role to use. From ~/.aws/config
|
|
42
|
+
Use this for interactive use on your workstation.
|
|
43
|
+
|
|
44
|
+
-p, --param <param_name>
|
|
45
|
+
Parameter name.
|
|
46
|
+
|
|
47
|
+
-b --by_path <path>
|
|
48
|
+
Path name
|
|
49
|
+
|
|
50
|
+
-v, --value <new_value>
|
|
51
|
+
Value to assign
|
|
52
|
+
|
|
53
|
+
-t, --type <type>
|
|
54
|
+
Parameter type.
|
|
55
|
+
One of [String StringList SecureString]
|
|
56
|
+
|
|
57
|
+
-k, --key <key_id>
|
|
58
|
+
Key for SecureString encrypting.
|
|
59
|
+
|
|
60
|
+
-d, --debug [level]:
|
|
61
|
+
Debug level.
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
#### smps-cli
|
|
65
|
+
|
|
66
|
+
The smps-cli command is a new cli with more straightforward actions.
|
|
67
|
+
|
|
68
|
+
Run the command with `help` for more information: `smps-cli help`. For each individual action,
|
|
69
|
+
you can also use `smps-cli help <action>`
|
|
70
|
+
|
|
71
|
+
##### help
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Commands:
|
|
75
|
+
smps-cli get NAME # Get path or path indicated by the name
|
|
76
|
+
smps-cli help [COMMAND] # Describe available commands or one s...
|
|
77
|
+
smps-cli set NAME VALUE --type=TYPE # Set the parameter to this value
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
[--role=PROFILE] # IAM profile/role to use. From ~/.aws/config
|
|
81
|
+
[--region=REGION] # Override the aws region
|
|
82
|
+
[--debug=N] # AwsSession debug level.
|
|
83
|
+
# Default: 0
|
|
84
|
+
[--user-data], [--no-user-data] # Retrieve the name or path, and the key values from the userdata
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
##### get NAME
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
Usage:
|
|
91
|
+
smps-cli get NAME
|
|
92
|
+
|
|
93
|
+
Options:
|
|
94
|
+
[--role=PROFILE] # IAM profile/role to use. From ~/.aws/config
|
|
95
|
+
[--region=REGION] # Override the aws region
|
|
96
|
+
[--debug=N] # AwsSession debug level.
|
|
97
|
+
# Default: 0
|
|
98
|
+
[--user-data], [--no-user-data] # Retrieve the name or path, and the key values from the userdata
|
|
99
|
+
|
|
100
|
+
Description:
|
|
101
|
+
Gets a value from the parameter store.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
##### set NAME VALUE
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
Usage:
|
|
108
|
+
smps-cli set NAME VALUE --type=TYPE
|
|
109
|
+
|
|
110
|
+
Options:
|
|
111
|
+
--type=TYPE
|
|
112
|
+
# Default: String
|
|
113
|
+
[--key=ARN] # KMS key for SecureString encryption/decryption
|
|
114
|
+
[--role=PROFILE] # IAM profile/role to use. From ~/.aws/config
|
|
115
|
+
[--region=REGION] # Override the aws region
|
|
116
|
+
[--debug=N] # AwsSession debug level.
|
|
117
|
+
# Default: 0
|
|
118
|
+
[--user-data], [--no-user-data] # Retrieve the name or path, and the key values from the userdata
|
|
119
|
+
|
|
120
|
+
Set the parameter to this value
|
|
121
|
+
```
|
|
26
122
|
|
|
27
123
|
## Development
|
|
28
124
|
|
|
@@ -32,4 +128,14 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
|
32
128
|
|
|
33
129
|
## Contributing
|
|
34
130
|
|
|
35
|
-
|
|
131
|
+
We use git flow in this project. To create your pull request, you can either use the git-flow helper or
|
|
132
|
+
manually create a new feature branch and pull request.
|
|
133
|
+
|
|
134
|
+
1. Fork it ( https://github.com/vrtdev/smps/fork )
|
|
135
|
+
2. Clone your forked repository.
|
|
136
|
+
3. Create your feature branch (`git checkout -b feature/my-new-feature`)
|
|
137
|
+
4. Commit your changes (`git commit -am 'Add some feature'`)
|
|
138
|
+
5. Push to the branch (`git push origin feature/my-new-feature`)
|
|
139
|
+
6. Create a new Pull Request. Remember to make the pull request against the `develop` branch.
|
|
140
|
+
|
|
141
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/vrtdev/smps.
|
data/changelog.md
CHANGED
|
@@ -5,6 +5,23 @@ Version format based on http://semver.org/
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.5.1] - 2019-04-29
|
|
9
|
+
### Changed
|
|
10
|
+
- Updated doc.
|
|
11
|
+
- Lower required Ruby version for smps gem.
|
|
12
|
+
|
|
13
|
+
## [0.5.0.pre]
|
|
14
|
+
### Changed
|
|
15
|
+
- Split in 2 separate gems: smps and smps-cli.
|
|
16
|
+
|
|
17
|
+
## [0.4.1] - 2018-09-25
|
|
18
|
+
### Changed
|
|
19
|
+
- Change dependency on thor to 0.19.* to work with available native debian packages
|
|
20
|
+
|
|
21
|
+
## [0.4.0] - 2018-09-18
|
|
22
|
+
### Added
|
|
23
|
+
- New cli executable based on thor
|
|
24
|
+
|
|
8
25
|
## [0.3.4] - 2017-12-20
|
|
9
26
|
### Changed
|
|
10
27
|
- Add http timeout to region get in helper script
|
data/exe/smps
CHANGED
|
@@ -1,128 +1,117 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
2
4
|
require 'getoptlong'
|
|
3
5
|
require 'smps'
|
|
4
6
|
require 'net/http'
|
|
5
7
|
require 'pp'
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-h, --help:
|
|
13
|
-
show help
|
|
9
|
+
# Dummy class to initialize our 'program' and make
|
|
10
|
+
# use of the AWsHelpers we have defined.
|
|
11
|
+
class SmpsCLI
|
|
12
|
+
include SmPs::AwsHelpers
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
def clidoc
|
|
15
|
+
puts <<~CLIDOC
|
|
16
|
+
#{$PROGRAM_NAME} [OPTION]
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
-h, --help:
|
|
19
|
+
show help
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
-r, --role <rolename>
|
|
22
|
+
IAM role to use. From ~/.aws/config
|
|
23
|
+
Use this for interactive use on your workstation.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
-p, --param <param_name>
|
|
26
|
+
Parameter name.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
One of [String StringList SecureString]
|
|
28
|
+
-b --by_path <path>
|
|
29
|
+
Path name
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
-v, --value <new_value>
|
|
32
|
+
Value to assign
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
CLIDOC
|
|
39
|
-
end
|
|
34
|
+
-t, --type <type>
|
|
35
|
+
Parameter type.
|
|
36
|
+
One of [String StringList SecureString]
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
require 'uri'
|
|
44
|
-
require 'json'
|
|
45
|
-
|
|
46
|
-
uri = URI.parse('http://169.254.169.254/latest/dynamic/instance-identity/document')
|
|
47
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
|
48
|
-
|
|
49
|
-
http.read_timeout = 2
|
|
50
|
-
http.open_timeout = 2
|
|
51
|
-
response = http.start { |h| h.get(uri.path) }
|
|
52
|
-
|
|
53
|
-
JSON.parse(response.body)['region']
|
|
54
|
-
end
|
|
38
|
+
-k, --key <key_id>
|
|
39
|
+
Key for SecureString encrypting.
|
|
55
40
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
['--param', '-p', GetoptLong::REQUIRED_ARGUMENT],
|
|
60
|
-
['--by_path', '-b', GetoptLong::REQUIRED_ARGUMENT],
|
|
61
|
-
['--value', '-v', GetoptLong::REQUIRED_ARGUMENT],
|
|
62
|
-
['--type', '-t', GetoptLong::REQUIRED_ARGUMENT],
|
|
63
|
-
['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
|
|
64
|
-
['--debug', '-d', GetoptLong::OPTIONAL_ARGUMENT]
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
role = nil
|
|
68
|
-
param = nil
|
|
69
|
-
by_path = nil
|
|
70
|
-
value = nil
|
|
71
|
-
type = nil
|
|
72
|
-
key_id = nil
|
|
73
|
-
debug = 0
|
|
74
|
-
|
|
75
|
-
opts.each do |opt, arg|
|
|
76
|
-
case opt
|
|
77
|
-
when '--help'
|
|
78
|
-
clidoc
|
|
79
|
-
exit
|
|
80
|
-
when '--role'
|
|
81
|
-
role = arg
|
|
82
|
-
when '--param'
|
|
83
|
-
param = arg
|
|
84
|
-
when '--by_path'
|
|
85
|
-
by_path = arg
|
|
86
|
-
when '--value'
|
|
87
|
-
value = arg
|
|
88
|
-
when '--type'
|
|
89
|
-
type = arg
|
|
90
|
-
when '--key'
|
|
91
|
-
key_id = arg
|
|
92
|
-
when '--debug'
|
|
93
|
-
debug = if arg == ''
|
|
94
|
-
1
|
|
95
|
-
else
|
|
96
|
-
arg.to_i
|
|
97
|
-
end
|
|
41
|
+
-d, --debug [level]:
|
|
42
|
+
Debug level.
|
|
43
|
+
CLIDOC
|
|
98
44
|
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
if role
|
|
102
|
-
require 'awssession'
|
|
103
|
-
require 'aws_config'
|
|
104
|
-
|
|
105
|
-
profile_name = role
|
|
106
|
-
profile = AWSConfig[profile_name]
|
|
107
|
-
profile['name'] = profile_name
|
|
108
|
-
|
|
109
|
-
awssession = AwsSession.new(profile: profile, debug: debug)
|
|
110
|
-
awssession.start
|
|
111
45
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
46
|
+
def run
|
|
47
|
+
opts = GetoptLong.new(
|
|
48
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT],
|
|
49
|
+
['--role', '-r', GetoptLong::REQUIRED_ARGUMENT],
|
|
50
|
+
['--param', '-p', GetoptLong::REQUIRED_ARGUMENT],
|
|
51
|
+
['--by_path', '-b', GetoptLong::REQUIRED_ARGUMENT],
|
|
52
|
+
['--value', '-v', GetoptLong::REQUIRED_ARGUMENT],
|
|
53
|
+
['--type', '-t', GetoptLong::REQUIRED_ARGUMENT],
|
|
54
|
+
['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
|
|
55
|
+
['--region', GetoptLong::OPTIONAL_ARGUMENT],
|
|
56
|
+
['--debug', '-d', GetoptLong::OPTIONAL_ARGUMENT]
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
role = nil
|
|
60
|
+
param = nil
|
|
61
|
+
by_path = nil
|
|
62
|
+
value = nil
|
|
63
|
+
type = nil
|
|
64
|
+
key_id = nil
|
|
65
|
+
region = nil
|
|
66
|
+
debug = 0
|
|
67
|
+
|
|
68
|
+
opts.each do |opt, arg|
|
|
69
|
+
case opt
|
|
70
|
+
when '--help'
|
|
71
|
+
clidoc
|
|
72
|
+
exit
|
|
73
|
+
when '--role'
|
|
74
|
+
role = arg
|
|
75
|
+
when '--param'
|
|
76
|
+
param = arg
|
|
77
|
+
when '--by_path'
|
|
78
|
+
by_path = arg
|
|
79
|
+
when '--value'
|
|
80
|
+
value = arg
|
|
81
|
+
when '--type'
|
|
82
|
+
type = arg
|
|
83
|
+
when '--key'
|
|
84
|
+
key_id = arg
|
|
85
|
+
when '--region'
|
|
86
|
+
region = arg
|
|
87
|
+
when '--debug'
|
|
88
|
+
debug = if arg == ''
|
|
89
|
+
1
|
|
90
|
+
else
|
|
91
|
+
arg.to_i
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
if role
|
|
97
|
+
credentials = credentials_from_role(role)
|
|
98
|
+
smps = SmPs::Client.new(credentials: credentials)
|
|
99
|
+
else
|
|
100
|
+
configure_aws_region(region)
|
|
101
|
+
smps = SmPs::Client.new
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if param
|
|
105
|
+
parameter = smps.parameter(name: param, type: type, key_id: key_id)
|
|
106
|
+
parameter.write!(value) if value
|
|
107
|
+
puts parameter.to_s
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
return unless by_path
|
|
111
|
+
parameters = smps.parameters_by_path(path: by_path)
|
|
112
|
+
pp parameters
|
|
113
|
+
end
|
|
122
114
|
end
|
|
123
115
|
|
|
124
|
-
|
|
125
|
-
parameters = smps.parameters_by_path(path: by_path)
|
|
126
|
-
pp parameters
|
|
127
|
-
end
|
|
116
|
+
SmpsCLI.new.run
|
|
128
117
|
# vim:set fileencoding=utf8 fileformat=unix filetype=ruby tabstop=2 expandtab:
|
data/lib/smps.rb
CHANGED
|
@@ -1,80 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
require 'smps/parameter'
|
|
3
|
-
require 'aws-sdk-ssm'
|
|
4
|
-
|
|
5
|
-
# SmPs class queries and writes Paramstore parameters
|
|
6
|
-
class SmPs
|
|
7
|
-
def initialize(options = {})
|
|
8
|
-
@credentials = options[:credentials]
|
|
9
|
-
@parameters = {}
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def ssm_client
|
|
13
|
-
@ssm || @ssm = if @credentials.nil?
|
|
14
|
-
Aws::SSM::Client.new
|
|
15
|
-
else
|
|
16
|
-
Aws::SSM::Client.new(credentials: @credentials)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
key_id = options[:key_id]
|
|
24
|
-
unless @parameters.key?(name)
|
|
25
|
-
@parameters[name] = SmPs::Parameter.new(
|
|
26
|
-
ssm: ssm_client,
|
|
27
|
-
name: name, type: type, key_id: key_id
|
|
28
|
-
)
|
|
29
|
-
end
|
|
30
|
-
@parameters[name]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def parameters_by_path(options)
|
|
34
|
-
path = options.fetch(:path)
|
|
35
|
-
recursive = options[:recursive]
|
|
36
|
-
decrypt = options[:decrypt] || true
|
|
37
|
-
@parameters_by_path_list = []
|
|
38
|
-
# while result has 'next_token'
|
|
39
|
-
fetch_more = true
|
|
40
|
-
next_token = nil
|
|
41
|
-
while fetch_more
|
|
42
|
-
params = ssm_client.get_parameters_by_path(
|
|
43
|
-
path: path,
|
|
44
|
-
recursive: recursive,
|
|
45
|
-
with_decryption: decrypt,
|
|
46
|
-
next_token: next_token
|
|
47
|
-
)
|
|
48
|
-
if params.next_token
|
|
49
|
-
next_token = params.next_token
|
|
50
|
-
else
|
|
51
|
-
fetch_more = false
|
|
52
|
-
end
|
|
53
|
-
store_parameters params
|
|
54
|
-
end
|
|
55
|
-
@parameters_by_path_list
|
|
56
|
-
end
|
|
3
|
+
require 'smps/version'
|
|
4
|
+
require 'smps/client'
|
|
5
|
+
require 'smps/aws'
|
|
57
6
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
ssm: ssm_client, fetch: false,
|
|
63
|
-
name: parameter.name, value: parameter.value, type: parameter.type
|
|
64
|
-
)
|
|
65
|
-
@parameters_by_path_list << @parameters[parameter.name]
|
|
66
|
-
end
|
|
7
|
+
# Dummy module. Includes all required classes/libs
|
|
8
|
+
module SmPs
|
|
9
|
+
def self.new(*args)
|
|
10
|
+
Client.new(*args)
|
|
67
11
|
end
|
|
68
|
-
|
|
69
|
-
# def info
|
|
70
|
-
# describe_parameters
|
|
71
|
-
# end
|
|
72
|
-
#
|
|
73
|
-
# def parameter_list
|
|
74
|
-
# get_parameters
|
|
75
|
-
# end
|
|
76
|
-
#
|
|
77
|
-
# def by_path
|
|
78
|
-
# get_parameters_by_path
|
|
79
|
-
# end
|
|
80
12
|
end
|
data/lib/smps/aws.rb
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'net/http'
|
|
4
|
+
require 'uri'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'yaml'
|
|
7
|
+
|
|
8
|
+
module SmPs
|
|
9
|
+
# Some helpers to setup and interact with various aws services.
|
|
10
|
+
module AwsHelpers
|
|
11
|
+
SSM_PARAMETER_TYPES = %w[String StringList SecureString].freeze
|
|
12
|
+
DEFAULT_USERDATA_URI = 'http://169.254.169.254/latest/user-data'
|
|
13
|
+
|
|
14
|
+
def aws_region
|
|
15
|
+
@aws_region ||= initialize_aws_region
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def retrieve_from_userdata(key, userdata_type = :auto, source = DEFAULT_USERDATA_URI)
|
|
19
|
+
userdata = user_data(source, userdata_type)
|
|
20
|
+
userdata[key]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def user_data(source, type = :auto)
|
|
24
|
+
@user_data ||= initialize_user_data(source, type)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def credentials_from_role(role, debug = false)
|
|
28
|
+
@aws_session ||= initialize_aws_session_from_role(role, debug)
|
|
29
|
+
@aws_session.credentials
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def configure_aws_region(region = nil)
|
|
33
|
+
if region
|
|
34
|
+
::Aws.config.update(region: region)
|
|
35
|
+
else
|
|
36
|
+
::Aws.config.update(region: aws_region)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def initialize_aws_session_from_role(role, debug)
|
|
43
|
+
require 'awssession'
|
|
44
|
+
require 'aws_config'
|
|
45
|
+
profile = AWSConfig[role]
|
|
46
|
+
profile['name'] = role
|
|
47
|
+
session = AwsSession.new(profile: profile, debug: debug)
|
|
48
|
+
session.start
|
|
49
|
+
session
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def initialize_user_data(source, type)
|
|
53
|
+
data = get_resource(source)
|
|
54
|
+
case type
|
|
55
|
+
when 'yaml', :yaml
|
|
56
|
+
parse_yaml(data, true)
|
|
57
|
+
when 'json', :json
|
|
58
|
+
parse_json(data, true)
|
|
59
|
+
else
|
|
60
|
+
parse_auto(data)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def parse_auto(data)
|
|
65
|
+
parsed = parse_yaml(data)
|
|
66
|
+
parsed = parse_json(data) if parsed.nil?
|
|
67
|
+
raise ArgumentError, 'Could not determine the format of the user-data' if parsed.nil?
|
|
68
|
+
parsed
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def parse_json(json, raise = false)
|
|
72
|
+
JSON.parse(json)
|
|
73
|
+
rescue JSON::ParserError => e
|
|
74
|
+
raise e if raise
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def parse_yaml(yaml, raise = false)
|
|
79
|
+
YAML.safe_load(yaml)
|
|
80
|
+
rescue YAML::ParseError => e
|
|
81
|
+
raise e if raise
|
|
82
|
+
nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def initialize_aws_region
|
|
86
|
+
url = 'http://169.254.169.254/latest/dynamic/instance-identity/document'
|
|
87
|
+
JSON.parse(get_resource(url))['region']
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def get_resource(url)
|
|
91
|
+
uri = URI.parse(url)
|
|
92
|
+
return File.read(url) unless %w[http https].include?(uri.scheme)
|
|
93
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
94
|
+
http.read_timeout = 2
|
|
95
|
+
http.open_timeout = 2
|
|
96
|
+
response = http.start { |h| h.get(uri.path) }
|
|
97
|
+
response.body
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
data/lib/smps/client.rb
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'smps/version'
|
|
4
|
+
require 'smps/parameter'
|
|
5
|
+
require 'aws-sdk-ssm'
|
|
6
|
+
|
|
7
|
+
module SmPs
|
|
8
|
+
# Presents a client interface with parameter parsing to aws ssm
|
|
9
|
+
# Allows querying and writing Paramstore parameters.
|
|
10
|
+
class Client
|
|
11
|
+
def initialize(options = {})
|
|
12
|
+
@credentials = options[:credentials]
|
|
13
|
+
@parameters = {}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Creates (if needed) and returns the ssm_client.
|
|
17
|
+
def ssm_client
|
|
18
|
+
@ssm_client ||= initialize_ssm_client
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Creates a new SmPs::Parameter from the given options hash.
|
|
22
|
+
def parameter(options)
|
|
23
|
+
name = options.fetch(:name)
|
|
24
|
+
type = options[:type]
|
|
25
|
+
key_id = options[:key_id]
|
|
26
|
+
unless @parameters.key?(name)
|
|
27
|
+
@parameters[name] = SmPs::Parameter.new(
|
|
28
|
+
ssm: ssm_client,
|
|
29
|
+
name: name, type: type, key_id: key_id
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
@parameters[name]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Creates a list of all parameters filtered by path.
|
|
36
|
+
def parameters_by_path(options)
|
|
37
|
+
@parameters_by_path_list = []
|
|
38
|
+
next_token = nil
|
|
39
|
+
while (params = get_parameters_by_path_with_token(options, next_token))
|
|
40
|
+
store_parameters params
|
|
41
|
+
next_token = params.next_token
|
|
42
|
+
break if next_token.nil? || next_token.empty?
|
|
43
|
+
end
|
|
44
|
+
@parameters_by_path_list
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
protected
|
|
48
|
+
|
|
49
|
+
# Get a parameter list by path using the next_token (if provided)
|
|
50
|
+
def get_parameters_by_path_with_token(options, next_token = nil)
|
|
51
|
+
ssm_client.get_parameters_by_path(
|
|
52
|
+
path: options.fetch(:path),
|
|
53
|
+
recursive: options[:recursive],
|
|
54
|
+
with_decryption: options.fetch(:decrypt, true),
|
|
55
|
+
next_token: next_token
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def store_parameters(params)
|
|
62
|
+
return if params.nil?
|
|
63
|
+
params.parameters.each do |parameter|
|
|
64
|
+
@parameters[parameter.name] = SmPs::Parameter.new(
|
|
65
|
+
ssm: ssm_client, fetch: false,
|
|
66
|
+
name: parameter.name, value: parameter.value, type: parameter.type
|
|
67
|
+
)
|
|
68
|
+
@parameters_by_path_list << @parameters[parameter.name]
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# def info
|
|
73
|
+
# describe_parameters
|
|
74
|
+
# end
|
|
75
|
+
#
|
|
76
|
+
# def parameter_list
|
|
77
|
+
# get_parameters
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# def by_path
|
|
81
|
+
# get_parameters_by_path
|
|
82
|
+
# end
|
|
83
|
+
|
|
84
|
+
def initialize_ssm_client
|
|
85
|
+
if @credentials.nil?
|
|
86
|
+
Aws::SSM::Client.new
|
|
87
|
+
else
|
|
88
|
+
Aws::SSM::Client.new(credentials: @credentials)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
data/lib/smps/parameter.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
|
|
2
|
-
|
|
3
|
+
module SmPs
|
|
3
4
|
# SmPs Parameter management
|
|
4
5
|
class Parameter
|
|
5
6
|
attr_accessor :name, :type, :key_id, :decrypt, :description
|
|
@@ -11,11 +12,11 @@ class SmPs
|
|
|
11
12
|
@type = options[:type]
|
|
12
13
|
@key_id = options[:key_id]
|
|
13
14
|
@decrypt = options[:decrypt] || true
|
|
14
|
-
fetch = options[:fetch]
|
|
15
|
-
fetch = true if options[:fetch].nil?
|
|
15
|
+
fetch = options[:fetch] || true
|
|
16
16
|
parameter if fetch
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
# Gets a parameter from Aws SSM.
|
|
19
20
|
def parameter
|
|
20
21
|
resp = @ssm.get_parameter(
|
|
21
22
|
name: @name, with_decryption: @decrypt
|
|
@@ -27,15 +28,18 @@ class SmPs
|
|
|
27
28
|
@exists = false
|
|
28
29
|
end
|
|
29
30
|
|
|
31
|
+
# Prints the current value.
|
|
30
32
|
def to_s
|
|
31
33
|
@value
|
|
32
34
|
end
|
|
33
35
|
|
|
36
|
+
# Returns the value (String) or array if the `type` is StringList
|
|
34
37
|
def value
|
|
35
38
|
return @value.split(',') if @type == 'StringList'
|
|
36
39
|
@value
|
|
37
40
|
end
|
|
38
41
|
|
|
42
|
+
# Set the value and mark the parameter as changed.
|
|
39
43
|
def value=(value)
|
|
40
44
|
@changed = true if value != @value
|
|
41
45
|
@value = value
|
|
@@ -45,6 +49,7 @@ class SmPs
|
|
|
45
49
|
@exists
|
|
46
50
|
end
|
|
47
51
|
|
|
52
|
+
# Updates the parameter in the parameter store (remote).
|
|
48
53
|
def write!(value = nil)
|
|
49
54
|
@changed = true if value != @value
|
|
50
55
|
@value = value if value
|
|
@@ -56,10 +61,12 @@ class SmPs
|
|
|
56
61
|
@value
|
|
57
62
|
end
|
|
58
63
|
|
|
64
|
+
# Not implemented yet.
|
|
59
65
|
def history
|
|
60
66
|
# get_parameter_history
|
|
61
67
|
end
|
|
62
68
|
|
|
69
|
+
# Not implemented yet.
|
|
63
70
|
def tag
|
|
64
71
|
# add_tags_to_resource
|
|
65
72
|
# remove_tags_from_resource
|
data/lib/smps/version.rb
CHANGED
data/license.txt
CHANGED
metadata
CHANGED
|
@@ -1,99 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: smps
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stefan - Zipkid - Goethals
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-04-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: bundler
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.15'
|
|
20
|
-
type: :development
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.15'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: rake
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '10.0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - "~>"
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '10.0'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: rspec
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '3.0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '3.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: aws_config
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: awssession
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: awesome_print
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
13
|
- !ruby/object:Gem::Dependency
|
|
98
14
|
name: aws-sdk-core
|
|
99
15
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -122,7 +38,7 @@ dependencies:
|
|
|
122
38
|
- - "~>"
|
|
123
39
|
- !ruby/object:Gem::Version
|
|
124
40
|
version: '1.0'
|
|
125
|
-
description: SMPS - Systems Manager Parameter Store
|
|
41
|
+
description: SMPS - Systems Manager Parameter Store.
|
|
126
42
|
email:
|
|
127
43
|
- stefan.goethals@vrt.be
|
|
128
44
|
executables:
|
|
@@ -130,23 +46,15 @@ executables:
|
|
|
130
46
|
extensions: []
|
|
131
47
|
extra_rdoc_files: []
|
|
132
48
|
files:
|
|
133
|
-
- ".gitignore"
|
|
134
|
-
- ".rspec"
|
|
135
|
-
- ".travis.yml"
|
|
136
|
-
- Gemfile
|
|
137
49
|
- README.md
|
|
138
|
-
- Rakefile
|
|
139
|
-
- bin/console
|
|
140
|
-
- bin/setup
|
|
141
|
-
- bin/smps-use-ec2.rb
|
|
142
|
-
- bin/smps-use.rb
|
|
143
50
|
- changelog.md
|
|
144
51
|
- exe/smps
|
|
145
52
|
- lib/smps.rb
|
|
53
|
+
- lib/smps/aws.rb
|
|
54
|
+
- lib/smps/client.rb
|
|
146
55
|
- lib/smps/parameter.rb
|
|
147
56
|
- lib/smps/version.rb
|
|
148
57
|
- license.txt
|
|
149
|
-
- smps.gemspec
|
|
150
58
|
homepage: http://github.com/vrtdev/smps
|
|
151
59
|
licenses:
|
|
152
60
|
- MIT
|
|
@@ -158,17 +66,16 @@ require_paths:
|
|
|
158
66
|
- lib
|
|
159
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
68
|
requirements:
|
|
161
|
-
- - "
|
|
69
|
+
- - "~>"
|
|
162
70
|
- !ruby/object:Gem::Version
|
|
163
|
-
version: '
|
|
71
|
+
version: '2.1'
|
|
164
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
73
|
requirements:
|
|
166
74
|
- - ">="
|
|
167
75
|
- !ruby/object:Gem::Version
|
|
168
76
|
version: '0'
|
|
169
77
|
requirements: []
|
|
170
|
-
|
|
171
|
-
rubygems_version: 2.6.13
|
|
78
|
+
rubygems_version: 3.0.2
|
|
172
79
|
signing_key:
|
|
173
80
|
specification_version: 4
|
|
174
81
|
summary: SMPS - Systems Manager Parameter Store
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
data/bin/console
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require "bundler/setup"
|
|
4
|
-
require "smps"
|
|
5
|
-
|
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
|
8
|
-
|
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
10
|
-
# require "pry"
|
|
11
|
-
# Pry.start
|
|
12
|
-
|
|
13
|
-
require "irb"
|
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/bin/smps-use-ec2.rb
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require 'smps'
|
|
4
|
-
|
|
5
|
-
smps = SmPs.new
|
|
6
|
-
param_abc = smps.parameter(name: 'abc')
|
|
7
|
-
puts param_abc.to_s
|
|
8
|
-
|
|
9
|
-
param_abc.write!('xyz')
|
|
10
|
-
puts param_abc.to_s
|
|
11
|
-
|
|
12
|
-
param_abc.write!('Another value.')
|
|
13
|
-
puts param_abc.to_s
|
|
14
|
-
|
|
15
|
-
param_z = smps.parameter(name: '/Zipkid/test1')
|
|
16
|
-
puts param_z.to_s
|
data/bin/smps-use.rb
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require 'awssession'
|
|
4
|
-
require 'smps'
|
|
5
|
-
|
|
6
|
-
require 'aws_config'
|
|
7
|
-
require 'awesome_print'
|
|
8
|
-
|
|
9
|
-
profile_name = ARGV[0]
|
|
10
|
-
profile = AWSConfig[profile_name]
|
|
11
|
-
profile['name'] = profile_name
|
|
12
|
-
|
|
13
|
-
awssession = AwsSession.new(profile: profile)
|
|
14
|
-
awssession.start
|
|
15
|
-
|
|
16
|
-
smps = SmPs.new(credentials: awssession.credentials)
|
|
17
|
-
|
|
18
|
-
puts '1'
|
|
19
|
-
pl = smps.parameters_by_path(path: '/aem/dev/aem--author/packages')
|
|
20
|
-
puts '2'
|
|
21
|
-
# ap pl
|
|
22
|
-
pl.each do |p|
|
|
23
|
-
puts ' ---- '
|
|
24
|
-
ap p
|
|
25
|
-
puts p.name
|
|
26
|
-
ap p.value
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# exit
|
|
30
|
-
|
|
31
|
-
# param = smps.parameter(name: 'abc')
|
|
32
|
-
param_abc = smps.parameter(name: 'abc')
|
|
33
|
-
puts param_abc.to_s
|
|
34
|
-
# puts "#{param_abc}"
|
|
35
|
-
|
|
36
|
-
param_abc.write!('xyz')
|
|
37
|
-
puts param_abc.to_s
|
|
38
|
-
# OR
|
|
39
|
-
param_abc.value = 'def'
|
|
40
|
-
param_abc.write!
|
|
41
|
-
puts param_abc.to_s
|
|
42
|
-
|
|
43
|
-
param_z = smps.parameter(name: '/Zipkid/test1')
|
|
44
|
-
puts param_z.to_s
|
data/smps.gemspec
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
-
|
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require 'smps/version'
|
|
5
|
-
|
|
6
|
-
Gem::Specification.new do |spec|
|
|
7
|
-
spec.name = 'smps'
|
|
8
|
-
spec.version = SmPs::VERSION
|
|
9
|
-
spec.licenses = ['MIT']
|
|
10
|
-
spec.authors = ['Stefan - Zipkid - Goethals']
|
|
11
|
-
spec.email = ['stefan.goethals@vrt.be']
|
|
12
|
-
|
|
13
|
-
spec.summary = 'SMPS - Systems Manager Parameter Store'
|
|
14
|
-
spec.description = 'SMPS - Systems Manager Parameter Store'
|
|
15
|
-
spec.homepage = 'http://github.com/vrtdev/smps'
|
|
16
|
-
|
|
17
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
|
18
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
|
19
|
-
if spec.respond_to?(:metadata)
|
|
20
|
-
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
21
|
-
else
|
|
22
|
-
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
|
23
|
-
'public gem pushes.'
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
27
|
-
f.match(%r{^(test|spec|features)/})
|
|
28
|
-
end
|
|
29
|
-
spec.bindir = 'exe'
|
|
30
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
31
|
-
spec.require_paths = ['lib']
|
|
32
|
-
|
|
33
|
-
spec.add_development_dependency 'bundler', '~> 1.15'
|
|
34
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
|
35
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
36
|
-
spec.add_development_dependency 'aws_config'
|
|
37
|
-
spec.add_development_dependency 'awssession'
|
|
38
|
-
spec.add_development_dependency 'awesome_print'
|
|
39
|
-
|
|
40
|
-
spec.add_runtime_dependency 'aws-sdk-core', '~> 3.0'
|
|
41
|
-
spec.add_runtime_dependency 'aws-sdk-ssm', '~> 1.0'
|
|
42
|
-
end
|