tass 0.1.0
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 +7 -0
- data/bin/tass +97 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/Autoscaling/group.rb +61 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/Autoscaling/launch_config.rb +45 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/autoscaling.rb +45 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/cloudwatch.rb +41 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/ec2.rb +23 -0
- data/lib/tapjoy/autoscaling_bootstrap/AWS/elb.rb +55 -0
- data/lib/tapjoy/autoscaling_bootstrap/alerts/monitoring.rb +38 -0
- data/lib/tapjoy/autoscaling_bootstrap/alerts/scaling.rb +75 -0
- data/lib/tapjoy/autoscaling_bootstrap/alerts.rb +7 -0
- data/lib/tapjoy/autoscaling_bootstrap/audit.rb +49 -0
- data/lib/tapjoy/autoscaling_bootstrap/autoscaling/config.rb +38 -0
- data/lib/tapjoy/autoscaling_bootstrap/autoscaling/group.rb +113 -0
- data/lib/tapjoy/autoscaling_bootstrap/autoscaling/policy.rb +37 -0
- data/lib/tapjoy/autoscaling_bootstrap/autoscaling.rb +6 -0
- data/lib/tapjoy/autoscaling_bootstrap/autoscaling_group.rb +59 -0
- data/lib/tapjoy/autoscaling_bootstrap/aws.rb +7 -0
- data/lib/tapjoy/autoscaling_bootstrap/cloudwatch.rb +29 -0
- data/lib/tapjoy/autoscaling_bootstrap/configure_autoscaler.rb +40 -0
- data/lib/tapjoy/autoscaling_bootstrap/elb.rb +56 -0
- data/lib/tapjoy/autoscaling_bootstrap/errors/elb.rb +48 -0
- data/lib/tapjoy/autoscaling_bootstrap/errors.rb +30 -0
- data/lib/tapjoy/autoscaling_bootstrap/launch_configuration.rb +42 -0
- data/lib/tapjoy/autoscaling_bootstrap/version.rb +11 -0
- data/lib/tapjoy/autoscaling_bootstrap.rb +165 -0
- metadata +182 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a59b4519fd31ade584e3b01e4e2e9e710398b0d7
|
4
|
+
data.tar.gz: bcaf7a3d8ea6ceb7aaf543cee80cb9c9d8f56e8b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bb7a05c28477783135d2685371d8e8013f313b0d74907568ea90be27fc122b53c543a10e3c526f1ea1b7629393dccb9364b210d60fb6e7086d0b123d323f9135
|
7
|
+
data.tar.gz: f63a73d33066180446250213a0f6ccacf5a9e71ea6ce776edca5218871431361de810c4b150997dc6d01792e3c61334fb3a73bd0f18af3711664bb0087a9c9c5
|
data/bin/tass
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tapjoy/autoscaling_bootstrap'
|
4
|
+
|
5
|
+
def confirm_config(aws_env, misc_config, opts)
|
6
|
+
use_vpc = true if misc_config[:vpc_subnets]
|
7
|
+
unless Tapjoy::AutoscalingBootstrap::Base.new.confirm_config(**aws_env,
|
8
|
+
**misc_config, **opts, use_vpc: use_vpc)
|
9
|
+
|
10
|
+
abort('Cannot continue if configuration is not correct. Please fix.')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def supported_envs(listing)
|
15
|
+
envs = []
|
16
|
+
Dir.entries("#{listing}/config/common").each do |file|
|
17
|
+
next unless file.end_with?('yaml')
|
18
|
+
next if file.start_with?('defaults')
|
19
|
+
envs << file.chomp!('.yaml')
|
20
|
+
end
|
21
|
+
envs
|
22
|
+
end
|
23
|
+
|
24
|
+
SUB_COMMANDS = %w(create update audit)
|
25
|
+
Trollop::options do
|
26
|
+
usage '[SUB_COMMAND] [options]'
|
27
|
+
synopsis "\nConfigures autoscaling groups.\nAvailable subcommands are: #{SUB_COMMANDS}"
|
28
|
+
version "#{File.basename($0)} #{Tapjoy::AutoscalingBootstrap::VERSION} \u00A9 2015 Tapjoy, Inc."
|
29
|
+
stop_on SUB_COMMANDS
|
30
|
+
end
|
31
|
+
|
32
|
+
cmd = ARGV.shift
|
33
|
+
case cmd
|
34
|
+
when 'create'
|
35
|
+
opts = Trollop.options do
|
36
|
+
# Set help message
|
37
|
+
usage 'create [options]'
|
38
|
+
synopsis 'This command creates new autoscaling groups, and overwrites existing ones.'
|
39
|
+
|
40
|
+
opt :filename, 'Specify config file to load', type: :string, required: true
|
41
|
+
opt :config_dir, 'Specify the directory for configuration files', type: :string, short: :none, default: Tapjoy::AutoscalingBootstrap.config_dir
|
42
|
+
opt :env, 'Specify which environment config to load', required: true, type: :string
|
43
|
+
opt :clobber_elb, 'Force ELB creation', default: false, short: :none
|
44
|
+
opt :clobber_as, 'Force AS group creation', default: false, short: :none
|
45
|
+
opt :prompt, 'Enable/disable prompts', default: true
|
46
|
+
end
|
47
|
+
|
48
|
+
env_list = supported_envs(opts[:config_dir])
|
49
|
+
unless env_list.include?(opts[:env])
|
50
|
+
Trollop.die :env, "Currently supported enviroments are #{env_list.join(',')}"
|
51
|
+
end
|
52
|
+
|
53
|
+
config, aws_env, user_data = Tapjoy::AutoscalingBootstrap::Base.new.configure_environment(opts[:filename], opts[:env], opts[:config_dir])
|
54
|
+
Aws.config[:region] = config[:aws_region]
|
55
|
+
confirm_config(aws_env, config, opts)
|
56
|
+
|
57
|
+
Tapjoy::AutoscalingBootstrap::Base.new.check_clobber(opts, config)
|
58
|
+
Tapjoy::AutoscalingBootstrap::AutoscalingGroup.new.create(opts, config, aws_env, user_data)
|
59
|
+
when 'update'
|
60
|
+
opts = Trollop.options do
|
61
|
+
# Set help message
|
62
|
+
usage 'update [options]'
|
63
|
+
synopsis 'This command creates new launch configurations based on existing autoscaling groups using local instance configuration files as overrides.'
|
64
|
+
opt :filename, 'Specify config file to load', type: :string, required: true
|
65
|
+
opt :config_dir, 'Specify the directory for configuration files', type: :string, short: :none, default: Tapjoy::AutoscalingBootstrap.config_dir
|
66
|
+
opt :env, 'Specify which environment config to load', required: true, type: :string
|
67
|
+
opt :prompt, 'Enable/disable prompts', default: true
|
68
|
+
end
|
69
|
+
|
70
|
+
env_list = supported_envs(opts[:config_dir])
|
71
|
+
unless env_list.include?(opts[:env])
|
72
|
+
Trollop.die :env, "Currently supported enviroments are #{env_list.join(',')}"
|
73
|
+
end
|
74
|
+
|
75
|
+
config, aws_env, user_data = Tapjoy::AutoscalingBootstrap::Base.new.configure_environment(opts[:filename], opts[:env], opts[:config_dir])
|
76
|
+
Aws.config[:region] = config[:aws_region]
|
77
|
+
confirm_config(aws_env, config, opts)
|
78
|
+
|
79
|
+
Tapjoy::AutoscalingBootstrap::LaunchConfiguration.new(config, aws_env, user_data)
|
80
|
+
when 'audit'
|
81
|
+
opts = Trollop.options do
|
82
|
+
usage 'audit'
|
83
|
+
synopsis 'This command compares local configuration files for a given cluster to the existing launch configuration and autoscaling group running in AWS.'
|
84
|
+
opt :filename, 'Specify config file to load', type: :string, required: true
|
85
|
+
opt :config_dir, 'Specify the directory for configuration files', type: :string, short: :none, default: Tapjoy::AutoscalingBootstrap.config_dir
|
86
|
+
opt :env, 'Specify which environment config to load', required: true, type: :string
|
87
|
+
opt :prompt, 'Enable/disable prompts', default: true
|
88
|
+
end
|
89
|
+
|
90
|
+
config, aws_env, user_data = Tapjoy::AutoscalingBootstrap::Base.new.configure_environment(opts[:filename], opts[:env], opts[:config_dir])
|
91
|
+
Aws.config[:region] = config[:aws_region]
|
92
|
+
|
93
|
+
config.merge!(aws_env.merge({user_data: Base64.encode64("#{user_data}")}))
|
94
|
+
Tapjoy::AutoscalingBootstrap::Audit.new(config)
|
95
|
+
else
|
96
|
+
Trollop.educate
|
97
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
module Autoscaling
|
5
|
+
# This module includes autoscaling group calls to AWS
|
6
|
+
module Group
|
7
|
+
class << self
|
8
|
+
def client
|
9
|
+
@client ||= Tapjoy::AutoscalingBootstrap::AWS::Autoscaling.client
|
10
|
+
end
|
11
|
+
|
12
|
+
def resize(min_size: 0, max_size: 0, desired_capacity:0)
|
13
|
+
self.client.update_auto_scaling_group(
|
14
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
15
|
+
min_size: min_size, max_size: max_size,
|
16
|
+
desired_capacity: desired_capacity)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete(force_delete: true)
|
20
|
+
self.client.delete_auto_scaling_group(
|
21
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
22
|
+
force_delete: force_delete)
|
23
|
+
end
|
24
|
+
|
25
|
+
def describe
|
26
|
+
self.client.describe_auto_scaling_groups(
|
27
|
+
auto_scaling_group_names: [
|
28
|
+
Tapjoy::AutoscalingBootstrap.scaler_name
|
29
|
+
]
|
30
|
+
)[0][0]
|
31
|
+
end
|
32
|
+
|
33
|
+
def create(zones:, health_check_type: nil, tags:,
|
34
|
+
vpc_subnets: nil, create_elb:, **unused_values)
|
35
|
+
|
36
|
+
group_hash = {
|
37
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
38
|
+
availability_zones: zones,
|
39
|
+
launch_configuration_name: Tapjoy::AutoscalingBootstrap.config_name,
|
40
|
+
min_size: 0, max_size: 0, desired_capacity: 0,
|
41
|
+
termination_policies: ['OldestInstance'],
|
42
|
+
vpc_zone_identifier: vpc_subnets,
|
43
|
+
tags: Tapjoy::AutoscalingBootstrap::Autoscaling::Group.new.generate_tags(tags)
|
44
|
+
}
|
45
|
+
|
46
|
+
if create_elb
|
47
|
+
group_hash.merge!({
|
48
|
+
load_balancer_names: [Tapjoy::AutoscalingBootstrap.elb_name],
|
49
|
+
health_check_type: health_check_type,
|
50
|
+
health_check_grace_period: 300,
|
51
|
+
})
|
52
|
+
end
|
53
|
+
|
54
|
+
self.client.create_auto_scaling_group(**group_hash)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
module Autoscaling
|
5
|
+
# This module includes autoscaling launch config calls to AWS
|
6
|
+
module LaunchConfig
|
7
|
+
class << self
|
8
|
+
def client
|
9
|
+
@client ||= Tapjoy::AutoscalingBootstrap::AWS::Autoscaling.client
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete
|
13
|
+
self.client.delete_launch_configuration(
|
14
|
+
launch_configuration_name: Tapjoy::AutoscalingBootstrap.config_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def create(image_id:, instance_type:, security_groups:, user_data:,
|
18
|
+
keypair:, iam_instance_profile:, classic_link_vpc_id: nil,
|
19
|
+
classic_link_sg_ids: nil, **unused_values)
|
20
|
+
|
21
|
+
self.client.create_launch_configuration(
|
22
|
+
launch_configuration_name: Tapjoy::AutoscalingBootstrap.config_name,
|
23
|
+
image_id: image_id,
|
24
|
+
iam_instance_profile: iam_instance_profile,
|
25
|
+
instance_type: instance_type,
|
26
|
+
security_groups: security_groups,
|
27
|
+
user_data: "#{Tapjoy::AutoscalingBootstrap::Autoscaling::Group.new.encode_user_data(user_data)}",
|
28
|
+
key_name: keypair,
|
29
|
+
classic_link_vpc_id: classic_link_vpc_id,
|
30
|
+
classic_link_vpc_security_groups: classic_link_sg_ids,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def describe(config_name)
|
35
|
+
# config_name is scoped locally, since we can't always be sure
|
36
|
+
# that we are using the default launch_configuration name
|
37
|
+
self.client.describe_launch_configurations(
|
38
|
+
launch_configuration_names:[config_name])[0][0]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
# This class contains AWS methods for ELB
|
5
|
+
module Autoscaling
|
6
|
+
class << self
|
7
|
+
def client
|
8
|
+
@client ||= Aws::AutoScaling::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def put_notification_configuration(sns_base_arn:, **unused_values)
|
12
|
+
self.client.put_notification_configuration(
|
13
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
14
|
+
topic_arn: "#{sns_base_arn}:InstanceTerminated",
|
15
|
+
notification_types: ['autoscaling:EC2_INSTANCE_TERMINATE']
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def put_scaling_policy(policy_name: policy, scaling_adjustment:,
|
20
|
+
cooldown:, **unused_values)
|
21
|
+
|
22
|
+
self.client.put_scaling_policy(policy_name: policy_name,
|
23
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
24
|
+
scaling_adjustment: scaling_adjustment,
|
25
|
+
cooldown: cooldown,
|
26
|
+
adjustment_type: 'ChangeInCapacity'
|
27
|
+
)[0]
|
28
|
+
end
|
29
|
+
|
30
|
+
def describe_policies(policy:)
|
31
|
+
self.client.describe_policies(
|
32
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
33
|
+
policy_names: [policy])
|
34
|
+
end
|
35
|
+
|
36
|
+
def delete_policy(policy:)
|
37
|
+
self.client.delete_policy(
|
38
|
+
auto_scaling_group_name: Tapjoy::AutoscalingBootstrap.scaler_name,
|
39
|
+
policy_name: policy)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
# This class contains AWS methods for ELB
|
5
|
+
module Cloudwatch
|
6
|
+
class << self
|
7
|
+
def client
|
8
|
+
@client ||= Aws::CloudWatch::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def put_metric_alarm(alarm:, comparison_operator:,
|
12
|
+
evaluation_periods:, threshold:, actions:)
|
13
|
+
self.client.put_metric_alarm(alarm_name: alarm,
|
14
|
+
comparison_operator: comparison_operator,
|
15
|
+
evaluation_periods: evaluation_periods,
|
16
|
+
metric_name: 'CPUUtilization',
|
17
|
+
namespace: 'AWS/EC2',
|
18
|
+
period: 300,
|
19
|
+
statistic: 'Average',
|
20
|
+
threshold: threshold,
|
21
|
+
alarm_actions: actions,
|
22
|
+
dimensions: [
|
23
|
+
{
|
24
|
+
name:'AutoScalingGroupName',
|
25
|
+
value: Tapjoy::AutoscalingBootstrap.scaler_name
|
26
|
+
}
|
27
|
+
])
|
28
|
+
end
|
29
|
+
|
30
|
+
def describe_alarm(alarm)
|
31
|
+
self.client.describe_alarms(alarm_names: [alarm])[0]
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete_alarm(alarm)
|
35
|
+
self.client.delete_alarms(alarm_names: [alarm])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
# This class contains AWS methods for ELB
|
5
|
+
module EC2
|
6
|
+
class << self
|
7
|
+
def client
|
8
|
+
@client ||= Aws::EC2::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def describe_security_groups(group)
|
12
|
+
self.client.describe_security_groups(group_names: [group])
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_security_group(group)
|
16
|
+
self.client.create_security_group(group_name: group,
|
17
|
+
description: "Security group for #{Tapjoy::AutoscalingBootstrap.scaler_name}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module AWS
|
4
|
+
# This class contains AWS methods for ELB
|
5
|
+
module ELB
|
6
|
+
class << self
|
7
|
+
def client
|
8
|
+
@client ||= Aws::ElasticLoadBalancing::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
# Creates ELB
|
12
|
+
def create(elb_protocol:, elb_port:, instance_protocol:,
|
13
|
+
instance_port:, zones:, **unused_values)
|
14
|
+
self.client.create_load_balancer(
|
15
|
+
load_balancer_name: Tapjoy::AutoscalingBootstrap.elb_name,
|
16
|
+
listeners: [
|
17
|
+
{ protocol: elb_protocol, load_balancer_port: elb_port,
|
18
|
+
instance_protocol: instance_protocol,
|
19
|
+
instance_port: instance_port
|
20
|
+
}
|
21
|
+
],
|
22
|
+
availability_zones: zones)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Configures health check in AWS
|
26
|
+
def health_check(elb_health_target:, elb_health_interval:,
|
27
|
+
elb_health_timeout:, elb_unhealthy_threshold:,
|
28
|
+
elb_healthy_threshold:, **unused_values)
|
29
|
+
|
30
|
+
self.client.configure_health_check(
|
31
|
+
load_balancer_name: Tapjoy::AutoscalingBootstrap.elb_name,
|
32
|
+
health_check: {
|
33
|
+
target: elb_health_target,
|
34
|
+
interval: elb_health_interval,
|
35
|
+
timeout: elb_health_timeout,
|
36
|
+
unhealthy_threshold: elb_unhealthy_threshold,
|
37
|
+
healthy_threshold: elb_healthy_threshold
|
38
|
+
})
|
39
|
+
end
|
40
|
+
|
41
|
+
# Deletes existing ELB
|
42
|
+
def delete
|
43
|
+
self.client.delete_load_balancer(
|
44
|
+
load_balancer_name: Tapjoy::AutoscalingBootstrap.elb_name)
|
45
|
+
end
|
46
|
+
|
47
|
+
def describe
|
48
|
+
self.client.describe_load_balancers(
|
49
|
+
load_balancer_names: [Tapjoy::AutoscalingBootstrap.elb_name])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module Alerts
|
4
|
+
# Class to handle monitoring alerts
|
5
|
+
class Monitoring
|
6
|
+
# Create monitoring alerts
|
7
|
+
def create(alarm_high_alert:, alarm_low_alert:, notification:)
|
8
|
+
|
9
|
+
high_alert = {
|
10
|
+
alarm: alarm_high_alert,
|
11
|
+
comparison_operator: 'GreaterThanOrEqualToThreshold',
|
12
|
+
evaluation_periods: 1,
|
13
|
+
threshold: 90,
|
14
|
+
actions: [notification]
|
15
|
+
}
|
16
|
+
|
17
|
+
low_alert = {
|
18
|
+
alarm: alarm_low_alert,
|
19
|
+
comparison_operator: 'LessThanOrEqualToThreshold',
|
20
|
+
evaluation_periods: 1,
|
21
|
+
threshold: 35,
|
22
|
+
actions: [notification]
|
23
|
+
}
|
24
|
+
puts 'Clearing out original CloudWatch alarms'
|
25
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.delete_alarm(alarm_high_alert)
|
26
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.delete_alarm(alarm_low_alert)
|
27
|
+
|
28
|
+
puts 'Creating new CloudWatch Alarms'
|
29
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.create_alarm(high_alert)
|
30
|
+
puts "\n"
|
31
|
+
|
32
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.create_alarm(low_alert)
|
33
|
+
puts "\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module Alerts
|
4
|
+
# Class to handle scaling alerts
|
5
|
+
class Scaling
|
6
|
+
# Initialize the class
|
7
|
+
def initialize(config)
|
8
|
+
@policy = Tapjoy::AutoscalingBootstrap.policy
|
9
|
+
|
10
|
+
scale_up, scale_down = prepare(**config)
|
11
|
+
|
12
|
+
create(config[:policy_up], scale_up)
|
13
|
+
create(config[:policy_down], scale_down)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Prepare scaling alerts
|
17
|
+
def prepare(alarm_high_scale:, alarm_low_scale:, policy_up:,
|
18
|
+
policy_down:, scale_up_scaling_adjustment:, scale_up_cooldown:,
|
19
|
+
scale_up_threshold:, scale_down_scaling_adjustment:,
|
20
|
+
scale_down_cooldown:, scale_down_threshold:, **unused_values)
|
21
|
+
|
22
|
+
puts 'Creating autoscale alerts and policies'
|
23
|
+
|
24
|
+
puts 'Clearing out original CloudWatch alarms'
|
25
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.delete_alarm(alarm_high_scale)
|
26
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.delete_alarm(alarm_low_scale)
|
27
|
+
puts "\n"
|
28
|
+
|
29
|
+
puts 'Clearing out original scaling policies'
|
30
|
+
@policy.delete(policy_up)
|
31
|
+
@policy.delete(policy_down)
|
32
|
+
puts "\n"
|
33
|
+
|
34
|
+
puts 'Configuring autoscaling...'
|
35
|
+
scale_up = {
|
36
|
+
scaling_adjustment: scale_up_scaling_adjustment,
|
37
|
+
cooldown: scale_up_cooldown,
|
38
|
+
threshold: scale_up_threshold,
|
39
|
+
alarm: alarm_high_scale,
|
40
|
+
comparison_operator: 'GreaterThanOrEqualToThreshold'
|
41
|
+
}
|
42
|
+
|
43
|
+
scale_down = {
|
44
|
+
scaling_adjustment: scale_down_scaling_adjustment,
|
45
|
+
cooldown: scale_down_cooldown,
|
46
|
+
threshold: scale_down_threshold,
|
47
|
+
alarm: alarm_low_scale,
|
48
|
+
comparison_operator: 'LessThanOrEqualToThreshold'
|
49
|
+
}
|
50
|
+
|
51
|
+
return scale_up, scale_down
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create alerts for autoscaling
|
55
|
+
def create(policy, scale)
|
56
|
+
|
57
|
+
puts "Creating scale policy: #{policy}"
|
58
|
+
scale_policy = @policy.create(policy,
|
59
|
+
**scale)
|
60
|
+
|
61
|
+
scale_alert = {
|
62
|
+
alarm: scale[:alarm],
|
63
|
+
comparison_operator: scale[:comparison_operator],
|
64
|
+
evaluation_periods: 3,
|
65
|
+
threshold: scale[:threshold],
|
66
|
+
actions: [scale_policy]
|
67
|
+
}
|
68
|
+
|
69
|
+
puts "Creating alarms for scale policy: #{scale_policy}"
|
70
|
+
Tapjoy::AutoscalingBootstrap::Cloudwatch.create_alarm(scale_alert)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
# This class handles the comparison of local configs against upstream
|
4
|
+
class Audit
|
5
|
+
def initialize(config)
|
6
|
+
local_config = Hash(**clean_local_hash(config))
|
7
|
+
|
8
|
+
remote_launch_config = Tapjoy::AutoscalingBootstrap::AWS::Autoscaling::LaunchConfig.describe(Tapjoy::AutoscalingBootstrap.config_name).to_h
|
9
|
+
remote_group_config = Tapjoy::AutoscalingBootstrap::AWS::Autoscaling::Group.describe.to_h
|
10
|
+
# Combine launch config and group config into a single hash
|
11
|
+
remote_config = remote_launch_config.merge!(remote_group_config)
|
12
|
+
clean_remote_hash(remote_config)
|
13
|
+
puts "\n\n\n"
|
14
|
+
HashDiff.diff(local_config, remote_config).each do |op, key, value|
|
15
|
+
puts "%s %s %-60s" % [op, key, value]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
# fix key names to match AWS standards
|
21
|
+
def clean_local_hash(config)
|
22
|
+
config[:key_name] = config.delete :keypair
|
23
|
+
config[:launch_configuration_name] = Tapjoy::AutoscalingBootstrap.config_name
|
24
|
+
keys = %w(bootstrap_script chef_server_url clobber clobber_elb
|
25
|
+
create_as_group config_dir)
|
26
|
+
delete_keys(config, keys)
|
27
|
+
|
28
|
+
config
|
29
|
+
end
|
30
|
+
|
31
|
+
# Remove keys that the local config does not support
|
32
|
+
def clean_remote_hash(config)
|
33
|
+
keys = %w(kernel_id instances desired_capacity min_size max_size
|
34
|
+
ramdisk_id)
|
35
|
+
delete_keys(config, keys)
|
36
|
+
config[:tags].each do |tag|
|
37
|
+
delete_keys(tag, %w(resource_id))
|
38
|
+
tag[tag[:key].to_sym] = tag.delete :value
|
39
|
+
delete_keys(tag, %w(resource_type propagate_at_launch key))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Helper method to delete keys
|
44
|
+
def delete_keys(config, keys)
|
45
|
+
keys.each {|key| config.delete key.to_sym}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Tapjoy
|
2
|
+
module AutoscalingBootstrap
|
3
|
+
module Autoscaling
|
4
|
+
# Code specific to Launch Configs
|
5
|
+
class Config
|
6
|
+
|
7
|
+
# Create launch configuration
|
8
|
+
def create(config, aws_env, user_data)
|
9
|
+
|
10
|
+
if exists
|
11
|
+
delete
|
12
|
+
else
|
13
|
+
puts "Launch config #{Tapjoy::AutoscalingBootstrap.config_name} does not exist, continuing..."
|
14
|
+
end
|
15
|
+
|
16
|
+
puts "Creating launch config: #{Tapjoy::AutoscalingBootstrap.config_name}"
|
17
|
+
begin
|
18
|
+
Tapjoy::AutoscalingBootstrap::AWS::Autoscaling::LaunchConfig.create(
|
19
|
+
**config, **aws_env, user_data: user_data)
|
20
|
+
rescue Aws::AutoScaling::Errors::ValidationError => err
|
21
|
+
STDERR.puts "Cannot create launch configuration: #{err}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Check if launch configuration exists
|
26
|
+
def exists
|
27
|
+
!Tapjoy::AutoscalingBootstrap::AWS::Autoscaling::LaunchConfig.describe(
|
28
|
+
Tapjoy::AutoscalingBootstrap.config_name).nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete
|
32
|
+
puts "Deleting launch config #{Tapjoy::AutoscalingBootstrap.config_name}"
|
33
|
+
Tapjoy::AutoscalingBootstrap::AWS::Autoscaling::LaunchConfig.delete
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|