cfndk 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -3
- data/bin/cfndk +30 -6
- data/lib/cfndk/key_pairs.rb +2 -0
- data/lib/cfndk/stacks.rb +10 -3
- data/lib/cfndk/version.rb +1 -1
- data/sample/cfndk.yml +10 -0
- data/sample/elb/elb.yaml +73 -4
- data/sample/elb/prod.json +20 -0
- data/sample/sg/prod.json +5 -1
- data/sample/sg/sg.yaml +32 -8
- data/sample/web/web.yaml +12 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3c4548d36709c0c878369059819c9c458907a90
|
4
|
+
data.tar.gz: 2174f779691dfcf915aa1c6385c77b86556ca8eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2922c25d64ec5264c56aad0488945bf24513e3d8cdae007c936494cf6fd96283a514b16a3c9bb91a3cc0cf82c8f0a614c4c6cf3adbed1c21f9701b5f95ae571f
|
7
|
+
data.tar.gz: e141aa53962fc3c3fd80f4f532583b90acef8f09429a841186973efb82c2947adbd06ac12c5f4d9fc7d4655a523d2d3d3f54cd0255cb095865cc654629cc3ae4
|
data/README.md
CHANGED
@@ -138,11 +138,11 @@ cfndk report-stack-resource [option]
|
|
138
138
|
|
139
139
|
実行時に詳細な情報を表示します。
|
140
140
|
|
141
|
-
#### ```-c, --config_path
|
141
|
+
#### ```-c, --config_path cfndi.yml```
|
142
142
|
|
143
143
|
カレントディレクトリのcfndi.ymlの代わりに、ファイルを指定します。
|
144
144
|
|
145
|
-
#### ```-p, --properties
|
145
|
+
#### ```-p, --properties name=value```
|
146
146
|
|
147
147
|
プロパティを追加します。
|
148
148
|
cfndi.ymlのparametersのerb内で値で参照することができます。
|
@@ -154,13 +154,24 @@ UUIDが指定されるとスタック名に付加されます。
|
|
154
154
|
またcfndi.ymlのparametersの値で参照することができます。
|
155
155
|
```-a```と```-u```は最後に指定されたものが有効になります。
|
156
156
|
|
157
|
-
#### ```-u, --uuid
|
157
|
+
#### ```-u, --uuid uuid```
|
158
158
|
|
159
159
|
指定されたUUIDを使用します。
|
160
160
|
UUIDが指定されるとスタック名に付加されます。
|
161
161
|
またcfndi.ymlのparametersの値で参照することができます。
|
162
162
|
```-a```と```-u```は最後に指定されたものが有効になります。
|
163
163
|
|
164
|
+
#### ```-s, --stack-names name1,name2```
|
165
|
+
|
166
|
+
create,update,destroy,create_or_changesetのコマンドで、指定されたスタック名のみを操作します。
|
167
|
+
|
168
|
+
#### ```--no-color```
|
169
|
+
|
170
|
+
メッセージ出力でカラーを抑制します。
|
171
|
+
|
172
|
+
### ```-f, --force```
|
173
|
+
|
174
|
+
動作の確認メッセージと入力をスキップします。
|
164
175
|
|
165
176
|
## 環境変数
|
166
177
|
|
data/bin/cfndk
CHANGED
@@ -15,6 +15,20 @@ require 'securerandom'
|
|
15
15
|
|
16
16
|
require 'cfndk.rb'
|
17
17
|
|
18
|
+
def do_destroy(option)
|
19
|
+
return true if option[:force]
|
20
|
+
loop do
|
21
|
+
print 'destroy? [yes|no]:'
|
22
|
+
res = STDIN.gets
|
23
|
+
case res
|
24
|
+
when /^yes/
|
25
|
+
return true
|
26
|
+
when /^no/, /^$/
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
18
32
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
19
33
|
|
20
34
|
cur_dir = Dir.getwd
|
@@ -23,12 +37,14 @@ option = {
|
|
23
37
|
config_path: "#{cur_dir}/cfndk.yml",
|
24
38
|
uuid: ENV['CFNDK_UUID'] || nil,
|
25
39
|
properties: {},
|
40
|
+
stack_names: nil,
|
41
|
+
force: false,
|
26
42
|
}
|
27
43
|
|
28
44
|
opt = OptionParser.new do |o|
|
29
45
|
o.version = CFnDK::VERSION
|
30
46
|
o.summary_indent = ' ' * 4
|
31
|
-
o.banner =
|
47
|
+
o.banner = "Version: #{CFnDK::VERSION} \nUsage: cfndk [cmd] [options]"
|
32
48
|
o.on_head('[cmd]',
|
33
49
|
' init create config YAML file',
|
34
50
|
' create create stacks',
|
@@ -49,8 +65,8 @@ opt = OptionParser.new do |o|
|
|
49
65
|
" AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: #{ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']}",
|
50
66
|
'[options]')
|
51
67
|
o.on('-v', '--verbose', 'verbose mode') { |v| option[:v] = v }
|
52
|
-
o.on('-c', '--config_path
|
53
|
-
o.on('-p', '--properties
|
68
|
+
o.on('-c', '--config_path cfndi.yml', "config path (default: #{option[:config_path]})") { |v| option[:config_path] = v }
|
69
|
+
o.on('-p', '--properties name=value', 'properties') do |v|
|
54
70
|
md = v.match(/^([a-zA-Z_]+[a-zA-Z0-9_]*)=(.*)$/)
|
55
71
|
if md
|
56
72
|
option[:properties][md[0]] = md[1]
|
@@ -59,7 +75,10 @@ opt = OptionParser.new do |o|
|
|
59
75
|
end
|
60
76
|
end
|
61
77
|
o.on('-a', '--auto-uuid') { option[:uuid] = SecureRandom.uuid }
|
62
|
-
o.on('-u', '--uuid
|
78
|
+
o.on('-u', '--uuid uuid') { |v| option[:uuid] = v }
|
79
|
+
o.on('-n', '--stack-names name1,name2') { |v| option[:stack_names] = v.split(/\s*,\s*/) }
|
80
|
+
o.on('--no-color') { |b| Rainbow.enabled = false }
|
81
|
+
o.on('-f', '--force') { |b| option[:force] = true }
|
63
82
|
o.permute!(ARGV)
|
64
83
|
end
|
65
84
|
|
@@ -92,18 +111,23 @@ keypairs = CFnDK::KeyPairs.new(data, option, credentials)
|
|
92
111
|
|
93
112
|
if ARGV[0] == 'create'
|
94
113
|
puts 'create...'.color :green
|
114
|
+
stacks.validate
|
95
115
|
keypairs.create
|
96
116
|
stacks.create
|
97
117
|
elsif ARGV[0] == 'update'
|
98
118
|
puts 'update...'.color :green
|
119
|
+
stacks.validate
|
99
120
|
stacks.update
|
100
121
|
elsif ARGV[0] == 'create-or-changeset'
|
101
122
|
puts 'create or changeset...'.color :green
|
123
|
+
stacks.validate
|
102
124
|
stacks.create_or_changeset
|
103
125
|
elsif ARGV[0] == 'destroy'
|
104
126
|
puts 'destroy...'.color :green
|
105
|
-
|
106
|
-
|
127
|
+
if do_destroy(option)
|
128
|
+
stacks.destroy
|
129
|
+
keypairs.destroy
|
130
|
+
end
|
107
131
|
elsif ARGV[0] == 'validate'
|
108
132
|
puts 'validate...'.color :green
|
109
133
|
stacks.validate
|
data/lib/cfndk/key_pairs.rb
CHANGED
data/lib/cfndk/stacks.rb
CHANGED
@@ -8,9 +8,9 @@ module CFnDK
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def create
|
11
|
-
validate
|
12
11
|
@sequence.each do |stacks|
|
13
12
|
stacks.each do |name|
|
13
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
14
14
|
puts(('creating ' + name).color(:green))
|
15
15
|
puts('Name :' + @stacks[name].name) if @option[:v]
|
16
16
|
puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
|
@@ -25,6 +25,7 @@ module CFnDK
|
|
25
25
|
)
|
26
26
|
end
|
27
27
|
stacks.each do |name|
|
28
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
28
29
|
begin
|
29
30
|
@cfn_client.wait_until(
|
30
31
|
:stack_create_complete,
|
@@ -41,10 +42,10 @@ module CFnDK
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def update
|
44
|
-
validate
|
45
45
|
@sequence.each do |stacks|
|
46
46
|
updating_stacks = []
|
47
47
|
stacks.each do |name|
|
48
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
48
49
|
puts(('updating ' + name).color(:green))
|
49
50
|
puts('Name :' + @stacks[name].name) if @option[:v]
|
50
51
|
puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
|
@@ -63,6 +64,7 @@ module CFnDK
|
|
63
64
|
end
|
64
65
|
end
|
65
66
|
updating_stacks.each do |name|
|
67
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
66
68
|
@cfn_client.wait_until(
|
67
69
|
:stack_update_complete,
|
68
70
|
stack_name: @stacks[name].name
|
@@ -73,11 +75,11 @@ module CFnDK
|
|
73
75
|
end
|
74
76
|
|
75
77
|
def create_or_changeset
|
76
|
-
validate
|
77
78
|
@sequence.each do |stacks|
|
78
79
|
create_stacks = []
|
79
80
|
changeset_stacks = []
|
80
81
|
stacks.each do |name|
|
82
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
81
83
|
begin
|
82
84
|
@cfn_client.describe_stacks(
|
83
85
|
stack_name: @stacks[name].name
|
@@ -111,6 +113,7 @@ module CFnDK
|
|
111
113
|
end
|
112
114
|
end
|
113
115
|
create_stacks.each do |name|
|
116
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
114
117
|
@cfn_client.wait_until(
|
115
118
|
:stack_create_complete,
|
116
119
|
stack_name: @stacks[name].name
|
@@ -118,6 +121,7 @@ module CFnDK
|
|
118
121
|
puts(('created ' + name).color(:green))
|
119
122
|
end
|
120
123
|
changeset_stacks.each do |name|
|
124
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
121
125
|
begin
|
122
126
|
@cfn_client.wait_until(
|
123
127
|
:change_set_create_complete,
|
@@ -266,6 +270,7 @@ module CFnDK
|
|
266
270
|
def destroy
|
267
271
|
@sequence.reverse_each do |stacks|
|
268
272
|
stacks.each do |name|
|
273
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
269
274
|
puts(('deleting ' + name).color(:green))
|
270
275
|
puts('Name :' + @stacks[name].name) if @option[:v]
|
271
276
|
@cfn_client.delete_stack(
|
@@ -273,6 +278,7 @@ module CFnDK
|
|
273
278
|
)
|
274
279
|
end
|
275
280
|
stacks.each do |name|
|
281
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
276
282
|
@cfn_client.wait_until(
|
277
283
|
:stack_delete_complete,
|
278
284
|
stack_name: @stacks[name].name
|
@@ -285,6 +291,7 @@ module CFnDK
|
|
285
291
|
def validate
|
286
292
|
@sequence.each do |stacks|
|
287
293
|
stacks.each do |name|
|
294
|
+
next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
|
288
295
|
puts(('validate ' + name).color(:green))
|
289
296
|
puts('Name :' + @stacks[name].name) if @option[:v]
|
290
297
|
@cfn_client.validate_template(
|
data/lib/cfndk/version.rb
CHANGED
data/sample/cfndk.yml
CHANGED
@@ -41,6 +41,16 @@ stacks:
|
|
41
41
|
- CFnDKSampleSg
|
42
42
|
- CFnDKSampleIam
|
43
43
|
timeout_in_minutes: 2
|
44
|
+
CFnDKSampleElb:
|
45
|
+
template_file: elb/elb.yaml
|
46
|
+
parameter_input: elb/prod.json
|
47
|
+
parameters:
|
48
|
+
VpcName: Sample<%= append_uuid %>
|
49
|
+
InternalDnsName: sample<%= append_uuid %>.local
|
50
|
+
depends:
|
51
|
+
- CFnDKSampleWeb
|
52
|
+
- CFnDKSampleSg
|
53
|
+
timeout_in_minutes: 5
|
44
54
|
CFnDKSampleDb:
|
45
55
|
template_file: db/db.yaml
|
46
56
|
parameter_input: db/prod.json
|
data/sample/elb/elb.yaml
CHANGED
@@ -1,8 +1,77 @@
|
|
1
1
|
AWSTemplateFormatVersion: '2010-09-09'
|
2
2
|
Description: ELB Stack
|
3
|
-
|
4
3
|
Parameters:
|
5
|
-
|
4
|
+
VpcName:
|
5
|
+
Description: Name for this VPC
|
6
|
+
Type: String
|
7
|
+
InternalDnsName:
|
8
|
+
Description: Internal DNS name
|
9
|
+
Type: String
|
10
|
+
Environment:
|
11
|
+
Description: Name for this Environment
|
12
|
+
Type: String
|
13
|
+
WebElbHostName:
|
14
|
+
Description: Local DNS Name for ELB
|
15
|
+
Type: String
|
6
16
|
Resources:
|
7
|
-
|
8
|
-
|
17
|
+
WebLoadBalancer:
|
18
|
+
Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
|
19
|
+
Properties:
|
20
|
+
Type: application
|
21
|
+
Scheme: internet-facing
|
22
|
+
Subnets:
|
23
|
+
- Fn::ImportValue: !Sub ${VpcName}-${Environment}-Public-Subnet1
|
24
|
+
- Fn::ImportValue: !Sub ${VpcName}-${Environment}-Public-Subnet2
|
25
|
+
SecurityGroups:
|
26
|
+
- Fn::ImportValue: !Sub ${VpcName}-${Environment}-Web-ElbSg
|
27
|
+
Tags:
|
28
|
+
- Key: Name
|
29
|
+
Value: !Sub ${VpcName}-${Environment}-Web-Elb
|
30
|
+
WebLoadBalancerRecordSet:
|
31
|
+
Type: AWS::Route53::RecordSet
|
32
|
+
Properties:
|
33
|
+
HostedZoneId:
|
34
|
+
Fn::ImportValue: !Sub ${VpcName}-InternalDns
|
35
|
+
Comment: DNS name for ELB
|
36
|
+
Name:
|
37
|
+
!Join
|
38
|
+
- '.'
|
39
|
+
- - !Ref WebElbHostName
|
40
|
+
- Fn::ImportValue: !Sub ${VpcName}-InternalDnsName
|
41
|
+
Type: CNAME
|
42
|
+
TTL: '60'
|
43
|
+
ResourceRecords:
|
44
|
+
- !GetAtt WebLoadBalancer.DNSName
|
45
|
+
WebTargetGroup:
|
46
|
+
Type: AWS::ElasticLoadBalancingV2::TargetGroup
|
47
|
+
Properties:
|
48
|
+
HealthCheckIntervalSeconds: 30
|
49
|
+
HealthCheckPath: /
|
50
|
+
HealthCheckPort: "80"
|
51
|
+
HealthCheckProtocol: HTTP
|
52
|
+
HealthCheckTimeoutSeconds: 5
|
53
|
+
HealthyThresholdCount: 2
|
54
|
+
Port: 80
|
55
|
+
Protocol: HTTP
|
56
|
+
UnhealthyThresholdCount: 5
|
57
|
+
VpcId:
|
58
|
+
Fn::ImportValue: !Sub ${VpcName}-VpcId
|
59
|
+
Targets:
|
60
|
+
- Id:
|
61
|
+
Fn::ImportValue: !Sub ${VpcName}-${Environment}-Web1
|
62
|
+
Port: 80
|
63
|
+
- Id:
|
64
|
+
Fn::ImportValue: !Sub ${VpcName}-${Environment}-Web2
|
65
|
+
Port: 80
|
66
|
+
Tags:
|
67
|
+
- Key: Name
|
68
|
+
Value: !Sub ${VpcName}-Web-Tg
|
69
|
+
WebListener:
|
70
|
+
Type: AWS::ElasticLoadBalancingV2::Listener
|
71
|
+
Properties:
|
72
|
+
DefaultActions:
|
73
|
+
- Type: forward
|
74
|
+
TargetGroupArn: !Ref WebTargetGroup
|
75
|
+
LoadBalancerArn: !Ref WebLoadBalancer
|
76
|
+
Port: 80
|
77
|
+
Protocol: HTTP
|
data/sample/elb/prod.json
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
{
|
2
|
+
"Parameters": [
|
3
|
+
{
|
4
|
+
"ParameterKey": "VpcName",
|
5
|
+
"ParameterValue": "sample"
|
6
|
+
},
|
7
|
+
{
|
8
|
+
"ParameterKey": "Environment",
|
9
|
+
"ParameterValue": "Prod"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"ParameterKey": "WebElbHostName",
|
13
|
+
"ParameterValue": "elb"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"ParameterKey": "InternalDnsName",
|
17
|
+
"ParameterValue": "sample.local"
|
18
|
+
}
|
19
|
+
]
|
20
|
+
}
|
data/sample/sg/prod.json
CHANGED
data/sample/sg/sg.yaml
CHANGED
@@ -4,7 +4,31 @@ Parameters:
|
|
4
4
|
VpcName:
|
5
5
|
Description: Name for this VPC
|
6
6
|
Type: String
|
7
|
+
Environment:
|
8
|
+
Description: Name for this Environment
|
9
|
+
Type: String
|
7
10
|
Resources:
|
11
|
+
WebElbSg:
|
12
|
+
Type: AWS::EC2::SecurityGroup
|
13
|
+
Properties:
|
14
|
+
GroupName: !Sub ${VpcName}-Web-Elb-Sg
|
15
|
+
GroupDescription: Web ELB Acccess Security Group
|
16
|
+
VpcId:
|
17
|
+
Fn::ImportValue: !Sub ${VpcName}-VpcId
|
18
|
+
SecurityGroupIngress:
|
19
|
+
- IpProtocol: tcp
|
20
|
+
FromPort: 80
|
21
|
+
ToPort: 80
|
22
|
+
CidrIp: 0.0.0.0/0
|
23
|
+
Description: Allow HTTP Access From Internet
|
24
|
+
- IpProtocol: tcp
|
25
|
+
FromPort: 443
|
26
|
+
ToPort: 443
|
27
|
+
CidrIp: 0.0.0.0/0
|
28
|
+
Description: Allow HTTPS Access From Internet
|
29
|
+
Tags:
|
30
|
+
- Key: Name
|
31
|
+
Value: !Sub ${VpcName}-Web-Elb-Sg
|
8
32
|
WebInstanceSg:
|
9
33
|
Type: AWS::EC2::SecurityGroup
|
10
34
|
Properties:
|
@@ -13,16 +37,11 @@ Resources:
|
|
13
37
|
VpcId:
|
14
38
|
Fn::ImportValue: !Sub ${VpcName}-VpcId
|
15
39
|
SecurityGroupIngress:
|
16
|
-
- IpProtocol: tcp
|
17
|
-
FromPort: 22
|
18
|
-
ToPort: 22
|
19
|
-
CidrIp: 0.0.0.0/0
|
20
|
-
Description: Allow SSH Access From Internet
|
21
40
|
- IpProtocol: tcp
|
22
41
|
FromPort: 80
|
23
42
|
ToPort: 80
|
24
|
-
|
25
|
-
Description: Allow HTTP Access From
|
43
|
+
SourceSecurityGroupId: !Ref WebElbSg
|
44
|
+
Description: Allow HTTP Access From ELB
|
26
45
|
Tags:
|
27
46
|
- Key: Name
|
28
47
|
Value: !Sub ${VpcName}-Web-Instance-Sg
|
@@ -39,6 +58,11 @@ Resources:
|
|
39
58
|
ToPort: 3306
|
40
59
|
SourceSecurityGroupId: !Ref WebInstanceSg
|
41
60
|
Outputs:
|
61
|
+
WebElbSg:
|
62
|
+
Description: ELB Security Group ID
|
63
|
+
Value: !Ref WebElbSg
|
64
|
+
Export:
|
65
|
+
Name: !Sub ${VpcName}-${Environment}-Web-ElbSg
|
42
66
|
WebInstanceSg:
|
43
67
|
Description: WebInstance Security Group ID
|
44
68
|
Value: !Ref WebInstanceSg
|
@@ -48,4 +72,4 @@ Outputs:
|
|
48
72
|
Description: Db Security Group ID
|
49
73
|
Value: !Ref DbSg
|
50
74
|
Export:
|
51
|
-
Name: !Sub ${VpcName}-DbSg
|
75
|
+
Name: !Sub ${VpcName}-DbSg
|
data/sample/web/web.yaml
CHANGED
@@ -129,4 +129,15 @@ Resources:
|
|
129
129
|
Dimensions:
|
130
130
|
- Name: InstanceId
|
131
131
|
Value: !Ref Web2Instance
|
132
|
-
DependsOn: Web2Instance
|
132
|
+
DependsOn: Web2Instance
|
133
|
+
Outputs:
|
134
|
+
Web1Instance:
|
135
|
+
Description: EC2 ID
|
136
|
+
Value: !Ref Web1Instance
|
137
|
+
Export:
|
138
|
+
Name: !Sub ${VpcName}-${Environment}-Web1
|
139
|
+
Web2Instance:
|
140
|
+
Description: EC2 ID
|
141
|
+
Value: !Ref Web2Instance
|
142
|
+
Export:
|
143
|
+
Name: !Sub ${VpcName}-${Environment}-Web2
|