Class: Sfn::Callback::StackPolicy
- Inherits:
-
Sfn::Callback
- Object
- Sfn::Callback
- Sfn::Callback::StackPolicy
- Defined in:
- lib/sfn/callback/stack_policy.rb
Constant Summary collapse
- DEFENSELESS_POLICY =
Policy to apply prior to stack deletion
{ "Statement" => [{ "Effect" => "Allow", "Action" => "Update:*", "Resource" => "*", "Principal" => "*", }], }
Instance Attribute Summary collapse
-
#policies ⇒ Smash
readonly
Cached policies.
Attributes inherited from Sfn::Callback
#api, #arguments, #config, #ui
Instance Method Summary collapse
-
#before_update(args) ⇒ Object
Disable all existing policies prior to update.
-
#initialize(*args) ⇒ self
constructor
Overload to init policy cache.
-
#save_stack_policy(p_stack) ⇒ NilClass
Save the cached policy for the given stack.
-
#submit_policy(args) ⇒ Object
(also: #after_create, #after_update)
Submit all cached policies.
-
#template(info) ⇒ Object
Generate stack policy for stack and cache for the after hook to handle.
Methods inherited from Sfn::Callback
Constructor Details
#initialize(*args) ⇒ self
Overload to init policy cache
23 24 25 26 |
# File 'lib/sfn/callback/stack_policy.rb', line 23 def initialize(*args) super @policies = Smash.new end |
Instance Attribute Details
#policies ⇒ Smash (readonly)
Returns cached policies.
18 19 20 |
# File 'lib/sfn/callback/stack_policy.rb', line 18 def policies @policies end |
Instance Method Details
#before_update(args) ⇒ Object
Disable all existing policies prior to update
48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/sfn/callback/stack_policy.rb', line 48 def before_update(args) if config.get(:stack_policy, :update).to_s == "defenseless" ui.warn "Disabling all stack policies for update." stack = args[:api_stack] ([stack] + stack.nested_stacks).compact.each do |p_stack| @policies[p_stack.name] = DEFENSELESS_POLICY run_action "Disabling stack policy for #{ui.color(p_stack.name, :yellow)}" do save_stack_policy(p_stack) end end end end |
#save_stack_policy(p_stack) ⇒ NilClass
Save the cached policy for the given stack
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/sfn/callback/stack_policy.rb', line 76 def save_stack_policy(p_stack) valid_logical_ids = p_stack.resources.reload.all.map(&:logical_id) stack_policy = @policies.fetch(p_stack.id, @policies.fetch(p_stack.data[:logical_id]), @policies[p_stack.name]).to_smash if stack_policy stack_policy[:Statement].delete_if do |policy_item| policy_match = policy_item[:Resource].to_s.match( %r{LogicalResourceId/(?<logical_id>.+)$} ) if policy_match !valid_logical_ids.include?(policy_match["logical_id"]) end end end result = p_stack.api.request( :path => "/", :method => :post, :form => Smash.new( "Action" => "SetStackPolicy", "StackName" => p_stack.id, "StackPolicyBody" => MultiJson.dump(stack_policy), ), ) end |
#submit_policy(args) ⇒ Object Also known as: after_create, after_update
Submit all cached policies
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/sfn/callback/stack_policy.rb', line 31 def submit_policy(args) ui.info "Submitting stack policy documents" stack = args[:api_stack] ([stack] + stack.nested_stacks).compact.each do |p_stack| run_action "Applying stack policy to #{ui.color(p_stack.name, :yellow)}" do save_stack_policy(p_stack) end end ui.info "Stack policy documents successfully submitted!" end |
#template(info) ⇒ Object
Generate stack policy for stack and cache for the after hook to handle
65 66 67 68 69 70 |
# File 'lib/sfn/callback/stack_policy.rb', line 65 def template(info) if info[:sparkle_stack] @policies.set(info.fetch(:stack_name, "unknown"), info[:sparkle_stack].generate_policy) end end |