def getTemplate(self): #asgConfigJson = simplejson.loads(simplejson.dumps(self.asgConfig)) asgConfigJson = self.asgConfig if self.elb is not None: self.template.add_resource( AutoScalingGroup( "ELBASG", DesiredCapacity=asgConfigJson['DesiredCapactiy'], MinSize=asgConfigJson['MinSize'], MaxSize=asgConfigJson['MaxSize'], LaunchConfigurationName=self.launchConfigName, HealthCheckType="ELB", HealthCheckGracePeriod=asgConfigJson[ 'HealthCheckGracePeriod'], LoadBalancerNames=[self.elb], AvailabilityZones=[self.availZone], VPCZoneIdentifier=[self.subnet], Tags=[ Tag("Name", Join("-", [self.friendlyName, self.branch]), True) ], UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( MaxBatchSize=asgConfigJson['MaxBatchSize'], MinInstancesInService=asgConfigJson[ 'MinInstancesInService'], PauseTime=asgConfigJson['PauseTime'], WaitOnResourceSignals=asgConfigJson[ 'WaitOnResourceSignals'])))) else: self.template.add_resource( AutoScalingGroup( "NoELBASG", DesiredCapacity=asgConfigJson['DesiredCapactiy'], MinSize=asgConfigJson['MinSize'], MaxSize=asgConfigJson['MaxSize'], LaunchConfigurationName=self.launchConfigName, HealthCheckType="EC2", HealthCheckGracePeriod=asgConfigJson[ 'HealthCheckGracePeriod'], AvailabilityZones=[self.availZone], VPCZoneIdentifier=[self.subnet], Tags=[ Tag("Name", Join("-", [self.friendlyName, self.branch]), True) ], UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( MaxBatchSize=asgConfigJson['MaxBatchSize'], MinInstancesInService=asgConfigJson[ 'MinInstancesInService'], PauseTime=asgConfigJson['PauseTime'], WaitOnResourceSignals=asgConfigJson[ 'WaitOnResourceSignals'])))) return self.template
def create_autoscaling_resource(name, launchConfig): """[ create simple autoscaling resource ] Arguments: name {[String]} -- [ name ] launchConfig {[LaunchConfiguration]} -- [description] Returns: [ troposphere.resource ] -- [ AutoScalingGroup ] """ return AutoScalingGroup( name + "AutoScalingGroup", DesiredCapacity=10, AutoScalingGroupName=name, LaunchConfigurationName=Ref(launchConfig), MinSize=9, MaxSize=10, AvailabilityZones=[Ref(zone1), Ref(zone2)], HealthCheckType="EC2", UpdatePolicy=UpdatePolicy( AutoScalingReplacingUpdate=AutoScalingReplacingUpdate( WillReplace=True, ), AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime='PT5M', MinInstancesInService="1", MaxBatchSize='1', WaitOnResourceSignals=True)), Tags=Tags(Application=Ref('AWS::StackId')))
def add_nat_asg(self): user_data = [resources.get_resource('nat_takeover.sh')] if self.enable_ntp: user_data.append(resources.get_resource('ntp_takeover.sh')) if self.extra_user_data: user_data.append(open(self.extra_user_data).read()) nat_asg_name = "Nat%sASG" % str(self.subnet_index) user_data.extend([ "\n", "cfn-signal -s true", " --resource ", nat_asg_name, " --stack ", { "Ref": "AWS::StackName" }, " --region ", { "Ref": "AWS::Region" } ]) nat_launch_config = self.add_resource( LaunchConfiguration("Nat%sLaunchConfig" % str(self.subnet_index), UserData=Base64(Join('', user_data)), ImageId=FindInMap('RegionMap', Ref('AWS::Region'), 'natAmiId'), KeyName=Ref('ec2Key'), SecurityGroups=[Ref(self.sg)], EbsOptimized=False, IamInstanceProfile=Ref(self.instance_profile), InstanceType=self.instance_type, AssociatePublicIpAddress=True)) # Create the NAT in a public subnet subnet_layer = self._subnets['public'].keys()[0] nat_asg = self.add_resource( AutoScalingGroup( nat_asg_name, DesiredCapacity=1, Tags=[ Tag("Name", Join("-", [ "NAT", self.subnet_index, ]), True), Tag("isNat", "true", True) ], MinSize=1, MaxSize=1, Cooldown="30", LaunchConfigurationName=Ref(nat_launch_config), HealthCheckGracePeriod=30, HealthCheckType="EC2", VPCZoneIdentifier=[ self._subnets['public'][subnet_layer][self.subnet_index] ], CreationPolicy=CreationPolicy( ResourceSignal=ResourceSignal(Count=1, Timeout='PT15M')))) return nat_asg
def test_none(self): group = AutoScalingGroup( "mygroup", MaxSize="1", MinSize="1", ) with self.assertRaises(ValueError): self.assertTrue(group.validate())
def test_instanceid(self): group = AutoScalingGroup( 'mygroup', InstanceId="i-1234", MaxSize="1", MinSize="1", ) self.assertTrue(group.validate())
def test_launchconfigurationname(self): group = AutoScalingGroup( 'mygroup', LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", ) self.assertTrue(group.validate())
def test_instanceid(self): group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], InstanceId="i-1234", MaxSize="1", MinSize="1", ) self.assertTrue(group.validate())
def test_launchconfigurationname(self): group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", ) self.assertTrue(group.validate())
def test_AutoScalingRollingUpdate_all_defaults(self): group = AutoScalingGroup( 'mygroup', AvailabilityZones=['eu-west-1a', 'eu-west-1b'], LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate())) self.assertTrue(group.validate())
def test_exclusive(self): group = AutoScalingGroup( "mygroup", InstanceId="i-1234", LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", ) with self.assertRaises(ValueError): self.assertTrue(group.validate())
def test_AutoScalingRollingUpdate_all_defaults(self): group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate()), ) self.assertIsNone(group.validate())
def test_working(self): group = AutoScalingGroup('mygroup', LaunchConfigurationName="I'm a test", MaxSize="4", MinSize="2", UpdatePolicy=UpdatePolicy( 'AutoScalingRollingUpdate', PauseTime='PT1M5S', MinInstancesInService='2', MaxBatchSize='1', )) self.assertTrue(group.validate())
def test_mininstances(self): group = AutoScalingGroup('mygroup', LaunchConfigurationName="I'm a test", MaxSize="1", MinSize="1", UpdatePolicy=UpdatePolicy( 'AutoScalingRollingUpdate', PauseTime='PT1M5S', MinInstancesInService='1', MaxBatchSize='1', )) with self.assertRaises(ValueError): self.assertTrue(group.validate())
def test_mininstances_maxsize_is_ref(self): paramMaxSize = Parameter("ParamMaxSize", Type="String") group = AutoScalingGroup('mygroup', LaunchConfigurationName="I'm a test", MaxSize=Ref(paramMaxSize), MinSize="2", UpdatePolicy=UpdatePolicy( 'AutoScalingRollingUpdate', PauseTime='PT1M5S', MinInstancesInService='2', MaxBatchSize="1", )) self.assertTrue(group.validate())
def test_size_if(self): group = AutoScalingGroup( 'mygroup', AvailabilityZones=['eu-west-1a', 'eu-west-1b'], LaunchConfigurationName="I'm a test", MaxSize=If("isstage", "1", "5"), MinSize="1", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime='PT5M', MinInstancesInService="1", MaxBatchSize='1', WaitOnResourceSignals=True))) self.assertTrue(group.validate())
def test_AutoScalingRollingUpdate_validation(self): update_policy = UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( MinInstancesInService="2", MaxBatchSize='1')) group = AutoScalingGroup( 'mygroup', AvailabilityZones=['eu-west-1a', 'eu-west-1b'], LaunchConfigurationName="I'm a test", MaxSize="2", MinSize="1", UpdatePolicy=update_policy) with self.assertRaises(ValueError): self.assertTrue(group.validate())
def test_mininstances(self): group = AutoScalingGroup( "mygroup", LaunchConfigurationName="I'm a test", MaxSize=1, MinSize=1, UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime="PT1M5S", MinInstancesInService="1", MaxBatchSize="1")), ) with self.assertRaises(ValueError): group.validate()
def test_mininstances_maxsize_is_ref(self): paramMaxSize = Parameter("ParamMaxSize", Type="String") group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize=Ref(paramMaxSize), MinSize="2", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime="PT1M5S", MinInstancesInService="2", MaxBatchSize="1")), ) self.assertIsNone(group.validate())
def test_AutoScalingRollingUpdate_validation(self): update_policy = UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( MinInstancesInService="2", MaxBatchSize="1")) group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize="2", MinSize="1", UpdatePolicy=update_policy, ) with self.assertRaises(ValueError): group.validate()
def test_mininstances_mininstancesinservice_is_ref(self): paramMinInstancesInService = Parameter("ParamMinInstancesInService", Type="String") group = AutoScalingGroup( 'mygroup', AvailabilityZones=['eu-west-1a', 'eu-west-1b'], LaunchConfigurationName="I'm a test", MaxSize="4", MinSize="2", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime='PT1M5S', MinInstancesInService=Ref(paramMinInstancesInService), MaxBatchSize="2", ))) self.assertTrue(group.validate())
def test_size_if(self): group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize=If("isstage", "1", "5"), MinSize="1", UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime="PT5M", MinInstancesInService="1", MaxBatchSize="1", WaitOnResourceSignals=True, )), ) self.assertIsNone(group.validate())
def define_web_auto_scaling(template, alb_target_group_80, alb_target_group_9090, sg): web_launch_config = LaunchConfiguration( stack_name_strict + "WebLC", UserData=Base64( Join('', [ '#!/bin/bash\n', 'set -x\n', 'exec > >(tee /tmp/user-data.log|logger -t user-data ) 2>&1\n', 'sudo su - deploy -c "echo \\"export RAILS_ENV=' + env + '\\" >> ~/.bashrc"\n', 'sudo su - deploy -c "cd ~/app/current; wget http://taxweb-deploy.s3.amazonaws.com/' + app_name + '/app_update.sh -O app_update.sh >/dev/null 2>&1"\n', 'sudo su - deploy -c "cd ~/app/current && chmod 755 app_update.sh && ./app_update.sh ' + env + ' web ' + app_name + '"\n' ])), ImageId=Ref(base_ami), InstanceType=Ref(instance_type), KeyName="taxweb-AWS-US-West", SecurityGroups=[Ref(sg)]) template.add_resource(web_launch_config) web_autoscaling_group = AutoScalingGroup( stack_name_strict + "WebASG", Tags=[ Tag("Name", stack_name + "-web", True), Tag("Custo", app_name, True), Tag("Env", env, True), Tag("Role", "web", True), ], LaunchConfigurationName=Ref(web_launch_config), MinSize=1, MaxSize=1, DesiredCapacity=1, VPCZoneIdentifier=[Ref(subnet_id1), Ref(subnet_id2)], TargetGroupARNs=[Ref(alb_target_group_80), Ref(alb_target_group_9090)], HealthCheckType="ELB", HealthCheckGracePeriod="300", ) template.add_resource(web_autoscaling_group) return { "launch_config": web_launch_config, "autoscaling_group": web_autoscaling_group }
def test_helperfn_as_updatepolicy(self): update_policy = UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime="PT5M", MinInstancesInService="1", MaxBatchSize="1", WaitOnResourceSignals=True, )) group = AutoScalingGroup( "mygroup", AvailabilityZones=["eu-west-1a", "eu-west-1b"], LaunchConfigurationName="I'm a test", MaxSize=If("isstage", "1", "5"), MinSize="1", UpdatePolicy=If("UseUpdatePolicy", update_policy, Ref("AWS::NoValue")), ) self.assertTrue(group.validate())
def test_helperfn_as_AutoScalingRollingUpdate(self): update_policy = UpdatePolicy(AutoScalingRollingUpdate=If( 'RollingUpdate', AutoScalingRollingUpdate(PauseTime='PT5M', MinInstancesInService="1", MaxBatchSize='1', WaitOnResourceSignals=True), Ref("AWS::NoValue"), ), ) group = AutoScalingGroup( 'mygroup', AvailabilityZones=['eu-west-1a', 'eu-west-1b'], LaunchConfigurationName="I'm a test", MaxSize=If("isstage", "1", "5"), MinSize="1", UpdatePolicy=If("UseUpdatePolicy", update_policy, Ref("AWS::NoValue"))) self.assertTrue(group.validate())
def add_autoscaling_group(self, name, launch_configuration_name, subnets, desired_size=2, min_size=1, max_size=2, health_check_type='EC2', target_group_arns=[]): """ Create Autoscaling Group :param name: Name of the ASG :param launch_configuration_name: Which launch configuration to use to create instances :param subnets: Subnet to spin up instances in :param desired_size: Desired number of instances :param min_size: Minimum number of instances :param max_size: Maximum number of instances :param health_check_type: Health check type :param target_group_arns: ARN of the target group(s), if any """ auto_scaling_group = AutoScalingGroup( name, DesiredCapacity=desired_size, Tags=[{ 'Key': 'Name', 'Value': name, 'PropagateAtLaunch': True }], LaunchConfigurationName=Ref(launch_configuration_name), MinSize=min_size, MaxSize=max_size, VPCZoneIdentifier=subnets, HealthCheckType=health_check_type, HealthCheckGracePeriod=60, TargetGroupARNs=target_group_arns, UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime='PT1H', MinInstancesInService=min_size, MaxBatchSize='1', WaitOnResourceSignals=True))) self.template.add_resource(auto_scaling_group)
def create_autoscale_group(stack, name, launch_con, vpc_zones, elbs=[], target_groups=[]): """Add EC2 AutoScalingGroup Resource.""" return stack.stack.add_resource( AutoScalingGroup( '{0}{1}ASG'.format(stack.env, name.replace('_', '')), LaunchConfigurationName=Ref(launch_con), MinSize="0", MaxSize="5", HealthCheckType="EC2", VPCZoneIdentifier=vpc_zones, TerminationPolicies=['OldestInstance'], LoadBalancerNames=elbs, TargetGroupARNs=target_groups, ))
def add_nat_asg(self): user_data = [resources.get_resource('nat_takeover.sh')] if self.enable_ntp: user_data.append(resources.get_resource('ntp_takeover.sh')) if self.extra_user_data: user_data.append(open(self.extra_user_data).read()) nat_launch_config = self.add_resource( LaunchConfiguration("Nat%sLaunchConfig" % str(self.subnet_index), UserData=Base64(Join('\n', user_data)), ImageId=FindInMap('RegionMap', Ref('AWS::Region'), 'natAmiId'), KeyName=Ref('ec2Key'), SecurityGroups=[Ref(self.sg)], EbsOptimized=False, IamInstanceProfile=Ref(self.instance_profile), InstanceType=self.instance_type, AssociatePublicIpAddress=True)) nat_asg = self.add_resource( AutoScalingGroup("Nat%sASG" % str(self.subnet_index), DesiredCapacity=1, Tags=[ Tag("Name", Join("-", [Ref(self.vpc_id), "NAT"]), True), Tag("isNat", "true", True) ], MinSize=1, MaxSize=1, Cooldown="30", LaunchConfigurationName=Ref(nat_launch_config), HealthCheckGracePeriod=30, HealthCheckType="EC2", VPCZoneIdentifier=[ Ref(self.subnets['public'][self.subnet_index]) ])) return nat_asg
def _auto_scaling_group(self): return AutoScalingGroup( "duy%sAutoscalingGroup" % self.config['env'], DesiredCapacity=self.config['scale_desire'], Tags=[ Tag("Name", "duy-%s" % self.config['env'], True), Tag("Environment", self.config['env'], True), Tag("PropagateAtLaunch", "true", True) ], LaunchConfigurationName=Ref(self.launchConfiguration), MinSize=self.config['scale_min'], MaxSize=self.config['scale_max'], VPCZoneIdentifier=self.config['private_subnet'], LoadBalancerNames=[Ref(self.loadBalancer)], HealthCheckType="EC2", HealthCheckGracePeriod="300", TerminationPolicies=["OldestInstance", "Default"], UpdatePolicy=UpdatePolicy( AutoScalingRollingUpdate=AutoScalingRollingUpdate( PauseTime='PT5M', MinInstancesInService="1", MaxBatchSize='1', WaitOnResourceSignals=True)))
def build_hook(self): if len(self.subnet_cidrs) != len(self.azs): raise ValueError('VPNJumpbox: Wrong number of CIDRs, should be %s' % len(self.azs)) eip = self.add_resource(EIP( "%sEIP" % self.name, Domain="vpc", )) asg_name = '%sAutoscalingGroup' % self.name launch_config = self._get_launch_config(asg_name, eip) subnets = self._add_subnets() asg = self.add_resource(AutoScalingGroup( asg_name, AvailabilityZones=self.azs, LaunchConfigurationName=Ref(launch_config), MaxSize=1, MinSize=1, DesiredCapacity=1, VPCZoneIdentifier=subnets, CreationPolicy=CreationPolicy( ResourceSignal=ResourceSignal( Count=1, Timeout='PT10M' ) ), DependsOn=[])) asg.Tags = [ASGTag('Name', self.name, True)] self.add_output(Output( 'JumpboxEIP', Value=Ref(eip) ))
def add_auto_scaling_group(self, asg): """ Add auto scaling group to stack """ default_security_groups = [ SecurityGroups(GroupId=Ref('IncomingSg')), SecurityGroups(GroupId=ImportValue('{}-cluster:DBBadgeSg'.format(self.cluster.get('name')))), ] for group in self.cluster.get('security_groups', []): default_security_groups.append( SecurityGroups(GroupId=group) ) launch_config = LaunchConfiguration( "ASGLaunchConfig{}".format(sanitize_cfn_resource_name(asg.get('name'))), IamInstanceProfile=self.instance_role, ImageId=self.ami, InstanceType=asg.get('instance_type'), KeyName=self.keypair, SecurityGroups=default_security_groups, BlockDeviceMappings=self.block_devices, UserData=Base64(Sub(self.open_userdata())) ) # launch config self.template.add_resource(launch_config) self.template.add_condition('IsActive', Equals(Ref('Status'), 'active')) auto_scaling_group = AutoScalingGroup( "ASG{}".format(sanitize_cfn_resource_name(asg.get('name'))), VPCZoneIdentifier=self.cluster.get('subnets'), Cooldown=300, DesiredCapacity=asg.get('desired_instances', 1), HealthCheckType='EC2', HealthCheckGracePeriod=60, LaunchConfigurationName=Ref(launch_config), MinSize=If('IsActive', asg.get('min_size', 1), 0), MaxSize=asg.get('max_size', 1) ) self.template.add_resource(auto_scaling_group)