convection 0.0.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +26 -8
  4. data/.rubocop_todo.yml +77 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +10 -0
  7. data/Gemfile +9 -0
  8. data/README.md +27 -2
  9. data/Rakefile +11 -1
  10. data/bin/convection +49 -0
  11. data/convection.gemspec +5 -7
  12. data/example/.ruby-version +1 -0
  13. data/example/Cloudfile +13 -0
  14. data/example/deprecated/elb.rb +27 -0
  15. data/example/deprecated/iam_access_key.rb +18 -0
  16. data/example/deprecated/iam_group.rb +31 -0
  17. data/example/{iam_role.rb → deprecated/iam_role.rb} +21 -32
  18. data/example/deprecated/iam_user.rb +31 -0
  19. data/example/deprecated/rds.rb +70 -0
  20. data/example/{s3.rb → deprecated/s3.rb} +0 -0
  21. data/example/deprecated/sqs.rb +32 -0
  22. data/example/deprecated/vpc.rb +85 -0
  23. data/example/foobar.rb +22 -0
  24. data/example/output/vpc.json +335 -0
  25. data/example/security-groups.rb +40 -0
  26. data/example/trust_cloudtrail.rb +24 -0
  27. data/example/vpc.rb +63 -81
  28. data/ext/resource_generator.sh +21 -0
  29. data/lib/convection.rb +5 -4
  30. data/lib/convection/control/cloud.rb +59 -0
  31. data/lib/convection/control/stack.rb +261 -60
  32. data/lib/convection/dsl/helpers.rb +63 -5
  33. data/lib/convection/model/attributes.rb +60 -0
  34. data/lib/convection/model/cloudfile.rb +58 -0
  35. data/lib/convection/model/diff.rb +39 -0
  36. data/lib/convection/model/event.rb +62 -0
  37. data/lib/convection/model/exceptions.rb +18 -0
  38. data/lib/convection/model/mixin/cidr_block.rb +4 -4
  39. data/lib/convection/model/mixin/colorize.rb +20 -0
  40. data/lib/convection/model/mixin/conditional.rb +1 -3
  41. data/lib/convection/model/mixin/policy.rb +89 -0
  42. data/lib/convection/model/mixin/protocol.rb +29 -0
  43. data/lib/convection/model/mixin/taggable.rb +2 -2
  44. data/lib/convection/model/template.rb +248 -21
  45. data/lib/convection/model/template/condition.rb +56 -0
  46. data/lib/convection/model/template/mapping.rb +4 -3
  47. data/lib/convection/model/template/output.rb +9 -7
  48. data/lib/convection/model/template/parameter.rb +19 -4
  49. data/lib/convection/model/template/resource.rb +317 -23
  50. data/lib/convection/model/template/resource/aws_auto_scaling_auto_scaling_group.rb +39 -0
  51. data/lib/convection/model/template/resource/aws_auto_scaling_launch_configuration.rb +30 -0
  52. data/lib/convection/model/template/resource/aws_auto_scaling_scaling_policy.rb +20 -0
  53. data/lib/convection/model/template/resource/aws_cloud_watch_alarm.rb +31 -0
  54. data/lib/convection/model/template/resource/aws_ec2_instance.rb +10 -46
  55. data/lib/convection/model/template/resource/aws_ec2_internet_gateway.rb +3 -14
  56. data/lib/convection/model/template/resource/aws_ec2_network_acl.rb +45 -0
  57. data/lib/convection/model/template/resource/aws_ec2_network_acl_entry.rb +27 -0
  58. data/lib/convection/model/template/resource/aws_ec2_route.rb +7 -40
  59. data/lib/convection/model/template/resource/aws_ec2_route_table.rb +2 -17
  60. data/lib/convection/model/template/resource/aws_ec2_security_group.rb +24 -30
  61. data/lib/convection/model/template/resource/aws_ec2_security_group_ingres.rb +25 -0
  62. data/lib/convection/model/template/resource/aws_ec2_subnet.rb +21 -28
  63. data/lib/convection/model/template/resource/aws_ec2_subnet_network_acl_association.rb +18 -0
  64. data/lib/convection/model/template/resource/aws_ec2_subnet_route_table_association.rb +3 -24
  65. data/lib/convection/model/template/resource/aws_ec2_vpc.rb +20 -22
  66. data/lib/convection/model/template/resource/aws_ec2_vpc_gateway_attachment.rb +4 -28
  67. data/lib/convection/model/template/resource/aws_elasticache_cluster.rb +24 -0
  68. data/lib/convection/model/template/resource/aws_elasticache_parameter_group.rb +19 -0
  69. data/lib/convection/model/template/resource/aws_elasticache_security_group.rb +17 -0
  70. data/lib/convection/model/template/resource/aws_elasticache_security_group_ingress.rb +19 -0
  71. data/lib/convection/model/template/resource/aws_elb.rb +39 -0
  72. data/lib/convection/model/template/resource/aws_iam_access_key.rb +19 -0
  73. data/lib/convection/model/template/resource/aws_iam_group.rb +18 -0
  74. data/lib/convection/model/template/resource/aws_iam_instance_profile.rb +21 -0
  75. data/lib/convection/model/template/resource/aws_iam_policy.rb +28 -24
  76. data/lib/convection/model/template/resource/aws_iam_role.rb +88 -19
  77. data/lib/convection/model/template/resource/aws_iam_user.rb +53 -0
  78. data/lib/convection/model/template/resource/aws_logs_loggroup.rb +33 -0
  79. data/lib/convection/model/template/resource/aws_rds_db_instance.rb +59 -0
  80. data/lib/convection/model/template/resource/aws_rds_db_parameter_group.rb +27 -0
  81. data/lib/convection/model/template/resource/aws_rds_db_security_group.rb +40 -0
  82. data/lib/convection/model/template/resource/aws_rds_db_subnet_group.rb +26 -0
  83. data/lib/convection/model/template/resource/aws_route53_health_check.rb +17 -0
  84. data/lib/convection/model/template/resource/aws_route53_recordset.rb +30 -0
  85. data/lib/convection/model/template/resource/aws_s3_bucket.rb +8 -44
  86. data/lib/convection/model/template/resource/aws_s3_bucket_policy.rb +14 -19
  87. data/lib/convection/model/template/resource/aws_sns_topic.rb +19 -0
  88. data/lib/convection/model/template/resource/aws_sqs_queue.rb +31 -0
  89. data/lib/convection/model/template/resource/aws_sqs_queue_policy.rb +18 -0
  90. data/test/convection/model/test_conditions.rb +121 -0
  91. data/test/convection/model/test_elasticache.rb +97 -0
  92. data/test/convection/model/test_loggroups.rb +25 -0
  93. data/test/convection/model/test_rds.rb +76 -0
  94. data/test/convection/model/test_template.rb +64 -0
  95. data/test/convection/model/test_validation.rb +216 -0
  96. data/test/test_helper.rb +17 -0
  97. metadata +131 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0e40b87f41fe55c9ae72164fb2f4bfd6a65b7e6
4
- data.tar.gz: 6c2136c2a50025cbc8ab781362717afbd919bde4
3
+ metadata.gz: 075a28b9e49edf4315587f8de99945362fd9e837
4
+ data.tar.gz: 97a5572cf09f71edca02765fda206d77483bbfc0
5
5
  SHA512:
6
- metadata.gz: 73e16b10a0ff8accc52f4f50840ce91638d28e83df66b258b6b577f7955733aa471c621054eabd272ac2d62f3dfee6d9c28f4e2494f3cdc948341f7d31f02cf1
7
- data.tar.gz: 6170446d0c4ccd1cc348b596529c11917017323df2c25f8983f2ea598f3ccc05fed5c37797c4bb1db90bb457096a43bd46b3008de09ef0fb588d88b21d032c46
6
+ metadata.gz: 7c0a82cfe5c746882ca8d48c45929ed0a136d27def8f98bd59a5a3394c4ea00ce5ecf4c19ddd30dd17dff84c9f2612ca6b9a9ebe14d103fd0d0ef29acc1f4f13
7
+ data.tar.gz: c2dbf7220245c5c4b4274a40c1db694f5ac3c68b0a954a88418bd4da0270d8359d60f0a63644d93905ace121a226e70f1aad2ca4fdeca5a9988776b570f45844
data/.gitignore CHANGED
@@ -11,6 +11,7 @@
11
11
  *.so
12
12
  *.o
13
13
  *.a
14
+ .DS_Store
14
15
  mkmf.log
15
16
 
16
17
  keys
@@ -1,16 +1,34 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  AllCops:
2
- Exclude:
3
- - libraries/**/*
4
- - spec/**/*
5
- - metadata.rb
4
+ Include:
5
+ - lib/**/*
6
+ - bin/**/*
7
+ - test/**/*
8
+ - Gemfile
9
+ - Rakefile
10
+ - Thorfile
11
+ Exclude:
12
+ - example/**/*
6
13
 
7
14
  Encoding:
8
15
  Enabled: false
9
- LineLength:
16
+ RescueModifier:
10
17
  Enabled: false
11
18
  HashSyntax:
12
19
  Enabled: false
13
- RescueModifier:
20
+ SpaceInsideStringInterpolation:
14
21
  Enabled: false
15
- MethodLength:
16
- Max: 24
22
+
23
+ # AbcSize:
24
+ # Max: 24
25
+ # ClassLength:
26
+ # Max: 256
27
+ # CyclomaticComplexity:
28
+ # Max: 12
29
+ # LineLength:
30
+ # Max: 120
31
+ # MethodLength:
32
+ # Max: 32
33
+ # PerceivedComplexity:
34
+ # Max: 12
@@ -0,0 +1,77 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2015-09-14 17:06:32 -0400 using RuboCop version 0.34.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ Lint/HandleExceptions:
11
+ Exclude:
12
+ - 'lib/convection/control/stack.rb'
13
+
14
+ # Offense count: 1
15
+ Lint/UselessAssignment:
16
+ Exclude:
17
+ - 'lib/convection/model/template.rb'
18
+
19
+ # Offense count: 9
20
+ Metrics/AbcSize:
21
+ Max: 57
22
+
23
+ # Offense count: 1
24
+ # Configuration parameters: CountComments.
25
+ Metrics/ClassLength:
26
+ Max: 267
27
+
28
+ # Offense count: 1
29
+ Metrics/CyclomaticComplexity:
30
+ Max: 13
31
+
32
+ # Offense count: 9
33
+ # Configuration parameters: AllowURI, URISchemes.
34
+ Metrics/LineLength:
35
+ Max: 151
36
+
37
+ # Offense count: 1
38
+ # Configuration parameters: CountComments.
39
+ Metrics/MethodLength:
40
+ Max: 35
41
+
42
+ # Offense count: 1
43
+ Metrics/PerceivedComplexity:
44
+ Max: 13
45
+
46
+ # Offense count: 2
47
+ Style/AccessorMethodName:
48
+ Exclude:
49
+ - 'lib/convection/control/stack.rb'
50
+
51
+ # Offense count: 3
52
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
53
+ Style/ClassAndModuleChildren:
54
+ Exclude:
55
+ - 'lib/convection/model/template.rb'
56
+ - 'test/test_helper.rb'
57
+
58
+ # Offense count: 11
59
+ Style/Documentation:
60
+ Exclude:
61
+ - 'lib/convection/model/attributes.rb'
62
+ - 'lib/convection/model/mixin/colorize.rb'
63
+ - 'lib/convection/model/template/condition.rb'
64
+ - 'test/convection/model/test_conditions.rb'
65
+ - 'test/convection/model/test_elasticache.rb'
66
+ - 'test/convection/model/test_loggroups.rb'
67
+ - 'test/convection/model/test_rds.rb'
68
+ - 'test/convection/model/test_template.rb'
69
+ - 'test/convection/model/test_validation.rb'
70
+ - 'test/test_helper.rb'
71
+
72
+ # Offense count: 1
73
+ # Cop supports --auto-correct.
74
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
75
+ Style/FirstParameterIndentation:
76
+ Exclude:
77
+ - 'lib/convection/model/mixin/taggable.rb'
@@ -0,0 +1 @@
1
+ 2.2.2
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.3
5
+ - 2.1.5
6
+ - 2.1.6
7
+ - 2.2.0
8
+ - 2.2.1
9
+ - 2.2.2
10
+ sudo: false
data/Gemfile CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in convection.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem 'bundler', '~> 1.7'
8
+ gem 'minitest'
9
+ gem 'rake', '~> 10.0'
10
+ gem 'rubocop', '~> 0.34'
11
+ gem 'simplecov'
12
+ gem 'thor-scmversion', '= 1.7.0'
13
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Convection
1
+ # Convection [![Build Status](https://travis-ci.org/rapid7/convection.svg)](https://travis-ci.org/rapid7/convection)
2
2
  _A fully generic, modular DSL for AWS CloudFormation_
3
3
 
4
4
  This gem aims to provide a reusable model for AWS CloudFormation in Ruby. It exposes a DSL for template definition, and a simple, decoupled abstraction of a CloudFormation Stack to compile and apply templates.
@@ -107,7 +107,18 @@ end
107
107
  ### Conditions
108
108
  http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html
109
109
 
110
- Not implemented yet.
110
+ ```ruby
111
+ condition 'ThisCondition' do
112
+ fn_equals( fn_ref('SomeParameter'), 'value_x' )
113
+ end
114
+
115
+ condition 'ThatCondition' do
116
+ fn_or(
117
+ fn_equals( fn_ref('SomeParameter'), 'value_y' ),
118
+ fn_equals( fn_ref('SomeParameter'), 'value_z' )
119
+ )
120
+ end
121
+ ```
111
122
 
112
123
  ### Resources
113
124
  http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html
@@ -127,6 +138,17 @@ resource 'AnInstance' do
127
138
  end
128
139
  ```
129
140
 
141
+ Using a condition to set a resource property:
142
+
143
+ ```ruby
144
+ resource 'MySQL' do
145
+ type 'AWS::RDS::DBInstance'
146
+ ...
147
+ property 'Iops', fn_if('ThisCondition', '1000', fn_ref('AWS::NoValue'))
148
+ ...
149
+ end
150
+ ```
151
+
130
152
  ### Outputs
131
153
  http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
132
154
 
@@ -195,6 +217,9 @@ The `Stack` class provides a state wrapper for CloudFormation Stacks. It tracks
195
217
  * `#delete` - Delete CloudFormation Stack
196
218
  * `#availability_zones(&block)` - Return an array of strings representing the region's availability zones. Provided codeblock will be called for each AZ.
197
219
 
220
+ ## Futures
221
+ *
222
+
198
223
  ## License
199
224
  _Copyright (c) 2015 John Manero, Rapid7 LLC._
200
225
 
data/Rakefile CHANGED
@@ -1,2 +1,12 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+ require 'rubocop/rake_task'
3
+ require 'rake/testtask'
2
4
 
5
+ RuboCop::RakeTask.new
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << 'test'
9
+ t.pattern = 'test/**/test_*.rb'
10
+ end
11
+
12
+ task :default => [:test, :rubocop]
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ require 'thor'
3
+ require_relative '../lib/convection/control/cloud'
4
+
5
+ module Convection
6
+ ##
7
+ # Convection CLI
8
+ ##
9
+ class CLI < Thor
10
+ class_option :cloudfile, :type => :string, :default => 'Cloudfile'
11
+ def initialize(*args)
12
+ super
13
+ @cloud = Control::Cloud.new
14
+ @cwd = Dir.getwd
15
+ end
16
+
17
+ desc 'converge STACK', 'Converge your cloud'
18
+ def converge(stack = nil)
19
+ @cloud.configure(File.absolute_path(options['cloudfile'], @cwd))
20
+ @cloud.converge(stack) do |event, errors|
21
+ say_status(*event.to_thor)
22
+ errors.each do |error|
23
+ say "* #{ error.message }"
24
+ error.backtrace.each { |b| say " #{ b }" }
25
+ end unless errors.nil?
26
+ end
27
+ end
28
+
29
+ desc 'diff', 'Show changes that will be applied by converge'
30
+ def diff
31
+ @cloud.configure(File.absolute_path(options['cloudfile'], @cwd))
32
+ @cloud.diff { |d| say_status(*d.to_thor) }
33
+ end
34
+
35
+ desc 'print STACK', 'Print the rendered template for STACK'
36
+ def print(stack)
37
+ @cloud.configure(File.absolute_path(options['cloudfile'], @cwd))
38
+ puts @cloud.stacks[stack].to_json(true)
39
+ end
40
+
41
+ desc 'validate STACK', 'Validate the rendered template for STACK'
42
+ def validate(stack)
43
+ @cloud.configure(File.absolute_path(options['cloudfile'], @cwd))
44
+ @cloud.stacks[stack].validate
45
+ end
46
+ end
47
+ end
48
+
49
+ Convection::CLI.start(ARGV)
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['jmanero@rapid7.com']
11
11
  spec.summary = Convection::SUMMARY
12
12
  spec.description = Convection::DESCRIPTION
13
- spec.homepage = ''
13
+ spec.homepage = 'https://github.com/rapid7/convection'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -18,10 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.7'
22
- spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'thor-scmversion', '= 1.7.0'
24
-
25
- spec.add_runtime_dependency 'aws-sdk', '< 2'
26
- spec.add_runtime_dependency 'netaddr', '~> 1.5.0'
21
+ spec.add_runtime_dependency 'aws-sdk', '>= 2'
22
+ spec.add_runtime_dependency 'httparty', '~> 0.13'
23
+ spec.add_runtime_dependency 'netaddr', '~> 1.5'
24
+ spec.add_runtime_dependency 'thor', '~> 0.19'
27
25
  end
@@ -0,0 +1 @@
1
+ 2.2.2
@@ -0,0 +1,13 @@
1
+ require_relative '../lib/convection'
2
+ require_relative './vpc'
3
+ require_relative './security-groups'
4
+ require_relative './foobar'
5
+
6
+ name 'convection-test'
7
+ region 'us-east-1'
8
+
9
+ attribute 'vpc', 'subnet', '10.255.0.0/16'
10
+
11
+ stack 'vpc', Convection::Demo::VPC
12
+ stack 'security-groups', Convection::Demo::SECURITY_GROUPS
13
+ stack 'foobar', Convection::Demo::FOOBAR
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ require 'convection'
3
+
4
+ region = 'us-west-1'
5
+
6
+ elb_template = Convection.template do
7
+ description 'Example ELB via Convection '
8
+
9
+ elb 'TestELB' do
10
+ availability_zones(
11
+ {
12
+ "Fn::GetAZs"=>""
13
+ }
14
+ )
15
+ load_balancer_name('ExampleELB')
16
+ listeners(
17
+ {
18
+ 'InstancePort' => '80',
19
+ 'LoadBalancerPort' => '80',
20
+ 'Protocol' => 'HTTP'
21
+ }
22
+ )
23
+ end
24
+ end
25
+
26
+ puts elb_template.to_json
27
+ #puts Convection.stack('ELBTestStack', elb_template, :region => region).apply
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ require 'convection'
3
+
4
+ test_iam_access_key_template = Convection.template do
5
+ description 'This example creates a user an access keys for that user.'
6
+
7
+ iam_user 'NewUser' do
8
+ path 'new_user'
9
+ end
10
+
11
+ iam_access_key 'NewUserKey' do
12
+ status 'Active'
13
+ user_name fn_ref(:NewUser)
14
+ end
15
+ end
16
+
17
+ puts test_iam_access_key_template.to_json
18
+ # puts Convection.stack('IAMTestStack', test_iam_access_key_template, :region => 'us-west-1').apply
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ require 'convection'
3
+
4
+ test_iam_group_template = Convection.template do
5
+ description 'This is an example of a stack representing IAM Groups and Policies.'
6
+
7
+ parameter 'Path' do
8
+ type 'String'
9
+ default '/'
10
+ end
11
+
12
+ iam_policy 'GroupPolicy' do
13
+ policy_name 'NewPolicy'
14
+ group fn_ref(:NewGroup)
15
+
16
+ policy(
17
+ :Statement => [{
18
+ :Effect => 'Allow',
19
+ :Action => ['s3:GetObject'],
20
+ :Resource => ['arn:aws:s3:::some.bucket.name.here/*']
21
+ }]
22
+ )
23
+ end
24
+
25
+ iam_group 'NewGroup' do
26
+ path fn_ref(:Path)
27
+ end
28
+ end
29
+
30
+ puts test_iam_group_template.to_json
31
+ # puts Convection.stack('IAMTestStack', test_iam_group_template, :region => 'us-west-1').apply
@@ -20,43 +20,32 @@ test_iam_role_template = Convection.template do
20
20
  end
21
21
 
22
22
  iam_policy 'RolePolicy' do
23
- role fn_ref('NewRole')
24
- # You can choose between multiple 'role' attributes
25
- # or build out an array with multiple values.
26
- name 'NewPolicy'
27
- # Note the move to fat colons below:
28
- policy_document({
29
- "Statement"=> [
30
- {
31
- "Effect"=> "Allow",
32
- "Action"=> [
33
- "s3:GetObject"
34
- ],
35
- "Resource"=> [
36
- "arn:aws:s3:::some.bucket.name.here/*"
37
- ]
38
- }
39
- ]
40
- })
23
+ policy_name 'NewPolicy'
24
+ role fn_ref(:NewRole)
25
+
26
+ policy(
27
+ :Statement => [{
28
+ :Effect => 'Allow',
29
+ :Action => ['s3:GetObject'],
30
+ :Resource => ['arn:aws:s3:::some.bucket.name.here/*']
31
+ }]
32
+ )
41
33
  end
42
34
 
43
35
  iam_role 'NewRole' do
44
- path fn_ref('Path')
45
- # This is a contrived example of an instance role for aws.
46
- assume_role_policy_document({
47
- "Statement" => [
48
- {
49
- "Sid" => "",
50
- "Effect" => "Allow",
51
- "Principal" => {
52
- "Service" => "ec2.amazonaws.com"
36
+ path fn_ref(:Path)
37
+
38
+ # EC2 Instance Role
39
+ trust_relationship(
40
+ :Statement => [{
41
+ :Effect => 'Allow',
42
+ :Principal => {
43
+ :Service => 'ec2.amazonaws.com'
53
44
  },
54
- "Action" => "sts:AssumeRole"
55
- }
56
- ]
57
- })
45
+ :Action => 'sts:AssumeRole'
46
+ }]
47
+ )
58
48
  end
59
-
60
49
  end
61
50
 
62
51
  puts test_iam_role_template.to_json