tfrb 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +57 -0
- data/LICENSE +202 -0
- data/README.md +35 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/tfrb +5 -0
- data/lib/tfrb/base.rb +198 -0
- data/lib/tfrb/block.rb +44 -0
- data/lib/tfrb/cli.rb +68 -0
- data/lib/tfrb/config.rb +15 -0
- data/lib/tfrb/provider/aws.rb +10 -0
- data/lib/tfrb/provider.rb +22 -0
- data/lib/tfrb/resource/aws_db_instance.rb +32 -0
- data/lib/tfrb/resource/aws_db_subnet_group.rb +28 -0
- data/lib/tfrb/resource/aws_dynamodb_table.rb +26 -0
- data/lib/tfrb/resource/aws_ebs_volume.rb +32 -0
- data/lib/tfrb/resource/aws_elasticache_replication_group.rb +30 -0
- data/lib/tfrb/resource/aws_elasticache_subnet_group.rb +24 -0
- data/lib/tfrb/resource/aws_iam_policy.rb +142 -0
- data/lib/tfrb/resource/aws_iam_role.rb +39 -0
- data/lib/tfrb/resource/aws_iam_role_policy_attachment.rb +27 -0
- data/lib/tfrb/resource/aws_instance.rb +46 -0
- data/lib/tfrb/resource/aws_kms_key.rb +26 -0
- data/lib/tfrb/resource/aws_s3_bucket.rb +20 -0
- data/lib/tfrb/resource/aws_security_group.rb +39 -0
- data/lib/tfrb/resource/aws_storagegateway_cache.rb +21 -0
- data/lib/tfrb/resource/aws_storagegateway_gateway.rb +24 -0
- data/lib/tfrb/resource/aws_storagegateway_nfs_file_share.rb +27 -0
- data/lib/tfrb/resource/aws_subnet.rb +28 -0
- data/lib/tfrb/resource/aws_volume_attachment.rb +30 -0
- data/lib/tfrb/resource/aws_vpc.rb +24 -0
- data/lib/tfrb/resource.rb +124 -0
- data/lib/tfrb/version.rb +3 -0
- data/lib/tfrb.rb +1 -0
- data/tfrb.gemspec +32 -0
- metadata +187 -0
data/lib/tfrb/cli.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'tfrb'
|
2
|
+
require 'tfrb/version'
|
3
|
+
require 'tfrb/config'
|
4
|
+
require 'thor'
|
5
|
+
require 'mixlib/shellout'
|
6
|
+
|
7
|
+
class Tfrb::CLI < Thor
|
8
|
+
map %w[--version -v] => :__print_version
|
9
|
+
|
10
|
+
desc '--version, -v', 'print the version'
|
11
|
+
def __print_version
|
12
|
+
puts Tfrb::VERSION
|
13
|
+
end
|
14
|
+
|
15
|
+
[:init, :plan, :apply].each do |cmd|
|
16
|
+
desc "#{cmd}", "Runs a terraform #{cmd}"
|
17
|
+
method_option :skip_import, aliases: '-s', type: :boolean, desc: 'Skip automatic terraform import', default: false
|
18
|
+
define_method(cmd) do
|
19
|
+
tfrb = load_tfrb(options[:skip_import] || [:init].include?(cmd))
|
20
|
+
tfrb.send("#{cmd}!".to_sym)
|
21
|
+
tfrb.clean! unless cmd == :init
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'import TYPE NAME ID', 'Runs a terraform import'
|
26
|
+
def import(resource_type, resource_name, resource_id)
|
27
|
+
tfrb = load_tfrb
|
28
|
+
tfrb.skip_import = false
|
29
|
+
tfrb.import!(resource_type, resource_name, resource_id)
|
30
|
+
tfrb.clean!
|
31
|
+
end
|
32
|
+
|
33
|
+
[:staterm, :taint].each do |cmd|
|
34
|
+
desc "#{cmd} RESOURCE", "Runs a terraform #{cmd}"
|
35
|
+
define_method(cmd) do |resource_id|
|
36
|
+
tfrb = load_tfrb
|
37
|
+
tfrb.send("#{cmd}!".to_sym, resource_id)
|
38
|
+
tfrb.clean!
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'unlock LOCK_ID', 'Runs a terraform unlock'
|
43
|
+
def unlock(lock_id)
|
44
|
+
tfrb = load_tfrb
|
45
|
+
tfrb.unlock!(lock_id)
|
46
|
+
tfrb.clean!
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def load_tfrb(skip_import = true)
|
52
|
+
unless File.exist?('tfrb.rb')
|
53
|
+
puts 'Missing tfrb.rb file'
|
54
|
+
exit(false)
|
55
|
+
end
|
56
|
+
|
57
|
+
require File.expand_path('tfrb.rb')
|
58
|
+
|
59
|
+
unless Tfrb::Config[:files] && Tfrb::Config[:files].size > 0
|
60
|
+
puts 'No tfrb files found'
|
61
|
+
exit(false)
|
62
|
+
end
|
63
|
+
|
64
|
+
require 'tfrb/base'
|
65
|
+
|
66
|
+
Tfrb::Base.load(Tfrb::Config[:environment_name], Tfrb::Config[:files], skip_import)
|
67
|
+
end
|
68
|
+
end
|
data/lib/tfrb/config.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Tfrb::Provider::Aws
|
2
|
+
def self.load(base, environment)
|
3
|
+
if environment.has_key?('provider') && environment['provider'].has_key?('aws')
|
4
|
+
unless environment['provider']['aws'].has_key?('access_key') || environment['provider']['aws'].has_key?('secret_key')
|
5
|
+
environment['provider']['aws']['access_key'] = ENV['AWS_ACCESS_KEY_ID']
|
6
|
+
environment['provider']['aws']['secret_key'] = ENV['AWS_SECRET_ACCESS_KEY']
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Tfrb::Provider
|
2
|
+
def self.load(tfrb)
|
3
|
+
tfrb.environments.each do |environment_name, environment|
|
4
|
+
if environment['provider']
|
5
|
+
environment['provider'].keys.each do |provider|
|
6
|
+
self.constants.each do |c|
|
7
|
+
if provider == c.to_s.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
8
|
+
Kernel.const_get("Tfrb::Provider::#{c}").load(tfrb, environment)
|
9
|
+
|
10
|
+
# Inject overrides from Config
|
11
|
+
if Tfrb::Config[:overrides].has_key?('provider') && Tfrb::Config[:overrides]['provider'].has_key?(provider)
|
12
|
+
environment['provider'][provider].merge!(Tfrb::Config[:overrides]['provider'][provider])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Dir[File.join(File.dirname(__FILE__), 'provider', '*.rb')].each { |file| require_relative file }
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsDbInstance
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'identifier', resource_name)
|
9
|
+
set_default(resource, 'backup_window', '07:00-08:00')
|
10
|
+
set_default(resource, 'backup_retention_period', 30)
|
11
|
+
set_default(resource, 'deletion_protection', true)
|
12
|
+
set_default(resource, 'maintenance_window', 'sat:08:00-sat:09:00')
|
13
|
+
set_default(resource, 'multi_az', false)
|
14
|
+
set_default(resource, 'publicly_accessible', false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
19
|
+
new_resources.each do |resource_name, resource|
|
20
|
+
client = ::Aws::RDS::Client.new(aws_options(base, resource))
|
21
|
+
begin
|
22
|
+
response = client.describe_db_instances({
|
23
|
+
db_instance_identifier: resource_name
|
24
|
+
})
|
25
|
+
id = response.db_instances.first.db_instance_identifier
|
26
|
+
import!(base, resource_type, resource_name, id)
|
27
|
+
rescue ::Aws::RDS::Errors::DBInstanceNotFound
|
28
|
+
# Does not exist to import
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsDbSubnetGroup
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
resource['tags'] = {} unless resource.has_key?('tags')
|
9
|
+
resource['tags']['Name'] = resource_name unless resource['tags'].has_key?('Name')
|
10
|
+
set_default(resource, 'name', resource_name)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
15
|
+
new_resources.each do |resource_name, resource|
|
16
|
+
client = ::Aws::RDS::Client.new(aws_options(base, resource))
|
17
|
+
begin
|
18
|
+
response = client.describe_db_subnet_groups({
|
19
|
+
db_subnet_group_name: resource_name
|
20
|
+
})
|
21
|
+
id = response.db_subnet_groups.first.db_subnet_group_name
|
22
|
+
import!(base, resource_type, resource_name, id)
|
23
|
+
rescue ::Aws::RDS::Errors::DBSubnetGroupNotFoundFault
|
24
|
+
# Does not exist to import
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsDynamodbTable
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'name', resource_name)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
13
|
+
new_resources.each do |resource_name, resource|
|
14
|
+
client = ::Aws::DynamoDB::Client.new(aws_options(base, resource))
|
15
|
+
begin
|
16
|
+
response = client.describe_table({
|
17
|
+
table_name: resource_name
|
18
|
+
})
|
19
|
+
id = response.table.table_name
|
20
|
+
import!(base, resource_type, resource_name, id)
|
21
|
+
rescue ::Aws::DynamoDB::Errors::TableNotFoundException, ::Aws::DynamoDB::Errors::ResourceNotFoundException
|
22
|
+
# Does not exist to import
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsEbsVolume
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
resource['tags'] = {} unless resource.has_key?('tags')
|
9
|
+
resource['tags']['Name'] = resource_name unless resource['tags'].has_key?('Name')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
14
|
+
new_resources.each do |resource_name, resource|
|
15
|
+
client = ::Aws::EC2::Client.new(aws_options(base, resource))
|
16
|
+
response = client.describe_volumes({
|
17
|
+
filters: [
|
18
|
+
{
|
19
|
+
name: "tag:Name",
|
20
|
+
values: [
|
21
|
+
resource_name,
|
22
|
+
],
|
23
|
+
},
|
24
|
+
],
|
25
|
+
})
|
26
|
+
if response.volumes && response.volumes.size >= 1
|
27
|
+
id = response.volumes.first.volume_id
|
28
|
+
import!(base, resource_type, resource_name, id)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsElasticacheReplicationGroup
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'snapshot_window', '07:00-08:00')
|
9
|
+
set_default(resource, 'snapshot_retention_limit', '30')
|
10
|
+
set_default(resource, 'maintenance_window', 'sat:08:00-sat:09:00')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
15
|
+
new_resources.each do |resource_name, resource|
|
16
|
+
client = ::Aws::ElastiCache::Client.new(aws_options(base, resource))
|
17
|
+
begin
|
18
|
+
response = client.describe_replication_groups({
|
19
|
+
replication_group_id: resource['replication_group_id']
|
20
|
+
})
|
21
|
+
if response.replication_groups.size >= 1
|
22
|
+
id = response.replication_groups.first.replication_group_id
|
23
|
+
import!(base, resource_type, resource_name, id)
|
24
|
+
end
|
25
|
+
rescue ::Aws::ElastiCache::Errors::ReplicationGroupNotFoundFault
|
26
|
+
# Does not exist to import
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsElasticacheSubnetGroup
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'name', resource_name.gsub('_', ' '))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
13
|
+
new_resources.each do |resource_name, resource|
|
14
|
+
client = ::Aws::ElastiCache::Client.new(aws_options(base, resource))
|
15
|
+
response = client.describe_cache_subnet_groups({
|
16
|
+
cache_subnet_group_name: resource_name
|
17
|
+
})
|
18
|
+
if response.cache_subnet_groups.size >= 1
|
19
|
+
id = response.cache_subnet_groups.first.cache_subnet_group_name
|
20
|
+
import!(base, resource_type, resource_name, id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsIamPolicy
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
Tfrb::Block.send(:define_method, :s3_replication_policy) do |bucket|
|
7
|
+
policy = <<-POLICY
|
8
|
+
{
|
9
|
+
"Version": "2012-10-17",
|
10
|
+
"Statement": [
|
11
|
+
{
|
12
|
+
"Effect": "Allow",
|
13
|
+
"Action": [
|
14
|
+
"s3:ListAllMyBuckets"
|
15
|
+
],
|
16
|
+
"Resource": "arn:aws:s3:::*"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"Effect": "Allow",
|
20
|
+
"Action": [
|
21
|
+
"s3:ListBucket",
|
22
|
+
"s3:GetBucketLocation"
|
23
|
+
],
|
24
|
+
"Resource": [
|
25
|
+
"arn:aws:s3:::#{bucket}"
|
26
|
+
]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"Effect": "Allow",
|
30
|
+
"Action": [
|
31
|
+
"s3:PutObject",
|
32
|
+
"s3:PutObjectAcl",
|
33
|
+
"s3:GetObject",
|
34
|
+
"s3:GetObjectAcl",
|
35
|
+
"s3:DeleteObject"
|
36
|
+
],
|
37
|
+
"Resource": [
|
38
|
+
"arn:aws:s3:::#{bucket}/*"
|
39
|
+
]
|
40
|
+
}
|
41
|
+
]
|
42
|
+
}
|
43
|
+
POLICY
|
44
|
+
policy
|
45
|
+
end
|
46
|
+
|
47
|
+
Tfrb::Block.send(:define_method, :s3_replication_policy) do |source_bucket, destination_bucket|
|
48
|
+
policy = <<-POLICY
|
49
|
+
{
|
50
|
+
"Version": "2012-10-17",
|
51
|
+
"Statement": [
|
52
|
+
{
|
53
|
+
"Action": [
|
54
|
+
"s3:GetReplicationConfiguration",
|
55
|
+
"s3:ListBucket"
|
56
|
+
],
|
57
|
+
"Effect": "Allow",
|
58
|
+
"Resource": [
|
59
|
+
"arn:aws:s3:::#{source_bucket}"
|
60
|
+
]
|
61
|
+
},
|
62
|
+
{
|
63
|
+
"Action": [
|
64
|
+
"s3:GetObjectVersion",
|
65
|
+
"s3:GetObjectVersionAcl"
|
66
|
+
],
|
67
|
+
"Effect": "Allow",
|
68
|
+
"Resource": [
|
69
|
+
"arn:aws:s3:::#{source_bucket}/*"
|
70
|
+
]
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"Action": [
|
74
|
+
"s3:ReplicateObject",
|
75
|
+
"s3:ReplicateDelete"
|
76
|
+
],
|
77
|
+
"Effect": "Allow",
|
78
|
+
"Resource": "arn:aws:s3:::#{destination_bucket}/*"
|
79
|
+
}
|
80
|
+
]
|
81
|
+
}
|
82
|
+
POLICY
|
83
|
+
policy
|
84
|
+
end
|
85
|
+
|
86
|
+
Tfrb::Block.send(:define_method, :sgw_bucket_access_policy) do |bucket|
|
87
|
+
policy = <<-POLICY
|
88
|
+
{
|
89
|
+
"Version": "2012-10-17",
|
90
|
+
"Statement": [
|
91
|
+
{
|
92
|
+
"Action": [
|
93
|
+
"s3:GetAccelerateConfiguration",
|
94
|
+
"s3:GetBucketLocation",
|
95
|
+
"s3:GetBucketVersioning",
|
96
|
+
"s3:ListBucket",
|
97
|
+
"s3:ListBucketVersions",
|
98
|
+
"s3:ListBucketMultipartUploads"
|
99
|
+
],
|
100
|
+
"Resource": "arn:aws:s3:::#{bucket}",
|
101
|
+
"Effect": "Allow"
|
102
|
+
},
|
103
|
+
{
|
104
|
+
"Action": [
|
105
|
+
"s3:AbortMultipartUpload",
|
106
|
+
"s3:DeleteObject",
|
107
|
+
"s3:DeleteObjectVersion",
|
108
|
+
"s3:GetObject",
|
109
|
+
"s3:GetObjectAcl",
|
110
|
+
"s3:GetObjectVersion",
|
111
|
+
"s3:ListMultipartUploadParts",
|
112
|
+
"s3:PutObject",
|
113
|
+
"s3:PutObjectAcl"
|
114
|
+
],
|
115
|
+
"Resource": "arn:aws:s3:::#{bucket}/*",
|
116
|
+
"Effect": "Allow"
|
117
|
+
}
|
118
|
+
]
|
119
|
+
}
|
120
|
+
POLICY
|
121
|
+
policy
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
125
|
+
new_resources.each do |resource_name, resource|
|
126
|
+
client = ::Aws::IAM::Client.new(aws_options(base, resource))
|
127
|
+
begin
|
128
|
+
response = client.list_policies({
|
129
|
+
scope: 'Local',
|
130
|
+
path_prefix: '/',
|
131
|
+
max_items: 1000
|
132
|
+
})
|
133
|
+
if policy = response.policies.find { |p| p.arn =~ /policy\/#{resource_name}$/ }
|
134
|
+
id = policy.arn
|
135
|
+
import!(base, resource_type, resource_name, id)
|
136
|
+
end
|
137
|
+
rescue ::Aws::IAM::Errors::NoSuchEntity
|
138
|
+
# Does not exist to import
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsIamRole
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
Tfrb::Block.send(:define_method, :sts_assume_role) do |service|
|
7
|
+
role = <<-ROLE
|
8
|
+
{
|
9
|
+
"Version": "2012-10-17",
|
10
|
+
"Statement": [
|
11
|
+
{
|
12
|
+
"Sid": "",
|
13
|
+
"Effect": "Allow",
|
14
|
+
"Principal": {
|
15
|
+
"Service": "#{service}.amazonaws.com"
|
16
|
+
},
|
17
|
+
"Action": "sts:AssumeRole"
|
18
|
+
}
|
19
|
+
]
|
20
|
+
}
|
21
|
+
ROLE
|
22
|
+
role
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
26
|
+
new_resources.each do |resource_name, resource|
|
27
|
+
client = ::Aws::IAM::Client.new(aws_options(base, resource))
|
28
|
+
begin
|
29
|
+
response = client.get_role({
|
30
|
+
role_name: resource['name']
|
31
|
+
})
|
32
|
+
id = response.role.role_name
|
33
|
+
import!(base, resource_type, resource_name, id)
|
34
|
+
rescue ::Aws::IAM::Errors::NoSuchEntity
|
35
|
+
# Does not exist to import
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsIamRolePolicyAttachment
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
client = ::Aws::IAM::Client.new(aws_options(base, resource))
|
9
|
+
role_name = resolve_tfvar(base, resource_type, resource_name, 'role')
|
10
|
+
next if role_name.empty?
|
11
|
+
begin
|
12
|
+
response = client.list_attached_role_policies({
|
13
|
+
role_name: role_name
|
14
|
+
})
|
15
|
+
if response.attached_policies
|
16
|
+
response.attached_policies.each do |attached_policy|
|
17
|
+
next unless attached_policy.policy_arn == resolve_tfvar(base, resource_type, resource_name, 'policy_arn')
|
18
|
+
id = "#{role_name}/#{attached_policy.policy_arn}"
|
19
|
+
import!(base, resource_type, resource_name, id)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
rescue ::Aws::IAM::Errors::NoSuchEntity, NoMethodError
|
23
|
+
# Does not exist to import
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsInstance
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
resource['tags'] = {} unless resource.has_key?('tags')
|
9
|
+
resource['tags']['Name'] = resource_name unless resource['tags'].has_key?('Name')
|
10
|
+
resource['root_block_device'] = {} unless resource.has_key?('root_block_device')
|
11
|
+
resource['root_block_device']['volume_type'] = 'gp2' unless resource['root_block_device'].has_key?('volume_type')
|
12
|
+
resource['root_block_device']['volume_size'] = 8 unless resource['root_block_device'].has_key?('volume_size')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
17
|
+
new_resources.each do |resource_name, resource|
|
18
|
+
client = ::Aws::EC2::Client.new(aws_options(base, resource))
|
19
|
+
response = client.describe_instances({
|
20
|
+
filters: [
|
21
|
+
{
|
22
|
+
name: 'tag:Name',
|
23
|
+
values: [
|
24
|
+
resource_name,
|
25
|
+
],
|
26
|
+
},
|
27
|
+
{
|
28
|
+
name: 'instance-state-name',
|
29
|
+
values: [
|
30
|
+
'pending',
|
31
|
+
'running',
|
32
|
+
'stopping',
|
33
|
+
'stopped'
|
34
|
+
],
|
35
|
+
},
|
36
|
+
],
|
37
|
+
})
|
38
|
+
if response.reservations && response.reservations.size >= 1
|
39
|
+
if response.reservations.first.instances && response.reservations.first.instances.size >= 1
|
40
|
+
id = response.reservations.first.instances.first.instance_id
|
41
|
+
import!(base, resource_type, resource_name, id)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsKmsKey
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'enable_key_rotation', true)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
13
|
+
new_resources.each do |resource_name, resource|
|
14
|
+
client = ::Aws::KMS::Client.new(aws_options(base, resource))
|
15
|
+
begin
|
16
|
+
response = client.describe_key({
|
17
|
+
key_id: "alias/#{resource_name}"
|
18
|
+
})
|
19
|
+
id = response.key_metadata.key_id
|
20
|
+
import!(base, resource_type, resource_name, id)
|
21
|
+
rescue ::Aws::KMS::Errors::NotFoundException
|
22
|
+
# Does not exist to import
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsS3Bucket
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
client = ::Aws::S3::Client.new(aws_options(base, resource))
|
9
|
+
begin
|
10
|
+
response = client.head_bucket({
|
11
|
+
bucket: resource['bucket']
|
12
|
+
})
|
13
|
+
id = resource['bucket']
|
14
|
+
import!(base, resource_type, resource_name, id)
|
15
|
+
rescue ::Aws::S3::Errors::NoSuchBucket, ::Aws::S3::Errors::NotFound
|
16
|
+
# Does not exist to import
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsSecurityGroup
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.preload(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
set_default(resource, 'name', resource_name.gsub('_', ' '))
|
9
|
+
resource['lifecycle'] = {} unless resource.has_key?('lifecycle')
|
10
|
+
resource['lifecycle']['create_before_destroy'] = true unless resource['lifecycle'].has_key?('create_before_destroy')
|
11
|
+
resource['tags'] = {} unless resource.has_key?('tags')
|
12
|
+
resource['tags']['Name'] = resource_name.gsub('_', ' ') unless resource['tags'].has_key?('Name')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
17
|
+
new_resources.each do |resource_name, resource|
|
18
|
+
client = ::Aws::EC2::Client.new(aws_options(base, resource))
|
19
|
+
vpc_id = resolve_tfvar(base, resource_type, resource_name, 'vpc_id')
|
20
|
+
next if vpc_id.empty?
|
21
|
+
response = client.describe_security_groups({
|
22
|
+
filters: [
|
23
|
+
{
|
24
|
+
name: 'vpc-id',
|
25
|
+
values: [vpc_id]
|
26
|
+
},
|
27
|
+
{
|
28
|
+
name: 'group-name',
|
29
|
+
values: [resource['name']]
|
30
|
+
}
|
31
|
+
]
|
32
|
+
})
|
33
|
+
if response.security_groups.size >= 1
|
34
|
+
id = response.security_groups.first.group_id
|
35
|
+
import!(base, resource_type, resource_name, id)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Tfrb::Resource::AwsStoragegatewayCache
|
4
|
+
extend Tfrb::Resource
|
5
|
+
|
6
|
+
def self.load(base, environment_name, resource_type, new_resources)
|
7
|
+
new_resources.each do |resource_name, resource|
|
8
|
+
client = ::Aws::StorageGateway::Client.new(aws_options(base, resource))
|
9
|
+
disk_id = resolve_tfvar(base, resource_type, resource_name, 'disk_id')
|
10
|
+
gateway_arn = resolve_tfvar(base, resource_type, resource_name, 'gateway_arn')
|
11
|
+
next if disk_id.empty? || gateway_arn.empty?
|
12
|
+
response = client.describe_cache({
|
13
|
+
gateway_arn: gateway_arn
|
14
|
+
})
|
15
|
+
if response.disk_ids && response.disk_ids.include?(disk_id)
|
16
|
+
id = "#{gateway_arn}:#{disk_id}"
|
17
|
+
import!(base, resource_type, resource_name, id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|