geoengineer 0.1.0 → 0.1.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 (91) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +5 -5
  5. data/lib/geoengineer/cli/geo_cli.rb +4 -5
  6. data/lib/geoengineer/cli/status_command.rb +7 -1
  7. data/lib/geoengineer/environment.rb +53 -51
  8. data/lib/geoengineer/project.rb +5 -24
  9. data/lib/geoengineer/resource.rb +89 -20
  10. data/lib/geoengineer/resources/aws_customer_gateway.rb +23 -0
  11. data/lib/geoengineer/resources/aws_eip.rb +43 -0
  12. data/lib/geoengineer/resources/aws_iam_group.rb +26 -0
  13. data/lib/geoengineer/resources/aws_iam_group_membership.rb +50 -0
  14. data/lib/geoengineer/resources/aws_iam_policy.rb +12 -4
  15. data/lib/geoengineer/resources/aws_iam_policy_attachment.rb +95 -0
  16. data/lib/geoengineer/resources/aws_iam_role.rb +45 -0
  17. data/lib/geoengineer/resources/aws_instance.rb +7 -4
  18. data/lib/geoengineer/resources/aws_internet_gateway.rb +23 -0
  19. data/lib/geoengineer/resources/aws_lambda_alias.rb +50 -0
  20. data/lib/geoengineer/resources/aws_lambda_event_source_mapping.rb +47 -0
  21. data/lib/geoengineer/resources/aws_lambda_function.rb +30 -0
  22. data/lib/geoengineer/resources/aws_lambda_permission.rb +74 -0
  23. data/lib/geoengineer/resources/aws_main_route_table_association.rb +51 -0
  24. data/lib/geoengineer/resources/aws_nat_gateway.rb +29 -0
  25. data/lib/geoengineer/resources/aws_network_acl.rb +38 -0
  26. data/lib/geoengineer/resources/aws_network_acl_rule.rb +50 -0
  27. data/lib/geoengineer/resources/aws_route.rb +47 -0
  28. data/lib/geoengineer/resources/aws_route53_record.rb +4 -0
  29. data/lib/geoengineer/resources/aws_route_table.rb +26 -0
  30. data/lib/geoengineer/resources/aws_route_table_association.rb +45 -0
  31. data/lib/geoengineer/resources/aws_security_group.rb +8 -5
  32. data/lib/geoengineer/resources/aws_subnet.rb +24 -0
  33. data/lib/geoengineer/resources/aws_vpc.rb +24 -0
  34. data/lib/geoengineer/resources/aws_vpc_dhcp_options.rb +29 -0
  35. data/lib/geoengineer/resources/aws_vpc_dhcp_options_association.rb +40 -0
  36. data/lib/geoengineer/resources/aws_vpc_endpoint.rb +26 -0
  37. data/lib/geoengineer/resources/aws_vpc_peering_connection.rb +29 -0
  38. data/lib/geoengineer/resources/aws_vpn_connection.rb +23 -0
  39. data/lib/geoengineer/resources/aws_vpn_connection_route.rb +35 -0
  40. data/lib/geoengineer/resources/aws_vpn_gateway.rb +22 -0
  41. data/lib/geoengineer/resources/aws_vpn_gateway_attachment.rb +41 -0
  42. data/lib/geoengineer/template.rb +20 -4
  43. data/lib/geoengineer/utils/aws_clients.rb +4 -0
  44. data/lib/geoengineer/utils/crc32.rb +61 -0
  45. data/lib/geoengineer/utils/has_attributes.rb +25 -11
  46. data/lib/geoengineer/utils/has_projects.rb +21 -0
  47. data/lib/geoengineer/utils/has_resources.rb +17 -4
  48. data/lib/geoengineer/utils/has_templates.rb +31 -0
  49. data/lib/geoengineer/utils/has_validations.rb +18 -3
  50. data/lib/geoengineer/version.rb +1 -1
  51. data/spec/environment_spec.rb +40 -19
  52. data/spec/project_spec.rb +2 -2
  53. data/spec/resource_spec.rb +87 -6
  54. data/spec/resources/aws_customer_gateway_spec.rb +24 -0
  55. data/spec/resources/aws_eip_spec.rb +29 -0
  56. data/spec/resources/aws_iam_group_membership_spec.rb +83 -0
  57. data/spec/resources/aws_iam_group_spec.rb +43 -0
  58. data/spec/resources/aws_iam_policy_attachment_spec.rb +80 -0
  59. data/spec/resources/{aws_iam_policy.rb → aws_iam_policy_spec.rb} +6 -5
  60. data/spec/resources/aws_iam_role_spec.rb +45 -0
  61. data/spec/resources/aws_internet_gateway_spec.rb +24 -0
  62. data/spec/resources/aws_lambda_alias_spec.rb +39 -0
  63. data/spec/resources/aws_lambda_event_source_mapping_spec.rb +53 -0
  64. data/spec/resources/aws_lambda_function_spec.rb +29 -0
  65. data/spec/resources/aws_lambda_permission_spec.rb +90 -0
  66. data/spec/resources/aws_main_route_table_association_spec.rb +57 -0
  67. data/spec/resources/aws_nat_gateway_spec.rb +31 -0
  68. data/spec/resources/aws_network_acl_rule_spec.rb +73 -0
  69. data/spec/resources/aws_network_acl_spec.rb +31 -0
  70. data/spec/resources/aws_route53_record_spec.rb +5 -0
  71. data/spec/resources/aws_route_spec.rb +47 -0
  72. data/spec/resources/aws_route_table_association_spec.rb +47 -0
  73. data/spec/resources/aws_route_table_spec.rb +24 -0
  74. data/spec/resources/aws_security_group_spec.rb +36 -2
  75. data/spec/resources/aws_subnet_spec.rb +24 -0
  76. data/spec/resources/aws_vpc_dhcp_options_association_spec.rb +43 -0
  77. data/spec/resources/aws_vpc_dhcp_options_spec.rb +24 -0
  78. data/spec/resources/aws_vpc_endpoint_spec.rb +41 -0
  79. data/spec/resources/aws_vpc_peering_connection_spec.rb +33 -0
  80. data/spec/resources/aws_vpc_spec.rb +24 -0
  81. data/spec/resources/aws_vpn_connection_route_spec.rb +43 -0
  82. data/spec/resources/aws_vpn_connection_spec.rb +41 -0
  83. data/spec/resources/aws_vpn_gateway_attachment_spec.rb +41 -0
  84. data/spec/resources/aws_vpn_gateway_spec.rb +39 -0
  85. data/spec/spec_helper.rb +3 -1
  86. data/spec/utils/crc32_spec.rb +14 -0
  87. data/spec/utils/has_attributes_spec.rb +22 -0
  88. data/spec/utils/has_resources_spec.rb +4 -0
  89. data/spec/utils/has_validations_spec.rb +45 -0
  90. metadata +117 -6
  91. metadata.gz.sig +1 -0
@@ -0,0 +1,23 @@
1
+ ########################################################################
2
+ # AwsCustomerGateway is the +aws_customer_gateway+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/customer_gateway.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsCustomerGateway < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:bgp_asn, :ip_address, :type]) }
8
+ validate -> { validate_has_tag(:Name) }
9
+
10
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
11
+ after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
12
+
13
+ def self._fetch_remote_resources
14
+ AwsClients.ec2.describe_customer_gateways['customer_gateways'].map(&:to_h).map do |gateway|
15
+ gateway.merge(
16
+ {
17
+ _terraform_id: gateway[:customer_gateway_id],
18
+ _geo_id: gateway[:tags]&.find { |tag| tag[:key] == "Name" }&.dig(:value)
19
+ }
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ ########################################################################
2
+ # AwsEip is the +aws_eip+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/eip.html Terraform Docs}
5
+ ########################################################################
6
+
7
+ # Currently geo can't create EIPs - only codify existing ones
8
+ # It does this by requiring the '_public_ip' attribute and hard-coding the '_geo_id' to that
9
+ class GeoEngineer::Resources::AwsEip < GeoEngineer::Resource
10
+ validate :validate_instance_or_network_interface
11
+ validate -> { validate_required_attributes([:_public_ip]) }
12
+
13
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
14
+ after :initialize, -> { _geo_id -> { _public_ip } }
15
+
16
+ # Can't associate both an instance and a network interface with an elastic IP
17
+ def validate_instance_or_network_interface
18
+ errors = []
19
+
20
+ unless instance.nil? || network_interface.nil?
21
+ errors << "Must associate and Elastic IP with either and EC2 instance or a network interface"
22
+ end
23
+
24
+ errors
25
+ end
26
+
27
+ def support_tags?
28
+ false
29
+ end
30
+
31
+ # Always create within a VPC
32
+ def vpc
33
+ true
34
+ end
35
+
36
+ def self._fetch_remote_resources
37
+ AwsClients.ec2.describe_addresses['addresses'].map(&:to_h).map do |address|
38
+ address[:_terraform_id] = address[:allocation_id]
39
+ address[:_geo_id] = address[:public_ip]
40
+ address
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ ########################################################################
2
+ # AwsIamGroup +aws_iam_group+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/iam_group.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsIamGroup < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:name]) }
8
+
9
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
10
+ after :initialize, -> { _geo_id -> { name.to_s } }
11
+
12
+ def support_tags?
13
+ false
14
+ end
15
+
16
+ def self._fetch_remote_resources
17
+ groups = AwsClients.iam.list_groups['groups'].map(&:to_h)
18
+
19
+ groups.map do |g|
20
+ g[:name] = g[:group_name]
21
+ g[:_geo_id] = g[:group_name]
22
+ g[:_terraform_id] = g[:group_name]
23
+ g
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ ########################################################################
2
+ # AwsIamGroup +aws_iam_group_membership+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/iam_group_membership.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsIamGroupMembership < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:name, :users, :group]) }
8
+
9
+ before :validation, -> { group _group.to_ref(:name) if _group }
10
+
11
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
12
+ after :initialize, -> { _geo_id -> { name.to_s } }
13
+
14
+ def to_terraform_state
15
+ tfstate = super
16
+
17
+ attributes = {
18
+ 'group' => _group.name.to_s,
19
+ 'name' => name.to_s
20
+ }
21
+
22
+ tfstate[:primary][:attributes] = attributes
23
+ tfstate
24
+ end
25
+
26
+ def support_tags?
27
+ false
28
+ end
29
+
30
+ def find_remote_as_individual?
31
+ true
32
+ end
33
+
34
+ def remote_resource_params
35
+ return {} unless _group
36
+ return {} unless _group.remote_resource
37
+
38
+ users = AwsClients.iam.get_group({ group_name: _group.name })['users']
39
+ build_remote_resource_params(users)
40
+ end
41
+
42
+ def build_remote_resource_params(users)
43
+ {
44
+ name: _group.name,
45
+ _terraform_id: name.to_s,
46
+ _geo_id: name.to_s,
47
+ users: users.map(&:user_name)
48
+ }
49
+ end
50
+ end
@@ -16,12 +16,16 @@ class GeoEngineer::Resources::AwsIamPolicy < GeoEngineer::Resource
16
16
  def to_terraform_state
17
17
  arn = NullObject.maybe(remote_resource).arn
18
18
  default_version_id = NullObject.maybe(remote_resource).default_version_id
19
+
19
20
  policy = _get_policy_document(arn, default_version_id)
20
21
 
21
22
  tfstate = super
22
- tfstate[:primary][:attributes] = {
23
- 'policy' => policy
24
- }
23
+
24
+ attributes = { 'policy' => policy }
25
+ attributes['arn'] = arn if arn
26
+
27
+ tfstate[:primary][:attributes] = attributes
28
+
25
29
  tfstate
26
30
  end
27
31
 
@@ -29,6 +33,10 @@ class GeoEngineer::Resources::AwsIamPolicy < GeoEngineer::Resource
29
33
  false
30
34
  end
31
35
 
36
+ def _policy_file(path, binding_obj = nil)
37
+ _json_file(:policy, path, binding_obj)
38
+ end
39
+
32
40
  def _get_policy_document(arn, version_id)
33
41
  response = AwsClients.iam.get_policy_version({ policy_arn: arn,
34
42
  version_id: version_id })
@@ -36,7 +44,7 @@ class GeoEngineer::Resources::AwsIamPolicy < GeoEngineer::Resource
36
44
  end
37
45
 
38
46
  def self._all_remote_policies
39
- AwsClients.iam.list_policies.each.map(&:policies).flatten.map(&:to_h)
47
+ AwsClients.iam.list_policies({ scope: "Local" }).each.map(&:policies).flatten.map(&:to_h)
40
48
  end
41
49
 
42
50
  def self._fetch_remote_resources
@@ -0,0 +1,95 @@
1
+ ########################################################################
2
+ # AwsIamPolicyAttachment +aws_iam_policy_attachment+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/iam_policy_attachment.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsIamPolicyAttachment < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:name, :_policy]) }
8
+
9
+ validate :shares_name_with_policy
10
+
11
+ before :validation, -> { policy_arn _policy.to_ref(:arn) if _policy }
12
+
13
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
14
+ after :initialize, -> { _geo_id -> { name.to_s } }
15
+
16
+ def validate_shares_name_with_policy
17
+ return "Policy attachment must share a name with the policy" unless shares_name_with_policy?
18
+ []
19
+ end
20
+
21
+ def shares_name_with_policy?
22
+ policy && name.to_s == policy.name
23
+ end
24
+
25
+ def to_terraform_state
26
+ tfstate = super
27
+
28
+ attributes = { 'name' => name.to_s }
29
+ attributes['policy_arn'] = remote_resource.policy_arn if remote_resource
30
+
31
+ attributes = attributes
32
+ .merge(terraform_users_attributes)
33
+ .merge(terraform_groups_attributes)
34
+ .merge(terraform_roles_attributes)
35
+
36
+ tfstate[:primary][:attributes] = attributes
37
+ tfstate
38
+ end
39
+
40
+ def terraform_users_attributes
41
+ return {} if users.nil?
42
+
43
+ user_attributes = { 'users.#' => users.count.to_s }
44
+ users.each_with_index { |u, i| user_attributes["users.#{i}"] = u }
45
+
46
+ user_attributes
47
+ end
48
+
49
+ def terraform_groups_attributes
50
+ return {} if groups.nil?
51
+
52
+ groups_attributes = { 'groups.#' => groups.count.to_s }
53
+ groups.each_with_index { |g, i| groups_attributes["groups.#{i}"] = g }
54
+
55
+ groups_attributes
56
+ end
57
+
58
+ def terraform_roles_attributes
59
+ return {} if roles.nil?
60
+
61
+ roles_attributes = { 'roles.#' => roles.count.to_s }
62
+ roles.each_with_index { |r, i| roles_attributes["roles.#{i}"] = r }
63
+
64
+ roles_attributes
65
+ end
66
+
67
+ def support_tags?
68
+ false
69
+ end
70
+
71
+ def find_remote_as_individual?
72
+ true
73
+ end
74
+
75
+ def remote_resource_params
76
+ return {} unless _policy
77
+ return {} unless _policy.remote_resource
78
+
79
+ arn = _policy.remote_resource._terraform_id
80
+ entities = AwsClients.iam.list_entities_for_policy({ policy_arn: arn })
81
+ build_remote_resource_params(arn, entities)
82
+ end
83
+
84
+ def build_remote_resource_params(arn, entities)
85
+ {
86
+ name: _policy.name,
87
+ _terraform_id: arn,
88
+ _geo_id: _policy.name,
89
+ policy_arn: arn,
90
+ users: entities[:policy_users].map(&:user_name),
91
+ groups: entities[:policy_groups].map(&:group_name),
92
+ roles: entities[:policy_roles].map(&:role_name)
93
+ }
94
+ end
95
+ end
@@ -0,0 +1,45 @@
1
+ require "uri"
2
+
3
+ ########################################################################
4
+ # AwsIamGroup +aws_iam_role+ terrform resource,
5
+ #
6
+ # {https://www.terraform.io/docs/providers/aws/r/iam_role.html Terraform Docs}
7
+ ########################################################################
8
+ class GeoEngineer::Resources::AwsIamRole < GeoEngineer::Resource
9
+ validate -> { validate_required_attributes([:name, :assume_role_policy]) }
10
+
11
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
12
+ after :initialize, -> { _geo_id -> { name.to_s } }
13
+
14
+ def to_terraform_state
15
+ tfstate = super
16
+
17
+ arn = NullObject.maybe(remote_resource).arn
18
+ assume_role_policy = NullObject.maybe(remote_resource).assume_role_policy
19
+
20
+ attributes = {}
21
+ attributes['arn'] = arn if arn
22
+ attributes['assume_role_policy'] = _normalize_json(assume_role_policy) if assume_role_policy
23
+
24
+ tfstate[:primary][:attributes] = attributes
25
+ tfstate
26
+ end
27
+
28
+ def _assume_role_policy_file(path, binding_obj = nil)
29
+ _json_file(:assume_role_policy, path, binding_obj)
30
+ end
31
+
32
+ def support_tags?
33
+ false
34
+ end
35
+
36
+ def self._fetch_remote_resources
37
+ roles = AwsClients.iam.list_roles['roles'].map(&:to_h)
38
+ roles.map do |r|
39
+ r.merge({ name: r[:role_name],
40
+ _geo_id: r[:role_name],
41
+ _terraform_id: r[:role_name],
42
+ assume_role_policy: URI.decode(r[:assume_role_policy_document]) })
43
+ end
44
+ end
45
+ end
@@ -15,10 +15,13 @@ class GeoEngineer::Resources::AwsInstance < GeoEngineer::Resource
15
15
  end
16
16
 
17
17
  def self._fetch_remote_resources
18
- _all_remote_instances.map do |i|
19
- i[:_terraform_id] = i[:instance_id]
20
- i[:_geo_id] = i[:tags] ? i[:tags].select { |x| x[:key] == "Name" }.first[:value] : nil
21
- i
18
+ _all_remote_instances.map do |instance|
19
+ instance.merge(
20
+ {
21
+ _terraform_id: instance[:instance_id],
22
+ _geo_id: instance[:tags]&.find { |tag| tag[:key] == "Name" }&.dig(:value)
23
+ }
24
+ )
22
25
  end
23
26
  end
24
27
  end
@@ -0,0 +1,23 @@
1
+ ########################################################################
2
+ # AwsInternetGateway is the +aws_internet_gateway+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/internet_gateway.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsInternetGateway < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:vpc_id]) }
8
+ validate -> { validate_has_tag(:Name) }
9
+
10
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
11
+ after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
12
+
13
+ def self._fetch_remote_resources
14
+ AwsClients.ec2.describe_internet_gateways['internet_gateways'].map(&:to_h).map do |gateway|
15
+ gateway.merge(
16
+ {
17
+ _terraform_id: gateway[:internet_gateway_id],
18
+ _geo_id: gateway[:tags]&.find { |tag| tag[:key] == "Name" }&.dig(:value)
19
+ }
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,50 @@
1
+ ########################################################################
2
+ # AwsLambdaAlias is the +aws_lambda_function+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/lambda_alias.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsLambdaAlias < GeoEngineer::Resource
7
+ validate -> { validate_required_attributes([:name, :function_name, :function_version]) }
8
+ validate -> {
9
+ !(name =~ /(?!^[0-9]+$)([a-zA-Z0-9\-_]+)/).nil? if name
10
+ }
11
+ validate -> {
12
+ !(function_version =~ /(\$LATEST|[0-9]+)/).nil? if function_version
13
+ }
14
+
15
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
16
+ after :initialize, -> { _geo_id -> { [name, function_name, function_version].join("::") } }
17
+
18
+ def support_tags?
19
+ false
20
+ end
21
+
22
+ # TODO(Brad) - May need to implement solution for pagination...
23
+ def self._fetch_functions
24
+ AwsClients
25
+ .lambda
26
+ .list_functions['functions']
27
+ .map(&:to_h)
28
+ end
29
+
30
+ # TODO(Brad) - May need to implement solution for pagination...
31
+ def self._fetch_aliases(function)
32
+ options = { function_name: function[:function_name] }
33
+ AwsClients.lambda.list_aliases(options)[:aliases].map(&:to_h).map do |f_alias|
34
+ geo_id_components = [f_alias[:name], f_alias[:function_name], f_alias[:function_version]]
35
+ f_alias.merge(
36
+ {
37
+ _terraform_id: f_alias[:alias_arn],
38
+ _geo_id: geo_id_components.join('::')
39
+ }
40
+ )
41
+ end
42
+ end
43
+
44
+ def self._fetch_remote_resources
45
+ _fetch_functions
46
+ .map { |function| _fetch_aliases(function) }
47
+ .flatten
48
+ .compact
49
+ end
50
+ end
@@ -0,0 +1,47 @@
1
+ ########################################################################
2
+ # AwsLambdaEventSourceMapping is the +aws_lambda_event_source_mapping+ terrform resource,
3
+ #
4
+ # {https://www.terraform.io/docs/providers/aws/r/lambda_event_source_mapping.html Terraform Docs}
5
+ ########################################################################
6
+ class GeoEngineer::Resources::AwsLambdaEventSourceMapping < GeoEngineer::Resource
7
+ validate -> {
8
+ validate_required_attributes([:event_source_arn, :function_name, :starting_position])
9
+ }
10
+ validate -> {
11
+ if self.starting_position && !%w(TRIM_HORIZON LATEST).include?(self.starting_position)
12
+ ["starting_position must be either TRIM_HORIZON OR LATEST"]
13
+ end
14
+ }
15
+
16
+ after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
17
+ after :initialize, -> { _geo_id -> { [event_source_arn, function_name].join("::") } }
18
+
19
+ def support_tags?
20
+ false
21
+ end
22
+
23
+ def short_type
24
+ "event_mapping"
25
+ end
26
+
27
+ def self._extract_name_from_arn(arn)
28
+ arn_components = arn.split(":")
29
+ arn_components[arn_components.index("function") + 1] if arn_components.index("function")
30
+ end
31
+
32
+ def self._fetch_remote_resources
33
+ AwsClients
34
+ .lambda
35
+ .list_event_source_mappings['event_source_mappings']
36
+ .map(&:to_h)
37
+ .map do |event|
38
+ geo_id = [event[:event_source_arn], self._extract_name_from_arn(event[:function_arn])]
39
+ event.merge(
40
+ {
41
+ _terraform_id: event[:uuid],
42
+ _geo_id: geo_id.join("::")
43
+ }
44
+ )
45
+ end
46
+ end
47
+ end