stack_master 1.1.0 → 1.2.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 +15 -0
- data/features/apply_with_parameter_store_parameters.feature +47 -0
- data/features/step_definitions/parameter_store_steps.rb +14 -0
- data/lib/stack_master.rb +1 -0
- data/lib/stack_master/parameter_resolvers/parameter_store.rb +31 -0
- data/lib/stack_master/version.rb +1 -1
- data/spec/stack_master/parameter_resolvers/parameter_store_spec.rb +50 -0
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 77c6c6c758e05af556c50439bfdf5dce99720a8deb44f485f0e17bcbd82890a6
|
4
|
+
data.tar.gz: 8f467f0f94b7e963afac93400d4f2c4152a3cbc6e12dc0949ed8fcfc857f5d9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f32beb39936cbe533bf08949f2a9657f69dc353dda6bf12f9d98d4736a00060d3745baec090d02fb02288d7abf739a923c0d21af6f7d77f27d2540b67971535d
|
7
|
+
data.tar.gz: 467c51b8edc25e774f20ab3a804b8d44f3559bbde1e9c7817f67935d8a1a4a577d7d4f3181650c48bfa708b11a314213c1ae40e44a546dd03ba882ef225608a1
|
data/README.md
CHANGED
@@ -240,6 +240,21 @@ db_password:
|
|
240
240
|
secret: db_password
|
241
241
|
```
|
242
242
|
|
243
|
+
### Parameter Store
|
244
|
+
An alternative to the secrets store, uses the AWS SSM Parameter store to protect
|
245
|
+
secrets. Expects a parameter of either `String` or `SecureString` type to be present in the
|
246
|
+
same region as the stack. You can store the parameter using a command like this
|
247
|
+
|
248
|
+
`aws ssm put-parameter --region <region> --name <parameter name> --value <secret> --type (String|SecureString)`
|
249
|
+
|
250
|
+
When doing so make sure you don't accidentally store the secret in your `.bash_history` and
|
251
|
+
you will likely want to set the parameter to NoEcho in your template.
|
252
|
+
|
253
|
+
```yaml
|
254
|
+
db_password:
|
255
|
+
parameter_store: ssm_parameter_name
|
256
|
+
```
|
257
|
+
|
243
258
|
### Security Group
|
244
259
|
|
245
260
|
Looks up a security group by name and returns the ARN.
|
@@ -0,0 +1,47 @@
|
|
1
|
+
Feature: Apply command with parameter_store parameter
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a file named "stack_master.yml" with:
|
5
|
+
"""
|
6
|
+
stacks:
|
7
|
+
us-east-2:
|
8
|
+
vpc:
|
9
|
+
template: vpc.rb
|
10
|
+
"""
|
11
|
+
And a directory named "parameters"
|
12
|
+
And a file named "parameters/vpc.yml" with:
|
13
|
+
"""
|
14
|
+
vpc_cidr:
|
15
|
+
parameter_store: "/cucumber-test-vpc-cidr"
|
16
|
+
"""
|
17
|
+
And a SSM parameter named "/cucumber-test-vpc-cidr" with value "10.0.0.0/16" in region "us-east-2"
|
18
|
+
And a directory named "templates"
|
19
|
+
And a file named "templates/vpc.rb" with:
|
20
|
+
"""
|
21
|
+
SparkleFormation.new(:vpc) do
|
22
|
+
|
23
|
+
parameters.vpc_cidr do
|
24
|
+
type 'String'
|
25
|
+
end
|
26
|
+
|
27
|
+
resources.vpc do
|
28
|
+
type 'AWS::EC2::VPC'
|
29
|
+
properties do
|
30
|
+
cidr_block ref!(:vpc_cidr)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
"""
|
36
|
+
|
37
|
+
Scenario: Run apply and create a new stack
|
38
|
+
Given I stub the following stack events:
|
39
|
+
| stack_id | event_id | stack_name | logical_resource_id | resource_status | resource_type | timestamp |
|
40
|
+
| 1 | 1 | vpc | Vpc | CREATE_COMPLETE | AWS::EC2::VPC | 2020-10-29 00:00:00 |
|
41
|
+
| 1 | 1 | vpc | vpc | CREATE_COMPLETE | AWS::CloudFormation::Stack | 2020-10-29 00:00:00 |
|
42
|
+
When I run `stack_master apply us-east-2 vpc --trace`
|
43
|
+
And the output should contain all of these lines:
|
44
|
+
| +--- |
|
45
|
+
| +VpcCidr: 10.0.0.0/16 |
|
46
|
+
And the output should match /2020-10-29 00:00:00 (\+|\-)[0-9]{4} vpc AWS::CloudFormation::Stack CREATE_COMPLETE/
|
47
|
+
Then the exit status should be 0
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Given(/^(?:a|the) SSM parameter(?: named)? "([^"]*)" with value "([^"]*)" in region "([^"]*)"$/) do |parameter_name, parameter_value, parameter_region|
|
2
|
+
Aws.config[:ssm] = {
|
3
|
+
stub_responses: {
|
4
|
+
get_parameter: {
|
5
|
+
parameter: {
|
6
|
+
name: parameter_name,
|
7
|
+
value: parameter_value,
|
8
|
+
type: "SecureString",
|
9
|
+
version: 1
|
10
|
+
}
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
end
|
data/lib/stack_master.rb
CHANGED
@@ -61,6 +61,7 @@ module StackMaster
|
|
61
61
|
autoload :LatestAmiByTags, 'stack_master/parameter_resolvers/latest_ami_by_tags'
|
62
62
|
autoload :LatestAmi, 'stack_master/parameter_resolvers/latest_ami'
|
63
63
|
autoload :Env, 'stack_master/parameter_resolvers/env'
|
64
|
+
autoload :ParameterStore, 'stack_master/parameter_resolvers/parameter_store'
|
64
65
|
end
|
65
66
|
|
66
67
|
module AwsDriver
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module StackMaster
|
2
|
+
module ParameterResolvers
|
3
|
+
class ParameterStore < Resolver
|
4
|
+
|
5
|
+
ParameterNotFound = Class.new(StandardError)
|
6
|
+
|
7
|
+
def initialize(config, stack_definition)
|
8
|
+
@config = config
|
9
|
+
@stack_definition = stack_definition
|
10
|
+
end
|
11
|
+
|
12
|
+
def resolve(value)
|
13
|
+
begin
|
14
|
+
resp = ssm.get_parameter(
|
15
|
+
name: value,
|
16
|
+
with_decryption: true
|
17
|
+
)
|
18
|
+
rescue Aws::SSM::Errors::ParameterNotFound
|
19
|
+
raise ParameterNotFound, "Unable to find #{value} in Parameter Store"
|
20
|
+
end
|
21
|
+
resp.parameter.value
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def ssm
|
27
|
+
@ssm ||= Aws::SSM::Client.new(region: @stack_definition.region)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/stack_master/version.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
RSpec.describe StackMaster::ParameterResolvers::ParameterStore do
|
2
|
+
|
3
|
+
describe '#resolve' do
|
4
|
+
|
5
|
+
let(:config) { double(base_dir: '/base') }
|
6
|
+
let(:stack_definition) { double(stack_name: 'mystack', region: 'us-east-1') }
|
7
|
+
subject(:resolver) { described_class.new(config, stack_definition) }
|
8
|
+
let(:parameter_name) { 'TEST' }
|
9
|
+
let(:parameter_value) { 'TEST' }
|
10
|
+
let(:unknown_parameter_name) { 'NOTEST' }
|
11
|
+
let(:unencryptable_parameter_name) { 'SECRETTEST' }
|
12
|
+
|
13
|
+
|
14
|
+
context 'the parameter is defined' do
|
15
|
+
before do
|
16
|
+
Aws.config[:ssm] = {
|
17
|
+
stub_responses: {
|
18
|
+
get_parameter: {
|
19
|
+
parameter: {
|
20
|
+
name: parameter_name,
|
21
|
+
value: parameter_value,
|
22
|
+
type: "SecureString",
|
23
|
+
version: 1
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should return the parameter value' do
|
31
|
+
expect(resolver.resolve(parameter_name)).to eq parameter_value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'the parameter is undefined' do
|
36
|
+
before do
|
37
|
+
Aws.config[:ssm] = {
|
38
|
+
stub_responses: {
|
39
|
+
get_parameter:
|
40
|
+
Aws::SSM::Errors::ParameterNotFound.new(unknown_parameter_name, "Parameter #{unknown_parameter_name} not found")
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
it 'should raise and error' do
|
45
|
+
expect { resolver.resolve(unknown_parameter_name) }
|
46
|
+
.to raise_error(StackMaster::ParameterResolvers::ParameterStore::ParameterNotFound, "Unable to find #{unknown_parameter_name} in Parameter Store")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stack_master
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Hodgkiss
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-02-
|
12
|
+
date: 2018-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -304,6 +304,7 @@ files:
|
|
304
304
|
- features/apply.feature
|
305
305
|
- features/apply_with_compile_time_parameters.feature
|
306
306
|
- features/apply_with_env_parameters.feature
|
307
|
+
- features/apply_with_parameter_store_parameters.feature
|
307
308
|
- features/apply_with_s3.feature
|
308
309
|
- features/delete.feature
|
309
310
|
- features/diff.feature
|
@@ -314,6 +315,7 @@ files:
|
|
314
315
|
- features/resources.feature
|
315
316
|
- features/stack_defaults.feature
|
316
317
|
- features/status.feature
|
318
|
+
- features/step_definitions/parameter_store_steps.rb
|
317
319
|
- features/step_definitions/stack_steps.rb
|
318
320
|
- features/support/env.rb
|
319
321
|
- features/validate.feature
|
@@ -343,6 +345,7 @@ files:
|
|
343
345
|
- lib/stack_master/parameter_resolvers/env.rb
|
344
346
|
- lib/stack_master/parameter_resolvers/latest_ami.rb
|
345
347
|
- lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb
|
348
|
+
- lib/stack_master/parameter_resolvers/parameter_store.rb
|
346
349
|
- lib/stack_master/parameter_resolvers/secret.rb
|
347
350
|
- lib/stack_master/parameter_resolvers/security_group.rb
|
348
351
|
- lib/stack_master/parameter_resolvers/sns_topic_name.rb
|
@@ -417,6 +420,7 @@ files:
|
|
417
420
|
- spec/stack_master/parameter_resolvers/env_spec.rb
|
418
421
|
- spec/stack_master/parameter_resolvers/latest_ami_by_tags_spec.rb
|
419
422
|
- spec/stack_master/parameter_resolvers/latest_ami_spec.rb
|
423
|
+
- spec/stack_master/parameter_resolvers/parameter_store_spec.rb
|
420
424
|
- spec/stack_master/parameter_resolvers/secret_spec.rb
|
421
425
|
- spec/stack_master/parameter_resolvers/security_group_spec.rb
|
422
426
|
- spec/stack_master/parameter_resolvers/security_groups_spec.rb
|
@@ -485,7 +489,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
485
489
|
version: '0'
|
486
490
|
requirements: []
|
487
491
|
rubyforge_project:
|
488
|
-
rubygems_version: 2.6
|
492
|
+
rubygems_version: 2.7.6
|
489
493
|
signing_key:
|
490
494
|
specification_version: 4
|
491
495
|
summary: StackMaster is a sure-footed way of creating, updating and keeping track
|
@@ -494,6 +498,7 @@ test_files:
|
|
494
498
|
- features/apply.feature
|
495
499
|
- features/apply_with_compile_time_parameters.feature
|
496
500
|
- features/apply_with_env_parameters.feature
|
501
|
+
- features/apply_with_parameter_store_parameters.feature
|
497
502
|
- features/apply_with_s3.feature
|
498
503
|
- features/delete.feature
|
499
504
|
- features/diff.feature
|
@@ -504,6 +509,7 @@ test_files:
|
|
504
509
|
- features/resources.feature
|
505
510
|
- features/stack_defaults.feature
|
506
511
|
- features/status.feature
|
512
|
+
- features/step_definitions/parameter_store_steps.rb
|
507
513
|
- features/step_definitions/stack_steps.rb
|
508
514
|
- features/support/env.rb
|
509
515
|
- features/validate.feature
|
@@ -533,6 +539,7 @@ test_files:
|
|
533
539
|
- spec/stack_master/parameter_resolvers/env_spec.rb
|
534
540
|
- spec/stack_master/parameter_resolvers/latest_ami_by_tags_spec.rb
|
535
541
|
- spec/stack_master/parameter_resolvers/latest_ami_spec.rb
|
542
|
+
- spec/stack_master/parameter_resolvers/parameter_store_spec.rb
|
536
543
|
- spec/stack_master/parameter_resolvers/secret_spec.rb
|
537
544
|
- spec/stack_master/parameter_resolvers/security_group_spec.rb
|
538
545
|
- spec/stack_master/parameter_resolvers/security_groups_spec.rb
|