tfctl 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -2
- data/.travis.yml +2 -1
- data/CHANGELOG.adoc +8 -0
- data/README.adoc +32 -18
- data/docs/configuration.adoc +8 -6
- data/docs/control_tower.adoc +39 -21
- data/docs/iam_permissions.adoc +2 -2
- data/docs/project_layout.adoc +3 -3
- data/lib/tfctl/aws_org.rb +17 -15
- data/lib/tfctl/version.rb +1 -1
- data/tfctl.gemspec +4 -4
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7a1d287bce54f0203c80b4814f67ddb3d5f38319796a185a69ccf1fe1b65f02
|
4
|
+
data.tar.gz: 924e81046fde7a921f66959893429c10fbcffd8a3f32e1b6257cde2935c1b5d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 044ad7209c428aa8c1f7eaf11258089ed6ce304a2943b79739ba1b8337fbd6487f4cda758c73acfc9de35f17fc272ef98d74fe64c274ea4d5e0112bc1749329b
|
7
|
+
data.tar.gz: 22a221bb105a66c5b9512a604886eb458ff1ec2876ee8d3599f7c6c0cc5e6abb5fafd0d47aa2cd61fbc979b0ba5ca33a8f18a47a5afacfd27515ea5e333f0868
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
---
|
2
2
|
AllCops:
|
3
|
-
TargetRubyVersion: 2.
|
3
|
+
TargetRubyVersion: 2.5
|
4
4
|
DisplayCopNames: true
|
5
5
|
|
6
6
|
Layout/IndentationWidth:
|
@@ -45,7 +45,7 @@ Metrics/BlockLength:
|
|
45
45
|
Metrics/MethodLength:
|
46
46
|
Enabled: false
|
47
47
|
|
48
|
-
|
48
|
+
Layout/LineLength:
|
49
49
|
Max: 140
|
50
50
|
|
51
51
|
Metrics/AbcSize:
|
@@ -77,3 +77,7 @@ Style/TrailingCommaInHashLiteral:
|
|
77
77
|
|
78
78
|
Style/RedundantReturn:
|
79
79
|
Enabled: false
|
80
|
+
|
81
|
+
# don't break older Rubies just because of style
|
82
|
+
Style/RedundantBegin:
|
83
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGELOG.adoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== Upcoming
|
4
|
+
|
5
|
+
== 1.1.1
|
6
|
+
|
7
|
+
* fix: handle empty response from Organizations API containing children (thanks @grothja)
|
8
|
+
* chore: stopped testing on EOL Rubies 2.3 and 2.4 (but should still currently work)
|
9
|
+
* chore: dependencies minimum version bump
|
10
|
+
|
3
11
|
== 1.1.0
|
4
12
|
|
5
13
|
* feat: look for configuration in `tfctl.yaml` by default.
|
data/README.adoc
CHANGED
@@ -28,15 +28,16 @@ toc::[]
|
|
28
28
|
|
29
29
|
== Overview
|
30
30
|
|
31
|
-
|
31
|
+
`tfctl` is a small Terraform wrapper for working with multi-account AWS
|
32
32
|
infrastructures where new accounts may be created dynamically and on-demand.
|
33
33
|
|
34
|
-
It discovers accounts by reading the AWS Organizations API and can assign
|
34
|
+
It discovers accounts by reading the AWS Organizations API, and can assign
|
35
35
|
Terraform resources to multiple accounts based on the organization hierarchy.
|
36
36
|
Resources can be assigned globally, based on organization unit or to individual
|
37
|
-
accounts. It supports
|
37
|
+
accounts. It supports hierarchies of nested Organizational Units (OUs),
|
38
|
+
and helps keep your Terraform DRY.
|
38
39
|
|
39
|
-
|
40
|
+
The Scale Factory originally created tfctl to integrate Terraform with
|
40
41
|
https://aws.amazon.com/solutions/aws-landing-zone/[AWS Landing Zone] and
|
41
42
|
https://aws.amazon.com/controltower/[Control Tower] but should work with most
|
42
43
|
other ways of managing accounts in AWS Organizations.
|
@@ -57,7 +58,7 @@ other ways of managing accounts in AWS Organizations.
|
|
57
58
|
== Requirements
|
58
59
|
|
59
60
|
* Terraform >= 0.12
|
60
|
-
* Ruby >= 2.
|
61
|
+
* Ruby >= 2.4
|
61
62
|
* Accounts managed in AWS Organizations (by Landing Zone, Control Tower, some
|
62
63
|
other means)
|
63
64
|
|
@@ -65,17 +66,19 @@ other ways of managing accounts in AWS Organizations.
|
|
65
66
|
|
66
67
|
To install the latest release from RubyGems run:
|
67
68
|
|
69
|
+
[source,shell]
|
68
70
|
----
|
69
71
|
gem install tfctl
|
70
72
|
----
|
71
73
|
|
72
|
-
Alternatively you can build and install from this repo with:
|
74
|
+
Alternatively, you can build and install from this repo with:
|
73
75
|
|
76
|
+
[source,shell]
|
74
77
|
----
|
75
78
|
make install
|
76
79
|
----
|
77
80
|
|
78
|
-
==
|
81
|
+
== Documentation
|
79
82
|
|
80
83
|
* https://github.com/scalefactory/tfctl/tree/master/docs/control_tower.adoc[Control Tower quick start guide]
|
81
84
|
* https://github.com/scalefactory/tfctl/tree/master/docs/project_layout.adoc[Project layout]
|
@@ -85,11 +88,12 @@ make install
|
|
85
88
|
|
86
89
|
== Running tfctl
|
87
90
|
|
88
|
-
|
89
|
-
Terraform configuration in `.tfctl
|
91
|
+
You should run `tfctl` from the root of your project directory. It will generate
|
92
|
+
Terraform configuration in `.tfctl/` (add this to your `.gitignore`).
|
90
93
|
|
91
94
|
Anatomy of a tfctl command:
|
92
95
|
|
96
|
+
[source,shell]
|
93
97
|
----
|
94
98
|
tfctl -c CONFIG_FILE TARGET_OPTIONS -- TERRAFORM_COMMAND
|
95
99
|
----
|
@@ -102,7 +106,7 @@ tfctl -c CONFIG_FILE TARGET_OPTIONS -- TERRAFORM_COMMAND
|
|
102
106
|
options. See https://www.terraform.io/docs/commands/index.html[Terraform
|
103
107
|
commands] for details.
|
104
108
|
|
105
|
-
NOTE: You must have your AWS credentials configured before
|
109
|
+
NOTE: You must have your AWS credentials configured before you run `tfctl`, or run
|
106
110
|
it using an AWS credentials helper such as
|
107
111
|
https://github.com/99designs/aws-vault[aws-vault].
|
108
112
|
|
@@ -110,18 +114,21 @@ https://github.com/99designs/aws-vault[aws-vault].
|
|
110
114
|
|
111
115
|
Show help:
|
112
116
|
|
117
|
+
[source,shell]
|
113
118
|
----
|
114
119
|
tfctl -h
|
115
120
|
----
|
116
121
|
|
117
122
|
Show merged configuration:
|
118
123
|
|
124
|
+
[source,shell]
|
119
125
|
----
|
120
126
|
tfctl -s
|
121
127
|
----
|
122
128
|
|
123
129
|
List all discovered accounts:
|
124
130
|
|
131
|
+
[source,shell]
|
125
132
|
----
|
126
133
|
tfctl --all -l
|
127
134
|
----
|
@@ -129,49 +136,56 @@ tfctl --all -l
|
|
129
136
|
TIP: This can be narrowed down using targeting options and is a good way to
|
130
137
|
test what accounts match.
|
131
138
|
|
132
|
-
Run
|
139
|
+
Run `terraform init` across all accounts:
|
133
140
|
|
141
|
+
[source,shell]
|
134
142
|
----
|
135
143
|
tfctl --all -- init
|
136
144
|
----
|
137
145
|
|
138
|
-
|
146
|
+
Plan Terraform across all accounts in the `test` OU:
|
139
147
|
|
148
|
+
[source,shell]
|
140
149
|
----
|
141
150
|
tfctl -o test -- plan
|
142
151
|
----
|
143
152
|
|
144
|
-
|
153
|
+
Plan Terraform in `live` accounts, assuming that `live` is a child OU in multiple
|
145
154
|
organization units:
|
146
155
|
|
156
|
+
[source,shell]
|
147
157
|
----
|
148
158
|
tfctl -o '.*/live' -- plan
|
149
159
|
----
|
150
160
|
|
151
|
-
Run plan
|
161
|
+
Run a plan for an individual account:
|
152
162
|
|
163
|
+
[source,shell]
|
153
164
|
----
|
154
165
|
tfctl -a example-account - plan
|
155
166
|
----
|
156
167
|
|
157
|
-
|
168
|
+
Apply Terraform changes across all accounts:
|
158
169
|
|
170
|
+
[source,shell]
|
159
171
|
----
|
160
172
|
tfctl --all -- apply
|
161
173
|
----
|
162
174
|
|
163
|
-
|
175
|
+
Destroy Terraform-managed resources in all the `test` OU accounts:
|
164
176
|
|
177
|
+
[source,shell]
|
165
178
|
----
|
166
179
|
tfctl -o test -- destroy -auto-approve
|
167
180
|
----
|
168
181
|
|
169
182
|
Don't buffer the output:
|
170
183
|
|
184
|
+
[source,shell]
|
171
185
|
----
|
172
186
|
tfctl -a example-account -u -- plan
|
173
187
|
----
|
174
188
|
|
175
189
|
This will show output in real time. Usually output is buffered and displayed
|
176
|
-
after Terraform command finishes to make it more readable when running
|
177
|
-
multiple accounts in parallel.
|
190
|
+
after the Terraform command finishes, to make it more readable when running
|
191
|
+
across multiple accounts in parallel.
|
data/docs/configuration.adoc
CHANGED
@@ -24,8 +24,8 @@ toc::[]
|
|
24
24
|
|
25
25
|
== Overview
|
26
26
|
|
27
|
-
|
28
|
-
it with configuration specified in
|
27
|
+
`tfctl` retrieves initial account configuration from AWS Organizations and merges
|
28
|
+
it with configuration specified in YAML format (`tfctl.yaml` by default).
|
29
29
|
|
30
30
|
The configuration is merged in the following order:
|
31
31
|
|
@@ -83,14 +83,16 @@ above.
|
|
83
83
|
|
84
84
|
== Handling secrets
|
85
85
|
|
86
|
-
|
87
|
-
|
86
|
+
CAUTION: Do not commit secrets into your Terraform or tfctl configuration.
|
87
|
+
|
88
|
+
Instead, use AWS Secrets Manager and retrieve secrets in Terraform profiles using
|
89
|
+
the
|
88
90
|
https://www.terraform.io/docs/providers/aws/d/secretsmanager_secret.html[secrets
|
89
|
-
manager data source]
|
91
|
+
manager data source].
|
90
92
|
|
91
93
|
== Configuration Schema
|
92
94
|
|
93
|
-
|
95
|
+
The configuration file is validated using https://json-schema.org/[JSON Schema].
|
94
96
|
|
95
97
|
The schema is defined in
|
96
98
|
https://github.com/scalefactory/tfctl/blob/master/lib/tfctl/schema.rb[lib/tfctl/schema.rb]
|
data/docs/control_tower.adoc
CHANGED
@@ -31,7 +31,7 @@ toc::[]
|
|
31
31
|
For state tracking we're going to create a dedicated `shared-services` account
|
32
32
|
under a `mgmt` organization unit. We'll use S3 for state storage and DynamoDB
|
33
33
|
for locking. `TerraformState` IAM role will be created for cross account
|
34
|
-
access to state resources from the primary account.
|
34
|
+
access to state resources from the primary AWS account.
|
35
35
|
|
36
36
|
In the primary account we'll create a `TfctlOrgAccess` role. It gives tfctl
|
37
37
|
read only access to AWS Organizations which is used to discover accounts and
|
@@ -50,9 +50,10 @@ and provision a couple of accounts for testing.
|
|
50
50
|
|
51
51
|
Before starting you'll need:
|
52
52
|
|
53
|
-
*
|
54
|
-
*
|
55
|
-
*
|
53
|
+
* An AWS account that is part of an Organization.
|
54
|
+
* Control Tower set up in your primary AWS account.
|
55
|
+
* A user with `AdministratorAccess` privileges in your primary AWS account.
|
56
|
+
* AWS CLI tools installed on your local machine.
|
56
57
|
* Terraform 0.12 or higher.
|
57
58
|
|
58
59
|
== Configure Control Tower
|
@@ -74,6 +75,7 @@ approximately 20 mins to provision one.
|
|
74
75
|
|
75
76
|
== Install tfctl
|
76
77
|
|
78
|
+
[source,shell]
|
77
79
|
----
|
78
80
|
git clone git@github.com:scalefactory/tfctl.git
|
79
81
|
cd tfctl/ && sudo make install
|
@@ -85,17 +87,21 @@ It's assumed you have configured AWS CLI access to the primary account.
|
|
85
87
|
|
86
88
|
We'll use CloudFormation templates in `examples/bootstrap/`.
|
87
89
|
|
88
|
-
First export configuration using environment variables making sure to change to
|
89
|
-
values to suit your
|
90
|
+
First export configuration using environment variables, making sure to change to
|
91
|
+
values to suit your setup:
|
90
92
|
|
93
|
+
[source,shell]
|
91
94
|
----
|
92
|
-
|
93
|
-
export
|
95
|
+
# Change these to match your setup
|
96
|
+
export PRIMARY_ACCOUNT_ID=123456789012
|
97
|
+
export SHARED_SERVICES_ACCOUNT_ID=345678901234
|
94
98
|
export STATE_BUCKET_NAME='example-terraform-state'
|
99
|
+
export AWS_REGION=eu-west-1
|
95
100
|
----
|
96
101
|
|
97
102
|
Create the remote state resources stack set:
|
98
103
|
|
104
|
+
[source,shell]
|
99
105
|
----
|
100
106
|
cd examples/bootstrap/
|
101
107
|
|
@@ -107,31 +113,34 @@ aws cloudformation create-stack-set \
|
|
107
113
|
--execution-role-name AWSControlTowerExecution \
|
108
114
|
--administration-role-arn arn:aws:iam::${PRIMARY_ACCOUNT_ID}:role/service-role/AWSControlTowerStackSetRole \
|
109
115
|
--parameters ParameterKey=PrimaryAccountId,ParameterValue=${PRIMARY_ACCOUNT_ID} \
|
110
|
-
ParameterKey=TerraformStateBucket,ParameterValue
|
116
|
+
ParameterKey=TerraformStateBucket,ParameterValue="${STATE_BUCKET_NAME}"
|
111
117
|
----
|
112
118
|
|
113
|
-
Create a stack set instance in
|
119
|
+
Create a stack set instance in your shared services account:
|
114
120
|
|
121
|
+
[source,shell]
|
115
122
|
----
|
116
123
|
aws cloudformation create-stack-instances \
|
117
124
|
--stack-set-name TerraformState \
|
118
125
|
--accounts ${SHARED_SERVICES_ACCOUNT_ID} \
|
119
|
-
--regions
|
126
|
+
--regions ${AWS_REGION}
|
120
127
|
----
|
121
128
|
|
122
129
|
Check status:
|
123
130
|
|
131
|
+
[source,shell]
|
124
132
|
----
|
125
133
|
aws cloudformation describe-stack-instance \
|
126
134
|
--stack-set-name TerraformState \
|
127
135
|
--stack-instance-account ${SHARED_SERVICES_ACCOUNT_ID} \
|
128
|
-
--stack-instance-region
|
136
|
+
--stack-instance-region ${AWS_REGION}
|
129
137
|
----
|
130
138
|
|
131
139
|
NOTE: Initial status will be `OUTDATED`, it should change to `CURRENT` once deployed.
|
132
140
|
|
133
|
-
Deploy `TfctlOrgAccess` IAM role stack:
|
141
|
+
Deploy the `TfctlOrgAccess` IAM role stack:
|
134
142
|
|
143
|
+
[source,shell]
|
135
144
|
----
|
136
145
|
aws cloudformation create-stack \
|
137
146
|
--stack-name TfctlOrgAccess \
|
@@ -142,6 +151,7 @@ aws cloudformation create-stack \
|
|
142
151
|
|
143
152
|
Check status:
|
144
153
|
|
154
|
+
[source,shell]
|
145
155
|
----
|
146
156
|
aws cloudformation describe-stacks --stack-name TfctlOrgAccess
|
147
157
|
----
|
@@ -158,7 +168,7 @@ You need to modify the following parameters:
|
|
158
168
|
* `tf_state_bucket` - set to `$STATE_BUCKET_NAME`
|
159
169
|
* `tf_state_role_arn` - set shared services account ID
|
160
170
|
* `tfctl_role_arn` - set primary account ID
|
161
|
-
* `primary_account` - set the primary account name. You can find it
|
171
|
+
* `primary_account` - set the primary account name. You can find it through AWS Organizations in the console.
|
162
172
|
|
163
173
|
TIP: You should keep your project directory under version control.
|
164
174
|
|
@@ -169,43 +179,51 @@ and `mgmt` OUs.
|
|
169
179
|
|
170
180
|
NOTE: Run tfctl commands from the root of you project directory.
|
171
181
|
|
172
|
-
First dump the configuration to verify everything works:
|
182
|
+
First, dump the configuration to verify everything works:
|
173
183
|
|
184
|
+
[source,shell]
|
174
185
|
----
|
175
186
|
tfctl -s
|
176
187
|
----
|
177
188
|
|
178
|
-
This will not make any changes but will print out
|
189
|
+
This will not make any changes but will print out YAML containing the final,
|
179
190
|
merged configuration data. It should contain a list of discovered accounts and
|
180
191
|
their configuration.
|
181
192
|
|
182
|
-
Initialise
|
193
|
+
Initialise Terraform for all discovered accounts:
|
183
194
|
|
195
|
+
[source,shell]
|
184
196
|
----
|
185
197
|
tfctl --all -- init
|
186
198
|
----
|
187
199
|
|
188
200
|
Tfctl will run Terraform against all accounts in parallel.
|
189
201
|
|
190
|
-
|
202
|
+
`plan` the Terraform:
|
191
203
|
|
204
|
+
[source,shell]
|
192
205
|
----
|
193
206
|
tfctl --all -- plan
|
194
207
|
----
|
195
208
|
|
196
|
-
and apply:
|
209
|
+
and `apply` it:
|
197
210
|
|
211
|
+
[source,shell]
|
198
212
|
----
|
199
213
|
tfctl --all -- apply
|
200
214
|
----
|
201
215
|
|
202
|
-
To destroy created resources run:
|
203
216
|
|
217
|
+
== Clean up
|
218
|
+
|
219
|
+
To destroy created resources, run:
|
220
|
+
|
221
|
+
[source,shell]
|
204
222
|
----
|
205
223
|
tfctl --all -- destroy -auto-approve
|
206
224
|
----
|
207
225
|
|
208
|
-
That's it! You can now execute
|
226
|
+
That's it! You can now execute Terraform across your Control Tower estate.
|
209
227
|
|
210
228
|
TIP: Your project directory should be under version control excluding the
|
211
229
|
`.tfctl` directory which is automatically generated.
|
data/docs/iam_permissions.adoc
CHANGED
@@ -20,7 +20,7 @@ endif::[]
|
|
20
20
|
|
21
21
|
= IAM roles
|
22
22
|
|
23
|
-
|
23
|
+
`tfctl` usually requires three IAM roles to be configured:
|
24
24
|
|
25
25
|
* `TfctlRole` - read only access to AWS Organizations set up in the primary account.
|
26
26
|
* `TerraformStateRole` - access to remote state resources (S3, DynamoDB) in the
|
@@ -28,7 +28,7 @@ Tfctl usually requires three IAM roles to be configured:
|
|
28
28
|
* `TerraformExecutionRole` - configured in all spoke accounts and used for executing Terraform.
|
29
29
|
|
30
30
|
The user executing tfctl needs permission to assume all three roles cross
|
31
|
-
account.
|
31
|
+
account. Once these are configured, tfctl automatically assumes roles for you.
|
32
32
|
|
33
33
|
It's possible to configure different Terraform execution roles in different
|
34
34
|
spoke accounts based on OU or account names. This can be used to restrict
|
data/docs/project_layout.adoc
CHANGED
@@ -50,12 +50,12 @@ The configuration data is exposed to terraform via a profile `config` variable.
|
|
50
50
|
It also defines Terraform and tfctl configuration such as state tracking and
|
51
51
|
what IAM roles to use.
|
52
52
|
|
53
|
-
By default tfctl will use `tfctl.yaml` in
|
53
|
+
By default, tfctl will use `tfctl.yaml` in its current working directory. You
|
54
54
|
can specify a different file using `-c`. Multiple configurations are supported
|
55
55
|
in the same project directory and generated data will be stored separately for
|
56
56
|
each config file in `.tfctl/`.
|
57
57
|
|
58
|
-
== profiles
|
58
|
+
== `profiles`
|
59
59
|
|
60
60
|
Profiles are re-usable collections of resources which can be applied to
|
61
61
|
accounts. They are implemented just like usual modules but provide an
|
@@ -64,6 +64,6 @@ other data sources). Profiles often compose multiple modules and provide
|
|
64
64
|
configuration data to them. This approach makes it possible to re-use standard
|
65
65
|
modules (e.g. Terraform module registry).
|
66
66
|
|
67
|
-
== modules
|
67
|
+
== `modules`
|
68
68
|
|
69
69
|
Standard Terraform modules.
|
data/lib/tfctl/aws_org.rb
CHANGED
@@ -71,23 +71,25 @@ module Tfctl
|
|
71
71
|
@aws_org_client.list_children(
|
72
72
|
child_type: 'ORGANIZATIONAL_UNIT',
|
73
73
|
parent_id: parent_id,
|
74
|
-
).
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
74
|
+
).each do |resp|
|
75
|
+
resp.children.each do |child|
|
76
|
+
|
77
|
+
begin
|
78
|
+
ou = @aws_org_client.describe_organizational_unit(
|
79
|
+
organizational_unit_id: child.id,
|
80
|
+
).organizational_unit
|
81
|
+
rescue Aws::Organizations::Errors::TooManyRequestsException
|
82
|
+
# FIXME: - use logger
|
83
|
+
puts 'AWS Organizations: too many requests. Retrying in 5 secs.'
|
84
|
+
sleep 5
|
85
|
+
retries += 1
|
86
|
+
retry if retries < 10
|
87
|
+
end
|
87
88
|
|
88
|
-
|
89
|
+
ou_name = parent_name == :root ? ou.name.to_sym : "#{parent_name}/#{ou.name}".to_sym
|
89
90
|
|
90
|
-
|
91
|
+
output[ou_name] = ou.id
|
92
|
+
end
|
91
93
|
end
|
92
94
|
output
|
93
95
|
end
|
data/lib/tfctl/version.rb
CHANGED
data/tfctl.gemspec
CHANGED
@@ -25,12 +25,12 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
# Think when adding new dependencies. Is it really necessary?
|
27
27
|
# "The things you own end up owning you" etc.
|
28
|
-
spec.add_dependency 'aws-sdk-organizations', '~> 1.
|
28
|
+
spec.add_dependency 'aws-sdk-organizations', '~> 1.40'
|
29
29
|
spec.add_dependency 'json_schemer', '~> 0.2'
|
30
|
-
spec.add_dependency 'parallel', '~> 1.
|
30
|
+
spec.add_dependency 'parallel', '~> 1.19'
|
31
31
|
spec.add_dependency 'terminal-table', '~> 1.8'
|
32
32
|
|
33
33
|
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
34
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
35
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 0.84'
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tfctl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Wasilczuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-organizations
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.40'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.40'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: json_schemer
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.19'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
54
|
+
version: '1.19'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: terminal-table
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,28 +86,28 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.9'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
96
|
+
version: '3.9'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
103
|
+
version: '0.84'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
110
|
+
version: '0.84'
|
111
111
|
description:
|
112
112
|
email:
|
113
113
|
- akw@scalefactory.com
|