cfndk 0.0.3 → 0.0.4
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 +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
|