aws-insight 0.14.0

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 (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +84 -0
  5. data/.travis.yml +19 -0
  6. data/CHANGELOG.md +336 -0
  7. data/CODE_OF_CONDUCT.md +13 -0
  8. data/CONTRIBUTING.md +62 -0
  9. data/Gemfile +19 -0
  10. data/Guardfile +12 -0
  11. data/LICENSE +22 -0
  12. data/README.md +393 -0
  13. data/Rakefile +6 -0
  14. data/bin/terraforming +5 -0
  15. data/contrib/zsh-completion/_terraforming +65 -0
  16. data/lib/terraforming.rb +54 -0
  17. data/lib/terraforming/cli.rb +340 -0
  18. data/lib/terraforming/resource/alb.rb +98 -0
  19. data/lib/terraforming/resource/auto_scaling_group.rb +90 -0
  20. data/lib/terraforming/resource/cloud_watch_alarm.rb +87 -0
  21. data/lib/terraforming/resource/config.rb +98 -0
  22. data/lib/terraforming/resource/db_parameter_group.rb +58 -0
  23. data/lib/terraforming/resource/db_security_group.rb +57 -0
  24. data/lib/terraforming/resource/db_subnet_group.rb +52 -0
  25. data/lib/terraforming/resource/ec2.rb +130 -0
  26. data/lib/terraforming/resource/efs_file_system.rb +60 -0
  27. data/lib/terraforming/resource/eip.rb +66 -0
  28. data/lib/terraforming/resource/elasti_cache_cluster.rb +80 -0
  29. data/lib/terraforming/resource/elasti_cache_subnet_group.rb +56 -0
  30. data/lib/terraforming/resource/elb.rb +203 -0
  31. data/lib/terraforming/resource/iam_group.rb +54 -0
  32. data/lib/terraforming/resource/iam_group_membership.rb +63 -0
  33. data/lib/terraforming/resource/iam_group_policy.rb +71 -0
  34. data/lib/terraforming/resource/iam_instance_profile.rb +54 -0
  35. data/lib/terraforming/resource/iam_policy.rb +63 -0
  36. data/lib/terraforming/resource/iam_policy_attachment.rb +86 -0
  37. data/lib/terraforming/resource/iam_role.rb +56 -0
  38. data/lib/terraforming/resource/iam_role_policy.rb +71 -0
  39. data/lib/terraforming/resource/iam_user.rb +55 -0
  40. data/lib/terraforming/resource/iam_user_policy.rb +71 -0
  41. data/lib/terraforming/resource/internet_gateway.rb +54 -0
  42. data/lib/terraforming/resource/kms_alias.rb +55 -0
  43. data/lib/terraforming/resource/kms_key.rb +84 -0
  44. data/lib/terraforming/resource/launch_configuration.rb +106 -0
  45. data/lib/terraforming/resource/nat_gateway.rb +57 -0
  46. data/lib/terraforming/resource/network_acl.rb +83 -0
  47. data/lib/terraforming/resource/network_interface.rb +68 -0
  48. data/lib/terraforming/resource/rds.rb +74 -0
  49. data/lib/terraforming/resource/redshift.rb +67 -0
  50. data/lib/terraforming/resource/route53_record.rb +106 -0
  51. data/lib/terraforming/resource/route53_zone.rb +89 -0
  52. data/lib/terraforming/resource/route_table.rb +122 -0
  53. data/lib/terraforming/resource/route_table_association.rb +59 -0
  54. data/lib/terraforming/resource/s3.rb +69 -0
  55. data/lib/terraforming/resource/security_group.rb +188 -0
  56. data/lib/terraforming/resource/sns_topic.rb +75 -0
  57. data/lib/terraforming/resource/sns_topic_subscription.rb +83 -0
  58. data/lib/terraforming/resource/sqs.rb +70 -0
  59. data/lib/terraforming/resource/subnet.rb +55 -0
  60. data/lib/terraforming/resource/vpc.rb +67 -0
  61. data/lib/terraforming/resource/vpn_gateway.rb +55 -0
  62. data/lib/terraforming/template/tf/alb.erb +28 -0
  63. data/lib/terraforming/template/tf/auto_scaling_group.erb +28 -0
  64. data/lib/terraforming/template/tf/cloud_watch_alarm.erb +33 -0
  65. data/lib/terraforming/template/tf/db_parameter_group.erb +17 -0
  66. data/lib/terraforming/template/tf/db_security_group.erb +26 -0
  67. data/lib/terraforming/template/tf/db_subnet_group.erb +8 -0
  68. data/lib/terraforming/template/tf/ec2.erb +56 -0
  69. data/lib/terraforming/template/tf/eip.erb +11 -0
  70. data/lib/terraforming/template/tf/elasti_cache_cluster.erb +22 -0
  71. data/lib/terraforming/template/tf/elasti_cache_subnet_group.erb +8 -0
  72. data/lib/terraforming/template/tf/elastic_filesystem.erb +18 -0
  73. data/lib/terraforming/template/tf/elb.erb +51 -0
  74. data/lib/terraforming/template/tf/iam_group.erb +7 -0
  75. data/lib/terraforming/template/tf/iam_group_membership.erb +8 -0
  76. data/lib/terraforming/template/tf/iam_group_policy.erb +10 -0
  77. data/lib/terraforming/template/tf/iam_instance_profile.erb +8 -0
  78. data/lib/terraforming/template/tf/iam_policy.erb +12 -0
  79. data/lib/terraforming/template/tf/iam_policy_attachment.erb +10 -0
  80. data/lib/terraforming/template/tf/iam_role.erb +10 -0
  81. data/lib/terraforming/template/tf/iam_role_policy.erb +10 -0
  82. data/lib/terraforming/template/tf/iam_user.erb +7 -0
  83. data/lib/terraforming/template/tf/iam_user_policy.erb +10 -0
  84. data/lib/terraforming/template/tf/internet_gateway.erb +14 -0
  85. data/lib/terraforming/template/tf/kms_alias.erb +7 -0
  86. data/lib/terraforming/template/tf/kms_key.erb +13 -0
  87. data/lib/terraforming/template/tf/launch_configuration.erb +68 -0
  88. data/lib/terraforming/template/tf/nat_gateway.erb +9 -0
  89. data/lib/terraforming/template/tf/network_acl.erb +43 -0
  90. data/lib/terraforming/template/tf/network_interface.erb +22 -0
  91. data/lib/terraforming/template/tf/rds.erb +25 -0
  92. data/lib/terraforming/template/tf/redshift.erb +23 -0
  93. data/lib/terraforming/template/tf/route53_record.erb +52 -0
  94. data/lib/terraforming/template/tf/route53_zone.erb +18 -0
  95. data/lib/terraforming/template/tf/route_table.erb +34 -0
  96. data/lib/terraforming/template/tf/route_table_association.erb +9 -0
  97. data/lib/terraforming/template/tf/s3.erb +12 -0
  98. data/lib/terraforming/template/tf/security_group.erb +56 -0
  99. data/lib/terraforming/template/tf/sns_topic.erb +17 -0
  100. data/lib/terraforming/template/tf/sns_topic_subscription.erb +23 -0
  101. data/lib/terraforming/template/tf/sqs.erb +21 -0
  102. data/lib/terraforming/template/tf/subnet.erb +15 -0
  103. data/lib/terraforming/template/tf/vpc.erb +15 -0
  104. data/lib/terraforming/template/tf/vpn_gateway.erb +14 -0
  105. data/lib/terraforming/util.rb +30 -0
  106. data/lib/terraforming/version.rb +3 -0
  107. data/script/console +14 -0
  108. data/script/generate +97 -0
  109. data/script/setup +7 -0
  110. data/templates/resource.erb.erb +3 -0
  111. data/templates/resource.rb.erb +31 -0
  112. data/templates/resource_spec.rb.erb +39 -0
  113. data/terraforming.gemspec +31 -0
  114. metadata +271 -0
@@ -0,0 +1,98 @@
1
+ module Terraforming
2
+ module Resource
3
+ class ALB
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::ElasticLoadBalancingV2::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::ElasticLoadBalancingV2::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/alb")
20
+ end
21
+
22
+ def tfstate
23
+ load_balancers.inject({}) do |resources, load_balancer|
24
+ load_balancer_attributes = load_balancer_attributes_of(load_balancer)
25
+ attributes = {
26
+ "dns_name" => load_balancer.dns_name,
27
+ "enable_deletion_protection" => load_balancer_attributes["deletion_protection.enabled"].to_s,
28
+ "id" => load_balancer.load_balancer_arn,
29
+ "idle_timeout" => load_balancer_attributes["idle_timeout.timeout_seconds"].to_s,
30
+ "internal" => internal?(load_balancer).to_s,
31
+ "name" => load_balancer.load_balancer_name,
32
+ "security_groups.#" => load_balancer.security_groups.length.to_s,
33
+ "subnets.#" => load_balancer.availability_zones.length.to_s,
34
+ "zone_id" => load_balancer.canonical_hosted_zone_id,
35
+ }
36
+
37
+ attributes.merge!(access_logs_attributes_of(load_balancer_attributes))
38
+ attributes.merge!(tag_attributes_of(load_balancer))
39
+
40
+ resources["aws_alb.#{module_name_of(load_balancer)}"] = {
41
+ "type" => "aws_alb",
42
+ "primary" => {
43
+ "id" => load_balancer.load_balancer_arn,
44
+ "attributes" => attributes
45
+ }
46
+ }
47
+
48
+ resources
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def access_logs_attributes_of(load_balancer_attributes)
55
+ {
56
+ "access_logs.#" => "1",
57
+ "access_logs.0.bucket" => load_balancer_attributes["access_logs.s3.bucket"],
58
+ "access_logs.0.enabled" => load_balancer_attributes["access_logs.s3.enabled"].to_s,
59
+ "access_logs.0.prefix" => load_balancer_attributes["access_logs.s3.prefix"],
60
+ }
61
+ end
62
+
63
+ def internal?(load_balancer)
64
+ load_balancer.scheme == "internal"
65
+ end
66
+
67
+ def load_balancers
68
+ @client.describe_load_balancers.load_balancers
69
+ end
70
+
71
+ def load_balancer_attributes_of(load_balancer)
72
+ @client.describe_load_balancer_attributes(load_balancer_arn: load_balancer.load_balancer_arn).attributes.inject({}) do |result, attribute|
73
+ result[attribute.key] = attribute.value
74
+ result
75
+ end
76
+ end
77
+
78
+ def module_name_of(load_balancer)
79
+ normalize_module_name(load_balancer.load_balancer_name)
80
+ end
81
+
82
+ def tag_attributes_of(load_balancer)
83
+ tags = tags_of(load_balancer)
84
+ attributes = { "tags.%" => tags.length.to_s }
85
+
86
+ tags.each do |tag|
87
+ attributes["tags.#{tag.key}"] = tag.value
88
+ end
89
+
90
+ attributes
91
+ end
92
+
93
+ def tags_of(load_balancer)
94
+ @client.describe_tags(resource_arns: [load_balancer.load_balancer_arn]).tag_descriptions.first.tags
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,90 @@
1
+ module Terraforming
2
+ module Resource
3
+ class AutoScalingGroup
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::AutoScaling::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::AutoScaling::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/auto_scaling_group")
20
+ end
21
+
22
+ def tfstate
23
+ auto_scaling_groups.inject({}) do |resources, group|
24
+ vpc_zone_specified = vpc_zone_specified?(group)
25
+
26
+ attributes = {
27
+ "availability_zones.#" => vpc_zone_specified ? "0" : group.availability_zones.length.to_s,
28
+ "default_cooldown" => "300",
29
+ "desired_capacity" => group.desired_capacity.to_s,
30
+ "health_check_grace_period" => group.health_check_grace_period.to_s,
31
+ "health_check_type" => group.health_check_type,
32
+ "id" => group.auto_scaling_group_name,
33
+ "launch_configuration" => group.launch_configuration_name,
34
+ "load_balancers.#" => "0",
35
+ "max_size" => group.max_size.to_s,
36
+ "min_size" => group.min_size.to_s,
37
+ "name" => group.auto_scaling_group_name,
38
+ "tag.#" => group.tags.length.to_s,
39
+ "termination_policies.#" => "0",
40
+ "vpc_zone_identifier.#" => vpc_zone_specified ? vpc_zone_identifier_of(group).length.to_s : "0",
41
+ }
42
+
43
+ group.tags.each do |tag|
44
+ hashcode = tag_hashcode_of(tag)
45
+ attributes.merge!({
46
+ "tag.#{hashcode}.key" => tag.key,
47
+ "tag.#{hashcode}.propagate_at_launch" => tag.propagate_at_launch.to_s,
48
+ "tag.#{hashcode}.value" => tag.value,
49
+ })
50
+ end
51
+
52
+ resources["aws_autoscaling_group.#{module_name_of(group)}"] = {
53
+ "type" => "aws_autoscaling_group",
54
+ "primary" => {
55
+ "id" => group.auto_scaling_group_name,
56
+ "attributes" => attributes,
57
+ "meta" => {
58
+ "schema_version" => "1"
59
+ }
60
+ }
61
+ }
62
+
63
+ resources
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def auto_scaling_groups
70
+ @client.describe_auto_scaling_groups.map(&:auto_scaling_groups).flatten
71
+ end
72
+
73
+ def module_name_of(group)
74
+ normalize_module_name(group.auto_scaling_group_name)
75
+ end
76
+
77
+ def tag_hashcode_of(tag)
78
+ Zlib.crc32("#{tag.key}-#{tag.value}-#{tag.propagate_at_launch}-")
79
+ end
80
+
81
+ def vpc_zone_identifier_of(group)
82
+ group.vpc_zone_identifier.split(",")
83
+ end
84
+
85
+ def vpc_zone_specified?(group)
86
+ group.vpc_zone_identifier && !vpc_zone_identifier_of(group).empty?
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,87 @@
1
+ module Terraforming
2
+ module Resource
3
+ class CloudWatchAlarm
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::CloudWatch::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::CloudWatch::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/cloud_watch_alarm")
20
+ end
21
+
22
+ def tfstate
23
+ alarms.inject({}) do |resources, alarm|
24
+ resources["aws_cloudwatch_metric_alarm.#{module_name_of(alarm)}"] = {
25
+ "type" => "aws_cloudwatch_metric_alarm",
26
+ "primary" => {
27
+ "id" => alarm.alarm_name,
28
+ "attributes" => alarm_attributes(alarm)
29
+ }
30
+ }
31
+ resources
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def alarm_attributes(alarm)
38
+ attributes = {
39
+ "actions_enabled" => alarm.actions_enabled.to_s,
40
+ "alarm_description" => sanitize(alarm.alarm_description),
41
+ "alarm_name" => alarm.alarm_name,
42
+ "comparison_operator" => alarm.comparison_operator,
43
+ "evaluation_periods" => alarm.evaluation_periods.to_s,
44
+ "id" => alarm.alarm_name,
45
+ "metric_name" => alarm.metric_name,
46
+ "namespace" => alarm.namespace,
47
+ "period" => alarm.period.to_s,
48
+ "statistic" => alarm.statistic,
49
+ "threshold" => alarm.threshold.to_s,
50
+ "unit" => sanitize(alarm.unit)
51
+ }
52
+ add_checksummed_attributes(attributes, alarm)
53
+ end
54
+
55
+ def alarms
56
+ @client.describe_alarms.map(&:metric_alarms).flatten
57
+ end
58
+
59
+ def module_name_of(alarm)
60
+ normalize_module_name(alarm.alarm_name)
61
+ end
62
+
63
+ def sanitize(argument)
64
+ argument.nil? ? "" : argument
65
+ end
66
+
67
+ def add_checksummed_attributes(attributes, alarm)
68
+ %w(insufficient_data_actions alarm_actions ok_actions dimensions).each do |action|
69
+ attribute = alarm.send(action.to_sym)
70
+ attributes["#{action}.#"] = attribute.size.to_s
71
+ attribute.each do |attr|
72
+ if attr.is_a? String
73
+ checksum = Zlib.crc32(attr)
74
+ value = attr
75
+ else
76
+ checksum = attr.name
77
+ value = attr.value
78
+ end
79
+ attributes["#{action}.#{checksum}"] = value
80
+ end
81
+ end
82
+
83
+ attributes
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,98 @@
1
+ module Terraforming
2
+ module Resource
3
+ class Config
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::ElasticLoadBalancingV2::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::ElasticLoadBalancingV2::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/alb")
20
+ end
21
+
22
+ def tfstate
23
+ load_balancers.inject({}) do |resources, load_balancer|
24
+ load_balancer_attributes = load_balancer_attributes_of(load_balancer)
25
+ attributes = {
26
+ "dns_name" => load_balancer.dns_name,
27
+ "enable_deletion_protection" => load_balancer_attributes["deletion_protection.enabled"].to_s,
28
+ "id" => load_balancer.load_balancer_arn,
29
+ "idle_timeout" => load_balancer_attributes["idle_timeout.timeout_seconds"].to_s,
30
+ "internal" => internal?(load_balancer).to_s,
31
+ "name" => load_balancer.load_balancer_name,
32
+ "security_groups.#" => load_balancer.security_groups.length.to_s,
33
+ "subnets.#" => load_balancer.availability_zones.length.to_s,
34
+ "zone_id" => load_balancer.canonical_hosted_zone_id,
35
+ }
36
+
37
+ attributes.merge!(access_logs_attributes_of(load_balancer_attributes))
38
+ attributes.merge!(tag_attributes_of(load_balancer))
39
+
40
+ resources["aws_alb.#{module_name_of(load_balancer)}"] = {
41
+ "type" => "aws_alb",
42
+ "primary" => {
43
+ "id" => load_balancer.load_balancer_arn,
44
+ "attributes" => attributes
45
+ }
46
+ }
47
+
48
+ resources
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def access_logs_attributes_of(load_balancer_attributes)
55
+ {
56
+ "access_logs.#" => "1",
57
+ "access_logs.0.bucket" => load_balancer_attributes["access_logs.s3.bucket"],
58
+ "access_logs.0.enabled" => load_balancer_attributes["access_logs.s3.enabled"].to_s,
59
+ "access_logs.0.prefix" => load_balancer_attributes["access_logs.s3.prefix"],
60
+ }
61
+ end
62
+
63
+ def internal?(load_balancer)
64
+ load_balancer.scheme == "internal"
65
+ end
66
+
67
+ def load_balancers
68
+ @client.describe_load_balancers.load_balancers
69
+ end
70
+
71
+ def load_balancer_attributes_of(load_balancer)
72
+ @client.describe_load_balancer_attributes(load_balancer_arn: load_balancer.load_balancer_arn).attributes.inject({}) do |result, attribute|
73
+ result[attribute.key] = attribute.value
74
+ result
75
+ end
76
+ end
77
+
78
+ def module_name_of(load_balancer)
79
+ normalize_module_name(load_balancer.load_balancer_name)
80
+ end
81
+
82
+ def tag_attributes_of(load_balancer)
83
+ tags = tags_of(load_balancer)
84
+ attributes = { "tags.%" => tags.length.to_s }
85
+
86
+ tags.each do |tag|
87
+ attributes["tags.#{tag.key}"] = tag.value
88
+ end
89
+
90
+ attributes
91
+ end
92
+
93
+ def tags_of(load_balancer)
94
+ @client.describe_tags(resource_arns: [load_balancer.load_balancer_arn]).tag_descriptions.first.tags
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,58 @@
1
+ module Terraforming
2
+ module Resource
3
+ class DBParameterGroup
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::RDS::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::RDS::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/db_parameter_group")
20
+ end
21
+
22
+ def tfstate
23
+ db_parameter_groups.inject({}) do |resources, parameter_group|
24
+ attributes = {
25
+ "description" => parameter_group.description,
26
+ "family" => parameter_group.db_parameter_group_family,
27
+ "id" => parameter_group.db_parameter_group_name,
28
+ "name" => parameter_group.db_parameter_group_name,
29
+ "parameter.#" => db_parameters_in(parameter_group).length.to_s
30
+ }
31
+ resources["aws_db_parameter_group.#{module_name_of(parameter_group)}"] = {
32
+ "type" => "aws_db_parameter_group",
33
+ "primary" => {
34
+ "id" => parameter_group.db_parameter_group_name,
35
+ "attributes" => attributes
36
+ }
37
+ }
38
+
39
+ resources
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def db_parameter_groups
46
+ @client.describe_db_parameter_groups.map(&:db_parameter_groups).flatten
47
+ end
48
+
49
+ def db_parameters_in(parameter_group)
50
+ @client.describe_db_parameters(db_parameter_group_name: parameter_group.db_parameter_group_name).map(&:parameters).flatten
51
+ end
52
+
53
+ def module_name_of(parameter_group)
54
+ normalize_module_name(parameter_group.db_parameter_group_name)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,57 @@
1
+ module Terraforming
2
+ module Resource
3
+ class DBSecurityGroup
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::RDS::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::RDS::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/db_security_group")
20
+ end
21
+
22
+ def tfstate
23
+ db_security_groups.inject({}) do |resources, security_group|
24
+ attributes = {
25
+ "db_subnet_group_name" => security_group.db_security_group_name,
26
+ "id" => security_group.db_security_group_name,
27
+ "ingress.#" => ingresses_of(security_group).length.to_s,
28
+ "name" => security_group.db_security_group_name,
29
+ }
30
+ resources["aws_db_security_group.#{module_name_of(security_group)}"] = {
31
+ "type" => "aws_db_security_group",
32
+ "primary" => {
33
+ "id" => security_group.db_security_group_name,
34
+ "attributes" => attributes
35
+ }
36
+ }
37
+
38
+ resources
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def ingresses_of(security_group)
45
+ security_group.ec2_security_groups + security_group.ip_ranges
46
+ end
47
+
48
+ def db_security_groups
49
+ @client.describe_db_security_groups.map(&:db_security_groups).flatten.select { |sg| !ingresses_of(sg).empty? }
50
+ end
51
+
52
+ def module_name_of(security_group)
53
+ normalize_module_name(security_group.db_security_group_name)
54
+ end
55
+ end
56
+ end
57
+ end