TerraformDevKit 0.2.7 → 0.3.1.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/TerraformDevKit.gemspec +1 -0
- data/lib/TerraformDevKit/aws/aws.rb +65 -0
- data/lib/TerraformDevKit/aws/cloudfront.rb +20 -0
- data/lib/TerraformDevKit/aws/dynamodb.rb +46 -0
- data/lib/TerraformDevKit/aws/s3.rb +44 -0
- data/lib/TerraformDevKit/aws/terraform_remote_state.rb +67 -0
- data/lib/TerraformDevKit/version.rb +1 -1
- data/lib/TerraformDevKit.rb +5 -4
- data/tasks/devkit.rake +4 -4
- metadata +23 -8
- data/lib/TerraformDevKit/aws.rb +0 -63
- data/lib/TerraformDevKit/dynamodb.rb +0 -45
- data/lib/TerraformDevKit/s3.rb +0 -43
- data/lib/TerraformDevKit/terraform_remote_state.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61324a6263f32fec652b3c6daea0cd8ee4122fdd
|
4
|
+
data.tar.gz: 110251680246f79e70f9852c6daf7ac544f0a459
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2479eee7bea5199c2a23f6ce00b34e635ccee5d1ae93c1701af70322158883088def53933d4ab5f41c61502499969d48e48359b150f592649d23c68365300b64
|
7
|
+
data.tar.gz: ce79833600dc8e75b7f67d4e2bf283669287c5db096ba9ce123f37d0444ad3c02e861796095b00d6cb058c9c7e6468e7cc7b4b7f9c9498c5499ab92df2f48f4d
|
data/TerraformDevKit.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_runtime_dependency 'aws-sdk-core', '~> 3'
|
30
30
|
spec.add_runtime_dependency 'aws-sdk-dynamodb', '~> 1'
|
31
|
+
spec.add_runtime_dependency 'aws-sdk-cloudfront', '~> 1'
|
31
32
|
spec.add_runtime_dependency 'aws-sdk-s3', '~> 1'
|
32
33
|
spec.add_runtime_dependency 'mustache', '~> 1.0'
|
33
34
|
spec.add_runtime_dependency 'rainbow', '~> 3.0'
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'aws-sdk-core'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
class AwsConfig
|
8
|
+
def initialize(config)
|
9
|
+
unless config.nil?
|
10
|
+
@profile = config.fetch('profile', nil)
|
11
|
+
@region = config.fetch('region', nil)
|
12
|
+
@access_key_id = config.fetch('access_key_id', nil)
|
13
|
+
@secret_access_key = config.fetch('secret_access_key', nil)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def credentials
|
18
|
+
unless profile.nil?
|
19
|
+
credentials = ::Aws::SharedCredentials.new(profile_name: profile)
|
20
|
+
return credentials if credentials.set?
|
21
|
+
end
|
22
|
+
|
23
|
+
return ::Aws::Credentials.new(*access_keys) if access_keys_available?
|
24
|
+
|
25
|
+
raise 'Cannot find AWS credentials'
|
26
|
+
end
|
27
|
+
|
28
|
+
def region
|
29
|
+
@region || ENV['AWS_REGION']
|
30
|
+
end
|
31
|
+
|
32
|
+
def profile
|
33
|
+
@profile || ENV['AWS_PROFILE']
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def access_keys
|
39
|
+
return config_access_keys if config_has_access_keys?
|
40
|
+
return environment_access_keys if environment_has_access_keys?
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def access_keys_available?
|
45
|
+
config_has_access_keys? || environment_has_access_keys?
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_has_access_keys?
|
49
|
+
!@access_key_id.nil? && !@secret_access_key.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def config_access_keys
|
53
|
+
return @access_key_id, @secret_access_key
|
54
|
+
end
|
55
|
+
|
56
|
+
def environment_has_access_keys?
|
57
|
+
ENV.key?('AWS_ACCESS_KEY_ID') && ENV.key?('AWS_SECRET_ACCESS_KEY')
|
58
|
+
end
|
59
|
+
|
60
|
+
def environment_access_keys
|
61
|
+
return ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'aws-sdk-cloudfront'
|
2
|
+
|
3
|
+
module TerraformDevKit
|
4
|
+
module Aws
|
5
|
+
class CloudFront
|
6
|
+
def initialize(credentials, region)
|
7
|
+
@cloudfront = ::Aws::CloudFront::Client.new(
|
8
|
+
region: region,
|
9
|
+
credentials:credentials
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
def distribution_is_deployed?(distribution_id)
|
14
|
+
@cloudfront.get_distribution({
|
15
|
+
id: distribution_id,
|
16
|
+
}).distribution.status == 'Deployed'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'aws-sdk-dynamodb'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
# Wrapper class around aws dynamodb
|
8
|
+
class DynamoDB
|
9
|
+
def initialize(credentials, region)
|
10
|
+
@db_client = ::Aws::DynamoDB::Client.new(
|
11
|
+
credentials: credentials,
|
12
|
+
region: region
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def put_item(table_name, item)
|
17
|
+
@db_client.put_item({item: item, table_name: table_name})
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_table(table_name, attributes, keys, read_capacity, write_capacity)
|
21
|
+
@db_client.create_table(
|
22
|
+
attribute_definitions: attributes,
|
23
|
+
key_schema: keys,
|
24
|
+
provisioned_throughput: {
|
25
|
+
read_capacity_units: read_capacity,
|
26
|
+
write_capacity_units: write_capacity
|
27
|
+
},
|
28
|
+
table_name: table_name
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_table_status(table_name)
|
33
|
+
resp = @db_client.describe_table({
|
34
|
+
table_name: table_name,
|
35
|
+
})
|
36
|
+
resp.table.table_status
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_table(table_name)
|
40
|
+
@db_client.delete_table({
|
41
|
+
table_name: table_name,
|
42
|
+
})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'aws-sdk-s3'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
class S3
|
8
|
+
def initialize(credentials, region)
|
9
|
+
@s3_client = ::Aws::S3::Client.new(
|
10
|
+
credentials: credentials,
|
11
|
+
region: region
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_bucket(bucket_name)
|
16
|
+
@s3_client.create_bucket(
|
17
|
+
bucket: bucket_name
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_bucket(bucket_name)
|
22
|
+
empty_bucket(bucket_name)
|
23
|
+
|
24
|
+
@s3_client.delete_bucket(
|
25
|
+
bucket: bucket_name
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def empty_bucket(bucket_name)
|
30
|
+
keys_to_delete = @s3_client
|
31
|
+
.list_objects_v2(bucket: bucket_name)
|
32
|
+
.contents
|
33
|
+
.map { |x| { key: x.key } }
|
34
|
+
|
35
|
+
@s3_client.delete_objects(
|
36
|
+
bucket: bucket_name,
|
37
|
+
delete: {
|
38
|
+
objects: keys_to_delete
|
39
|
+
}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'aws-sdk-dynamodb'
|
2
|
+
require 'aws-sdk-s3'
|
3
|
+
|
4
|
+
module TerraformDevKit
|
5
|
+
module Aws
|
6
|
+
class TerraformRemoteState
|
7
|
+
ATTRIBUTES = [
|
8
|
+
{
|
9
|
+
attribute_name: 'LockID',
|
10
|
+
attribute_type: 'S'
|
11
|
+
}
|
12
|
+
]
|
13
|
+
KEYS = [
|
14
|
+
{
|
15
|
+
attribute_name: 'LockID',
|
16
|
+
key_type: 'HASH'
|
17
|
+
}
|
18
|
+
]
|
19
|
+
|
20
|
+
def initialize(dynamodb, s3)
|
21
|
+
@dynamodb = dynamodb
|
22
|
+
@s3 = s3
|
23
|
+
end
|
24
|
+
|
25
|
+
def init(environment, project)
|
26
|
+
table_name = table_name(environment, project)
|
27
|
+
return if lock_table_exists_and_is_active(table_name)
|
28
|
+
|
29
|
+
@dynamodb.create_table(table_name, ATTRIBUTES, KEYS, 1, 1)
|
30
|
+
|
31
|
+
begin
|
32
|
+
@s3.create_bucket(state_bucket_name(environment, project))
|
33
|
+
rescue Aws::S3::Errors::BucketAlreadyOwnedByYou
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
sleep(0.2) until lock_table_exists_and_is_active(table_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy(environment, project)
|
41
|
+
table_name = table_name(environment, project)
|
42
|
+
|
43
|
+
@dynamodb.delete_table(table_name)
|
44
|
+
@s3.delete_bucket(state_bucket_name(environment, project))
|
45
|
+
end
|
46
|
+
|
47
|
+
private_class_method
|
48
|
+
def lock_table_exists_and_is_active(table_name)
|
49
|
+
begin
|
50
|
+
return @dynamodb.get_table_status(table_name) == 'ACTIVE'
|
51
|
+
rescue Aws::DynamoDB::Errors::ResourceNotFoundException
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private_class_method
|
57
|
+
def table_name(environment, project)
|
58
|
+
"#{project.acronym}-#{environment.name}-lock-table"
|
59
|
+
end
|
60
|
+
|
61
|
+
private_class_method
|
62
|
+
def state_bucket_name(environment, project)
|
63
|
+
"#{project.name}-#{environment.name}-state"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/TerraformDevKit.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
require 'TerraformDevKit/aws'
|
1
|
+
require 'TerraformDevKit/aws/aws'
|
2
|
+
require 'TerraformDevKit/aws/cloudfront'
|
3
|
+
require 'TerraformDevKit/aws/dynamodb'
|
4
|
+
require 'TerraformDevKit/aws/terraform_remote_state'
|
5
|
+
require 'TerraformDevKit/aws/s3'
|
2
6
|
require 'TerraformDevKit/backup_state'
|
3
7
|
require 'TerraformDevKit/command'
|
4
8
|
require 'TerraformDevKit/config'
|
5
|
-
require 'TerraformDevKit/dynamodb'
|
6
9
|
require 'TerraformDevKit/environment'
|
7
10
|
require 'TerraformDevKit/extended_file_utils'
|
8
11
|
require 'TerraformDevKit/os'
|
9
12
|
require 'TerraformDevKit/request'
|
10
13
|
require 'TerraformDevKit/retry'
|
11
|
-
require 'TerraformDevKit/s3'
|
12
14
|
require 'TerraformDevKit/terraform_config_manager'
|
13
15
|
require 'TerraformDevKit/terraform_env_manager'
|
14
16
|
require 'TerraformDevKit/terraform_installer'
|
15
|
-
require 'TerraformDevKit/terraform_remote_state'
|
16
17
|
require 'TerraformDevKit/terraform_log_filter'
|
17
18
|
require 'TerraformDevKit/terraform_project_config'
|
18
19
|
require 'TerraformDevKit/terraform_template_config_file'
|
data/tasks/devkit.rake
CHANGED
@@ -40,16 +40,16 @@ def task_in_current_namespace(task_name, current_task)
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def remote_state
|
43
|
-
aws_config = TDK::AwsConfig.new(TDK::Configuration.get('aws'))
|
44
|
-
dynamo_db = TDK::DynamoDB.new(
|
43
|
+
aws_config = TDK::Aws::AwsConfig.new(TDK::Configuration.get('aws'))
|
44
|
+
dynamo_db = TDK::Aws::DynamoDB.new(
|
45
45
|
aws_config.credentials,
|
46
46
|
aws_config.region
|
47
47
|
)
|
48
|
-
s3 = TDK::S3.new(
|
48
|
+
s3 = TDK::Aws::S3.new(
|
49
49
|
aws_config.credentials,
|
50
50
|
aws_config.region
|
51
51
|
)
|
52
|
-
TDK::TerraformRemoteState.new(dynamo_db, s3)
|
52
|
+
TDK::Aws::TerraformRemoteState.new(dynamo_db, s3)
|
53
53
|
end
|
54
54
|
|
55
55
|
desc 'Prepares the environment to create the infrastructure'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: TerraformDevKit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Jimenez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: aws-sdk-cloudfront
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: aws-sdk-s3
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,24 +185,25 @@ files:
|
|
171
185
|
- bin/setup
|
172
186
|
- exe/wait_for_url
|
173
187
|
- lib/TerraformDevKit.rb
|
174
|
-
- lib/TerraformDevKit/aws.rb
|
188
|
+
- lib/TerraformDevKit/aws/aws.rb
|
189
|
+
- lib/TerraformDevKit/aws/cloudfront.rb
|
190
|
+
- lib/TerraformDevKit/aws/dynamodb.rb
|
191
|
+
- lib/TerraformDevKit/aws/s3.rb
|
192
|
+
- lib/TerraformDevKit/aws/terraform_remote_state.rb
|
175
193
|
- lib/TerraformDevKit/backup_state.rb
|
176
194
|
- lib/TerraformDevKit/command.rb
|
177
195
|
- lib/TerraformDevKit/config.rb
|
178
196
|
- lib/TerraformDevKit/download.rb
|
179
|
-
- lib/TerraformDevKit/dynamodb.rb
|
180
197
|
- lib/TerraformDevKit/environment.rb
|
181
198
|
- lib/TerraformDevKit/extended_file_utils.rb
|
182
199
|
- lib/TerraformDevKit/os.rb
|
183
200
|
- lib/TerraformDevKit/request.rb
|
184
201
|
- lib/TerraformDevKit/retry.rb
|
185
|
-
- lib/TerraformDevKit/s3.rb
|
186
202
|
- lib/TerraformDevKit/terraform_config_manager.rb
|
187
203
|
- lib/TerraformDevKit/terraform_env_manager.rb
|
188
204
|
- lib/TerraformDevKit/terraform_installer.rb
|
189
205
|
- lib/TerraformDevKit/terraform_log_filter.rb
|
190
206
|
- lib/TerraformDevKit/terraform_project_config.rb
|
191
|
-
- lib/TerraformDevKit/terraform_remote_state.rb
|
192
207
|
- lib/TerraformDevKit/terraform_template_config_file.rb
|
193
208
|
- lib/TerraformDevKit/url.rb
|
194
209
|
- lib/TerraformDevKit/version.rb
|
@@ -209,9 +224,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
209
224
|
version: '0'
|
210
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
226
|
requirements:
|
212
|
-
- - "
|
227
|
+
- - ">"
|
213
228
|
- !ruby/object:Gem::Version
|
214
|
-
version:
|
229
|
+
version: 1.3.1
|
215
230
|
requirements: []
|
216
231
|
rubyforge_project:
|
217
232
|
rubygems_version: 2.6.13
|
data/lib/TerraformDevKit/aws.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'aws-sdk-core'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
class AwsConfig
|
7
|
-
def initialize(config)
|
8
|
-
unless config.nil?
|
9
|
-
@profile = config.fetch('profile', nil)
|
10
|
-
@region = config.fetch('region', nil)
|
11
|
-
@access_key_id = config.fetch('access_key_id', nil)
|
12
|
-
@secret_access_key = config.fetch('secret_access_key', nil)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def credentials
|
17
|
-
unless profile.nil?
|
18
|
-
credentials = Aws::SharedCredentials.new(profile_name: profile)
|
19
|
-
return credentials if credentials.set?
|
20
|
-
end
|
21
|
-
|
22
|
-
return Aws::Credentials.new(*access_keys) if access_keys_available?
|
23
|
-
|
24
|
-
raise 'Cannot find AWS credentials'
|
25
|
-
end
|
26
|
-
|
27
|
-
def region
|
28
|
-
@region || ENV['AWS_REGION']
|
29
|
-
end
|
30
|
-
|
31
|
-
def profile
|
32
|
-
@profile || ENV['AWS_PROFILE']
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def access_keys
|
38
|
-
return config_access_keys if config_has_access_keys?
|
39
|
-
return environment_access_keys if environment_has_access_keys?
|
40
|
-
nil
|
41
|
-
end
|
42
|
-
|
43
|
-
def access_keys_available?
|
44
|
-
config_has_access_keys? || environment_has_access_keys?
|
45
|
-
end
|
46
|
-
|
47
|
-
def config_has_access_keys?
|
48
|
-
!@access_key_id.nil? && !@secret_access_key.nil?
|
49
|
-
end
|
50
|
-
|
51
|
-
def config_access_keys
|
52
|
-
return @access_key_id, @secret_access_key
|
53
|
-
end
|
54
|
-
|
55
|
-
def environment_has_access_keys?
|
56
|
-
ENV.key?('AWS_ACCESS_KEY_ID') && ENV.key?('AWS_SECRET_ACCESS_KEY')
|
57
|
-
end
|
58
|
-
|
59
|
-
def environment_access_keys
|
60
|
-
return ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'aws-sdk-dynamodb'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
# Wrapper class around aws dynamodb
|
7
|
-
class DynamoDB
|
8
|
-
def initialize(credentials, region)
|
9
|
-
@db_client = Aws::DynamoDB::Client.new(
|
10
|
-
credentials: credentials,
|
11
|
-
region: region
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
def put_item(table_name, item)
|
16
|
-
@db_client.put_item({item: item, table_name: table_name})
|
17
|
-
end
|
18
|
-
|
19
|
-
def create_table(table_name, attributes, keys, read_capacity, write_capacity)
|
20
|
-
@db_client.create_table(
|
21
|
-
attribute_definitions: attributes,
|
22
|
-
key_schema: keys,
|
23
|
-
provisioned_throughput: {
|
24
|
-
read_capacity_units: read_capacity,
|
25
|
-
write_capacity_units: write_capacity
|
26
|
-
},
|
27
|
-
table_name: table_name
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
def get_table_status(table_name)
|
32
|
-
resp = @db_client.describe_table({
|
33
|
-
table_name: table_name,
|
34
|
-
})
|
35
|
-
resp.table.table_status
|
36
|
-
end
|
37
|
-
|
38
|
-
def delete_table(table_name)
|
39
|
-
@db_client.delete_table({
|
40
|
-
table_name: table_name,
|
41
|
-
})
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
data/lib/TerraformDevKit/s3.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'aws-sdk-s3'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
# Wrapper class around aws s3
|
7
|
-
class S3
|
8
|
-
def initialize(credentials, region)
|
9
|
-
@s3_client = Aws::S3::Client.new(
|
10
|
-
credentials: credentials,
|
11
|
-
region: region
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
def create_bucket(bucket_name)
|
16
|
-
@s3_client.create_bucket(
|
17
|
-
bucket: bucket_name
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
def delete_bucket(bucket_name)
|
22
|
-
empty_bucket(bucket_name)
|
23
|
-
|
24
|
-
@s3_client.delete_bucket(
|
25
|
-
bucket: bucket_name
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
def empty_bucket(bucket_name)
|
30
|
-
keys_to_delete = @s3_client
|
31
|
-
.list_objects_v2(bucket: bucket_name)
|
32
|
-
.contents
|
33
|
-
.map { |x| { key: x.key } }
|
34
|
-
|
35
|
-
@s3_client.delete_objects(
|
36
|
-
bucket: bucket_name,
|
37
|
-
delete: {
|
38
|
-
objects: keys_to_delete
|
39
|
-
}
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'aws-sdk-dynamodb'
|
2
|
-
require 'aws-sdk-s3'
|
3
|
-
|
4
|
-
module TerraformDevKit
|
5
|
-
# Represents a terraform lock table.
|
6
|
-
class TerraformRemoteState
|
7
|
-
ATTRIBUTES = [
|
8
|
-
{
|
9
|
-
attribute_name: 'LockID',
|
10
|
-
attribute_type: 'S'
|
11
|
-
}
|
12
|
-
]
|
13
|
-
KEYS = [
|
14
|
-
{
|
15
|
-
attribute_name: 'LockID',
|
16
|
-
key_type: 'HASH'
|
17
|
-
}
|
18
|
-
]
|
19
|
-
|
20
|
-
def initialize(dynamodb, s3)
|
21
|
-
@dynamodb = dynamodb
|
22
|
-
@s3 = s3
|
23
|
-
end
|
24
|
-
|
25
|
-
def init(environment, project)
|
26
|
-
table_name = table_name(environment, project)
|
27
|
-
return if lock_table_exists_and_is_active(table_name)
|
28
|
-
|
29
|
-
@dynamodb.create_table(table_name, ATTRIBUTES, KEYS, 1, 1)
|
30
|
-
|
31
|
-
begin
|
32
|
-
@s3.create_bucket(state_bucket_name(environment, project))
|
33
|
-
rescue Aws::S3::Errors::BucketAlreadyOwnedByYou
|
34
|
-
return
|
35
|
-
end
|
36
|
-
|
37
|
-
sleep(0.2) until lock_table_exists_and_is_active(table_name)
|
38
|
-
end
|
39
|
-
|
40
|
-
def destroy(environment, project)
|
41
|
-
table_name = table_name(environment, project)
|
42
|
-
|
43
|
-
@dynamodb.delete_table(table_name)
|
44
|
-
@s3.delete_bucket(state_bucket_name(environment, project))
|
45
|
-
end
|
46
|
-
|
47
|
-
private_class_method
|
48
|
-
def lock_table_exists_and_is_active(table_name)
|
49
|
-
begin
|
50
|
-
return @dynamodb.get_table_status(table_name) == 'ACTIVE'
|
51
|
-
rescue Aws::DynamoDB::Errors::ResourceNotFoundException
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
private_class_method
|
57
|
-
def table_name(environment, project)
|
58
|
-
"#{project.acronym}-#{environment.name}-lock-table"
|
59
|
-
end
|
60
|
-
|
61
|
-
private_class_method
|
62
|
-
def state_bucket_name(environment, project)
|
63
|
-
"#{project.name}-#{environment.name}-state"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|