convection 0.0.1 → 0.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.
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