require "stackdeploy/version" require "aws-sdk" require "pp" module Stackdeploy def self.run region = ARGV[0] stack_name = ARGV[1] param_name = ARGV[2] param_value = ARGV[3] if !region || !stack_name || !param_name || !param_value puts "Usage: stackdeploy region stack param value" exit(1) end puts "Updating stack #{stack_name} in #{region} with parameter #{param_name}=\"#{param_value}\"" cloudformation = Aws::CloudFormation::Client.new(region: region) stacks = cloudformation.describe_stacks(stack_name: stack_name) stack = stacks.stacks[0] if !stack puts "Stack #{stack} not found." exit(1) end options = { stack_name: stack_name, use_previous_template: true, parameters: [], capabilities: ["CAPABILITY_IAM"], notification_arns: stack.notification_arns } stack.parameters.each do |param| options_param = { parameter_key: param.parameter_key } if param.parameter_key == param_name options_param[:parameter_value] = param_value options_param[:use_previous_value] = false param.use_previous_value = false else options_param[:parameter_value] = nil options_param[:use_previous_value] = true end options[:parameters] << options_param end begin response = cloudformation.update_stack(options) rescue Aws::CloudFormation::Errors::ValidationError => e puts "Update failed: #{e}" exit(1) end if response.successful? puts "Update requested successfully." else puts "Update request failed." exit(1) end end end