Class: Ufo::Cfn::Stack
- Inherits:
-
Base
show all
- Extended by:
- Memoist
- Includes:
- Hooks::Concern, TaskDefinition::Helpers::AwsHelper
- Defined in:
- lib/ufo/cfn/stack/status.rb,
lib/ufo/cfn/stack.rb,
lib/ufo/cfn/stack/vpc.rb,
lib/ufo/cfn/stack/vars.rb,
lib/ufo/cfn/stack/params.rb,
lib/ufo/cfn/stack/builder.rb,
lib/ufo/cfn/stack/template.rb,
lib/ufo/cfn/stack/custom_properties.rb
Overview
CloudFormation status codes, full list:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
CREATE_COMPLETE
ROLLBACK_COMPLETE
DELETE_COMPLETE
UPDATE_COMPLETE
UPDATE_ROLLBACK_COMPLETE
CREATE_FAILED
DELETE_FAILED
ROLLBACK_FAILED
UPDATE_ROLLBACK_FAILED
CREATE_IN_PROGRESS
DELETE_IN_PROGRESS
REVIEW_IN_PROGRESS
ROLLBACK_IN_PROGRESS
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS
UPDATE_IN_PROGRESS
UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS
UPDATE_ROLLBACK_IN_PROGRESS
Defined Under Namespace
Classes: Builder, CustomProperties, Params, Status, Template, Vars, Vpc
Instance Attribute Summary
#task_definition
Instance Method Summary
collapse
#run_hooks
#aws
#info, #ps
#names
#acm, #applicationautoscaling, #aws_options, #cfn, #cloudwatchlogs, #ec2, #ecr, #ecs, #elb, #s3, #ssm_client, #waf_client
#find_stack, #find_stack_resources, #stack_resources, #status, #task_definition_arns
#initialize
#sure?
#pretty_home, #pretty_path, #pretty_time
#logger
Constructor Details
This class inherits a constructor from Ufo::CLI::Base
Instance Method Details
#build ⇒ Object
Run hooks here so both ufo docker and ufo ship runs it
ufo docker => CLI::Build
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/ufo/cfn/stack.rb', line 83
def build
run_hooks(name: "build", file: "ufo.rb") do
vars = Vars.new(@options).values
options_with_vars = @options.dup.merge(vars: vars)
params = Params.new(options_with_vars)
@parameters = params.build
template = Template.new(options_with_vars)
@template_body = template.body
end
end
|
#cancel ⇒ Object
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
# File 'lib/ufo/cfn/stack.rb', line 151
def cancel
stack = find_stack(@stack_name)
unless stack
logger.error "No #{@stack_name} stack to cancel".color(:red)
exit 1
end
if stack.stack_status == "CREATE_IN_PROGRESS"
cfn.delete_stack(stack_name: @stack_name)
logger.info "Canceling stack creation"
elsif stack.stack_status == "UPDATE_IN_PROGRESS"
cfn.cancel_update_stack(stack_name: @stack_name)
logger.info "Canceling stack update"
else
logger.info "The stack is not in a state to that is cancelable: #{stack.stack_status}"
end
end
|
#deploy ⇒ Object
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/ufo/cfn/stack.rb', line 30
def deploy
build
@stack = find_stack(@stack_name)
if @stack && rollback_complete?(@stack)
logger.info "Existing stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
cfn.delete_stack(stack_name: @stack_name)
status.wait
status.reset
@stack = nil end
exit_with_message(@stack) if @stack && !updatable?(@stack)
run_hooks(name: "ship", file: "ufo.rb") do
@stack ? perform(:update) : perform(:create)
stop_old_tasks if @options[:stop_old_task]
return unless @options[:wait]
status.wait
end
logger.info status.rollback_error_message if status.update_rollback?
status.success?
end
|
#exit_with_message(stack) ⇒ Object
99
100
101
102
103
104
|
# File 'lib/ufo/cfn/stack.rb', line 99
def exit_with_message(stack)
url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks"
logger.info "The stack is not in an updateable state: #{stack.stack_status.color(:yellow)}."
logger.info "Here's the CloudFormation url to check for more details #{url}"
exit 1
end
|
#handle_stack_error(e) ⇒ Object
Assume only first container_definition to get the container info. Stack:arn:aws:cloudformation:… is in ROLLBACK_COMPLETE state and can not be updated.
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# File 'lib/ufo/cfn/stack.rb', line 108
def handle_stack_error(e)
case e.message
when /state and can not be updated/
logger.info "The #{@stack_name} stack is in a state that cannot be updated. Deleted the stack and try again."
logger.info "ERROR: #{e.message}"
if message.include?('UPDATE_ROLLBACK_FAILED')
logger.info "You might be able to do a 'Continue Update Rollback' and skip some resources to get the stack back into a good state."
end
url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}"
logger.info "Here's the CloudFormation console url: #{url}"
exit 1
when /No updates are to be performed/
logger.info "There are no updates to be performed. Exiting.".color(:yellow)
exit 1
when /YAML not well-formed/ print_code(e)
else
raise
end
end
|
54
55
56
57
58
59
|
# File 'lib/ufo/cfn/stack.rb', line 54
def perform(action)
logger.info "#{action[0..-2].capitalize}ing stack #{@stack_name.color(:green)}"
cfn.send("#{action}_stack", stack_options) rescue Aws::CloudFormation::Errors::ValidationError => e
handle_stack_error(e)
end
|
#print_code(exception) ⇒ Object
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/ufo/cfn/stack.rb', line 130
def print_code(exception)
path = ".ufo/output/template.yml"
md = exception.message.match(/line (\d+),/)
line_number = md[1]
logger.error "Template for debugging: #{path}"
if md
DslEvaluator.print_code(path, line_number)
exit 1
else
raise
end
end
|
#rollback_complete?(stack) ⇒ Boolean
143
144
145
|
# File 'lib/ufo/cfn/stack.rb', line 143
def rollback_complete?(stack)
stack.stack_status == 'ROLLBACK_COMPLETE'
end
|
#scheduling_strategy ⇒ Object
94
95
96
97
|
# File 'lib/ufo/cfn/stack.rb', line 94
def scheduling_strategy
scheduling_strategy = Ufo.config.ecs.scheduling_strategy
scheduling_strategy.upcase if scheduling_strategy
end
|
#stack_options ⇒ Object
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/ufo/cfn/stack.rb', line 61
def stack_options
options = {
capabilities: ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"],
parameters: @parameters,
stack_name: @stack_name,
template_body: @template_body,
}
cfn = Ufo.config.cfn
options[:notification_arns] = cfn.notification_arns if cfn.notification_arns
options[:disable_rollback] = cfn.disable_rollback unless cfn.disable_rollback.nil?
options[:tags] = tags(cfn.tags) if cfn.tags
options
end
|
75
76
77
78
79
|
# File 'lib/ufo/cfn/stack.rb', line 75
def tags(hash)
hash.map do |k,v|
{ key: v, value: v }
end
end
|
#updatable?(stack) ⇒ Boolean
147
148
149
|
# File 'lib/ufo/cfn/stack.rb', line 147
def updatable?(stack)
stack.stack_status =~ /_COMPLETE$/ || stack.stack_status == 'UPDATE_ROLLBACK_FAILED'
end
|