public override AmazonWebServiceResponse Unmarshall(XmlUnmarshallerContext context) { DescribeAutoScalingGroupsResponse response = new DescribeAutoScalingGroupsResponse(); context.Read(); int targetDepth = context.CurrentDepth; while (context.ReadAtDepth(targetDepth)) { if (context.IsStartElement) { if (context.TestExpression("DescribeAutoScalingGroupsResult", 2)) { UnmarshallResult(context, response); continue; } if (context.TestExpression("ResponseMetadata", 2)) { response.ResponseMetadata = ResponseMetadataUnmarshaller.Instance.Unmarshall(context); } } } return(response); }
private static void UnmarshallResult(XmlUnmarshallerContext context, DescribeAutoScalingGroupsResponse response) { int originalDepth = context.CurrentDepth; int targetDepth = originalDepth + 1; if (context.IsStartOfDocument) { targetDepth += 2; } while (context.ReadAtDepth(originalDepth)) { if (context.IsStartElement || context.IsAttribute) { if (context.TestExpression("AutoScalingGroups/member", targetDepth)) { var unmarshaller = AutoScalingGroupUnmarshaller.Instance; var item = unmarshaller.Unmarshall(context); response.AutoScalingGroups.Add(item); continue; } if (context.TestExpression("NextToken", targetDepth)) { var unmarshaller = StringUnmarshaller.Instance; response.NextToken = unmarshaller.Unmarshall(context); continue; } } } return; }
public async Task GetResourcesAsync_MultiplePages_AllFetchedAndReturned() { // arrange var firstPage = new DescribeAutoScalingGroupsResponse { AutoScalingGroups = new List <AutoScalingGroup> { new AutoScalingGroup { AutoScalingGroupName = "Asg1" } } }; var secondPage = new DescribeAutoScalingGroupsResponse { AutoScalingGroups = new List <AutoScalingGroup> { new AutoScalingGroup { AutoScalingGroupName = "Asg2" } } }; var client = CreateAutoScalingClientStub(firstPage, secondPage); // act var sut = new AutoScalingGroupSource(client); var result = await sut.GetResourceNamesAsync(); // assert Assert.That(result.Count, Is.EqualTo(2)); Assert.That(result.First(), Is.EqualTo(firstPage.AutoScalingGroups.Single().AutoScalingGroupName)); Assert.That(result.Skip(1).First(), Is.EqualTo(secondPage.AutoScalingGroups.Single().AutoScalingGroupName)); }
/// <summary> /// <para> Returns a full description of each Auto Scaling group in the given list. This includes all Amazon EC2 instances that are members of /// the group. If a list of names is not provided, the service returns the full details of all Auto Scaling groups. </para> <para> This action /// supports pagination by returning a token if there are more pages to retrieve. To get the next page, call this action again with the returned /// token as the NextToken parameter. </para> /// </summary> /// /// <param name="describeAutoScalingGroupsRequest">Container for the necessary parameters to execute the DescribeAutoScalingGroups service /// method on AmazonAutoScaling.</param> /// /// <returns>The response from the DescribeAutoScalingGroups service method, as returned by AmazonAutoScaling.</returns> /// /// <exception cref="InvalidNextTokenException"/> public DescribeAutoScalingGroupsResponse DescribeAutoScalingGroups(DescribeAutoScalingGroupsRequest describeAutoScalingGroupsRequest) { IRequest <DescribeAutoScalingGroupsRequest> request = new DescribeAutoScalingGroupsRequestMarshaller().Marshall(describeAutoScalingGroupsRequest); DescribeAutoScalingGroupsResponse response = Invoke <DescribeAutoScalingGroupsRequest, DescribeAutoScalingGroupsResponse> (request, this.signer, DescribeAutoScalingGroupsResponseUnmarshaller.GetInstance()); return(response); }
public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems) { AmazonAutoScalingConfig config = new AmazonAutoScalingConfig(); config.RegionEndpoint = region; ConfigureClient(config); AmazonAutoScalingClient client = new AmazonAutoScalingClient(creds, config); DescribeAutoScalingGroupsResponse resp = new DescribeAutoScalingGroupsResponse(); do { DescribeAutoScalingGroupsRequest req = new DescribeAutoScalingGroupsRequest { NextToken = resp.NextToken , MaxRecords = maxItems }; resp = client.DescribeAutoScalingGroups(req); CheckError(resp.HttpStatusCode, "200"); foreach (var obj in resp.AutoScalingGroups) { AddObject(obj); } }while (!string.IsNullOrEmpty(resp.NextToken)); }
public async Task GetResouceAsync_ReturnsCorrectResource() { // arrange var group = new AutoScalingGroup { AutoScalingGroupName = "ASG Name" }; var firstPage = new DescribeAutoScalingGroupsResponse { AutoScalingGroups = new List <AutoScalingGroup> { group } }; var client = CreateAutoScalingClientStub(firstPage); // act var sut = new AutoScalingGroupSource(client); var result = await sut.GetResourceAsync(group.AutoScalingGroupName); // assert Assert.That(result, Is.EqualTo(group)); }
public async Task GetResourcesAsync_EmptyResult_EmptyListReturned() { // arrange var firstPage = new DescribeAutoScalingGroupsResponse { AutoScalingGroups = new List <AutoScalingGroup>() }; var client = CreateAutoScalingClientStub(firstPage); // act var sut = new AutoScalingGroupSource(client); var result = await sut.GetResourceNamesAsync(); // assert Assert.That(result.Count, Is.EqualTo(0)); }
public override AmazonWebServiceResponse Unmarshall(XmlUnmarshallerContext context) { DescribeAutoScalingGroupsResponse response = new DescribeAutoScalingGroupsResponse(); while (context.Read()) { if (context.IsStartElement) { if (context.TestExpression("DescribeAutoScalingGroupsResult", 2)) { response.DescribeAutoScalingGroupsResult = DescribeAutoScalingGroupsResultUnmarshaller.GetInstance().Unmarshall(context); continue; } if (context.TestExpression("ResponseMetadata", 2)) { response.ResponseMetadata = ResponseMetadataUnmarshaller.GetInstance().Unmarshall(context); } } } return(response); }
private static void UnmarshallResult(XmlUnmarshallerContext context, DescribeAutoScalingGroupsResponse response) { int originalDepth = context.CurrentDepth; int targetDepth = originalDepth + 1; if (context.IsStartOfDocument) { targetDepth += 2; } while (context.Read()) { if (context.IsStartElement || context.IsAttribute) { if (context.TestExpression("AutoScalingGroups/member", targetDepth)) { response.AutoScalingGroups.Add(AutoScalingGroupUnmarshaller.GetInstance().Unmarshall(context)); continue; } if (context.TestExpression("NextToken", targetDepth)) { response.NextToken = StringUnmarshaller.GetInstance().Unmarshall(context); continue; } } else if (context.IsEndElement && context.CurrentDepth < originalDepth) { return; } } return; }
internal static void WriteAsgs(DateTime captureTime, string accountId, RegionEndpoint regionEndPoint) { var asc = new AmazonAutoScalingClient(regionEndPoint); DescribeAutoScalingGroupsResponse asgResponse = asc.DescribeAutoScalingGroups(); DescribeAutoScalingInstancesResponse asgInstanceResponse = asc.DescribeAutoScalingInstances(); var db = RedisManager.GetRedisDatabase(); foreach (var asGroup in asgResponse.AutoScalingGroups) { //to do: may not be required. //RedisManager.AddSetWithExpiry(string.Format("{0}-asgs", dataKey), string.Format("asg-{0}", asGroup.AutoScalingGroupName), db); var asgJson = JsonConvert.SerializeObject(asGroup); //RedisManager.AddWithExpiry(string.Format("{0}-asg-{1}", dataKey, asGroup.AutoScalingGroupName), asgJson, db); var newDataKey = Common.GetDataKey(captureTime, accountId, regionEndPoint.SystemName); var entityKey = string.Format("{0}-{1}-{2}", newDataKey, "asg", asGroup.AutoScalingGroupName); Common.UpdateTopology(captureTime, accountId, regionEndPoint.SystemName, "asg", asGroup.AutoScalingGroupName, asgJson, "UPDATE"); //code to add asg name to the instance details var latestDataKey = Common.GetDataKey("latest", accountId, regionEndPoint.SystemName); var latestEntitySetKey = string.Format("{0}-{1}set", latestDataKey, "ins"); foreach (var instance in asGroup.Instances) { //load instance data from redis var latestInstanceKey = RedisManager.GetSetMember(latestEntitySetKey, instance.InstanceId, db); var instanceJson = db.StringGet(latestInstanceKey.ToString()); if (instanceJson.HasValue) { var dataInstance = JsonConvert.DeserializeObject <Data.Instance>(instanceJson); //add elb name to instance dataInstance.AsgKeyName = entityKey; //add the instance data with asg name back to redis instanceJson = JsonConvert.SerializeObject(dataInstance); RedisManager.AddWithExpiry(latestInstanceKey, instanceJson, db); } } } }
public static void InvokeDescribeAutoScalingGroups() { NameValueCollection appConfig = ConfigurationManager.AppSettings; // Print the number of Auto Scaling triggers. IAmazonAutoScaling autoscaling = AWSClientFactory.CreateAmazonAutoScalingClient(RegionEndpoint.USWest2); try { DescribeAutoScalingGroupsResponse asResponse = autoscaling.DescribeAutoScalingGroups(new DescribeAutoScalingGroupsRequest()); int numAutoScalingGroups = 0; if (asResponse.AutoScalingGroups != null) { numAutoScalingGroups = asResponse.AutoScalingGroups.Count; } Console.WriteLine("You have " + numAutoScalingGroups + " Auto Scaling group(s)."); } catch (AmazonAutoScalingException ex) { if (ex.ErrorCode.Equals("OptInRequired")) { Console.WriteLine("You are not signed for Amazon EC2."); Console.WriteLine("You can sign up at http://aws.amazon.com/ec2."); } else { Console.WriteLine("Caught Exception: " + ex.Message); Console.WriteLine("Response Status Code: " + ex.StatusCode); Console.WriteLine("Error Code: " + ex.ErrorCode); Console.WriteLine("Error Type: " + ex.ErrorType); Console.WriteLine("Request ID: " + ex.RequestId); } } Console.WriteLine(); }
public virtual void failover() { try { // Modify the autoscaling group to remove the AZ affected which is the AZ passed in the input // Find the autoscaling group that this is deployed into // Note: This changes the asynchronous call to a synchronous one DescribeAutoScalingGroupsResponse autoScalingGroupsResponse = AUTO_SCALING_CLIENT.DescribeAutoScalingGroupsAsync().GetAwaiter().GetResult(); if (autoScalingGroupsResponse != null && autoScalingGroupsResponse.AutoScalingGroups.Count > 0) { // Note: This assumes an Auto Scaling group exists; no error checking for readability AutoScalingGroup autoScalingGroup = autoScalingGroupsResponse.AutoScalingGroups[0]; string autoScalingGroupName = autoScalingGroup.AutoScalingGroupName; // Find all subnets in the availability zone passed in the input DescribeSubnetsResponse subnetsResult = EC2_CLIENT.DescribeSubnetsAsync(new DescribeSubnetsRequest() { Filters = new List <Amazon.EC2.Model.Filter> { new Amazon.EC2.Model.Filter { Name = "vpc-id", Values = new List <string> { vpcId } } } }).GetAwaiter().GetResult(); IList <string> desiredSubnetsForASG = new List <string>(); foreach (Amazon.EC2.Model.Subnet subnet in subnetsResult.Subnets) { if (!string.Equals(subnet.AvailabilityZone, azId, StringComparison.OrdinalIgnoreCase)) { desiredSubnetsForASG.Add(subnet.SubnetId); } } List <string> desiredSubnets = new List <String>(autoScalingGroup.VPCZoneIdentifier.Split(new[] { ',' }, StringSplitOptions.None)); var tempList = new List <String>(desiredSubnets); foreach (var subnet in desiredSubnets) { if (!desiredSubnetsForASG.Contains(subnet)) { tempList.Remove(subnet); } } desiredSubnets = tempList; Console.WriteLine("Updating the auto scaling group " + autoScalingGroupName + " to remove the subnet in the AZ"); // Note: This turns the asynchronous call into a synchronous one UpdateAutoScalingGroupResponse updateAutoScalingGroupResponse = AUTO_SCALING_CLIENT.UpdateAutoScalingGroupAsync(new UpdateAutoScalingGroupRequest { AutoScalingGroupName = autoScalingGroupName, VPCZoneIdentifier = string.Join(",", desiredSubnets) }).GetAwaiter().GetResult(); } // Find all subnets in the availability zone passed in the input // Note: This turns the asynchronous call into a synchronous one DescribeSubnetsResponse describeSubnetsResult = EC2_CLIENT.DescribeSubnetsAsync(new DescribeSubnetsRequest { Filters = new List <Amazon.EC2.Model.Filter> { new Amazon.EC2.Model.Filter { Name = "vpc-id", Values = new List <string> { vpcId } }, new Amazon.EC2.Model.Filter { Name = "availabilityZone", Values = new List <string> { azId } } } }).GetAwaiter().GetResult(); IList <string> desiredSubnetsForAddingNewNacl = new List <string>(); foreach (Amazon.EC2.Model.Subnet subnet in describeSubnetsResult.Subnets) { desiredSubnetsForAddingNewNacl.Add(subnet.SubnetId); } //Find all the network acl associations matching the subnets identified above // Note: This turns the asynchronous call into a synchronous one DescribeNetworkAclsResponse describeNetworkAclsResult = EC2_CLIENT.DescribeNetworkAclsAsync(new DescribeNetworkAclsRequest() { Filters = new List <Amazon.EC2.Model.Filter> { new Amazon.EC2.Model.Filter { Name = "association.subnet-id", Values = (List <string>)desiredSubnetsForAddingNewNacl } } }).GetAwaiter().GetResult(); IList <NetworkAclAssociation> desiredAclAssociations = new List <NetworkAclAssociation>(); // Note: This assumes a Network ACL is present for readability IList <NetworkAclAssociation> networkAclsAssociatedWithSubnet = describeNetworkAclsResult.NetworkAcls[0].Associations; foreach (string subnetId in desiredSubnetsForAddingNewNacl) { foreach (NetworkAclAssociation networkAcl in networkAclsAssociatedWithSubnet) { if (string.Equals(networkAcl.SubnetId, subnetId, StringComparison.OrdinalIgnoreCase)) { desiredAclAssociations.Add(networkAcl); } } } //create new network acl association with both ingress and egress denying to all the traffic CreateNetworkAclRequest createNetworkAclRequest = new CreateNetworkAclRequest(); createNetworkAclRequest.VpcId = vpcId; // Note: This turns the asynchronous call into a synchronous one CreateNetworkAclResponse createNetworkAclResponse = EC2_CLIENT.CreateNetworkAclAsync(createNetworkAclRequest).GetAwaiter().GetResult(); string networkAclId = createNetworkAclResponse.NetworkAcl.NetworkAclId; createNetworkAclEntry(networkAclId, 100, "0.0.0.0/0", true, "-1", createPortRange(0, 65535), RuleAction.Deny); createNetworkAclEntry(networkAclId, 101, "0.0.0.0/0", false, "-1", createPortRange(0, 65535), RuleAction.Deny); // replace all the network acl associations identified for the above subnets with the new network // acl association which will deny all traffic for those subnets in that AZ Console.WriteLine("Creating new network ACL associations"); replaceNetworkAclAssociations(desiredAclAssociations, networkAclId); //fail over rds which is in the same AZ // Note: This turns the asynchronous call into a synchronous one DescribeDBInstancesResponse describeDBInstancesResult = RDS_CLIENT.DescribeDBInstancesAsync().GetAwaiter().GetResult(); IList <DBInstance> dbInstances = describeDBInstancesResult.DBInstances; string dbInstancedId = null; foreach (DBInstance dbInstance in dbInstances) { if (string.Equals(dbInstance.DBSubnetGroup.VpcId, vpcId, StringComparison.OrdinalIgnoreCase) && (string.Equals(dbInstance.AvailabilityZone, azId, StringComparison.OrdinalIgnoreCase)) && dbInstance.MultiAZ && dbInstance.StatusInfos.Count == 0) { dbInstancedId = dbInstance.DBInstanceIdentifier; } } // we want to fail over rds if rds is present in the same az where it is affected if (!string.IsNullOrEmpty(dbInstancedId)) { RebootDBInstanceRequest rebootDBInstanceRequest = new RebootDBInstanceRequest(); rebootDBInstanceRequest.DBInstanceIdentifier = dbInstancedId; rebootDBInstanceRequest.ForceFailover = true; Console.WriteLine("Rebooting dbInstanceId to secondary AZ " + dbInstancedId); // Note: This turns the asynchronous call into a synchronous one RDS_CLIENT.RebootDBInstanceAsync(rebootDBInstanceRequest).GetAwaiter().GetResult(); } } catch (Exception exception) { Console.WriteLine("Unkown exception occured " + exception.Message); } }
public virtual async Task Failover() { try { Console.WriteLine($"Simulating AZ failure for {azName}"); // Find all subnets in the availability zone passed in the input DescribeSubnetsResponse subnetsInSpecifiedAZandVpc = await ec2Client.DescribeSubnetsAsync(new DescribeSubnetsRequest() { Filters = new List <Amazon.EC2.Model.Filter> { new Amazon.EC2.Model.Filter { Name = "vpc-id", Values = { vpcId } }, new Amazon.EC2.Model.Filter { Name = "availability-zone", Values = { azName } } } }); List <string> subnetIdsInSpecifiedAZ = subnetsInSpecifiedAZandVpc.Subnets.Select(x => x.SubnetId).ToList(); // Modify the autoscaling group to remove the AZ affected which is the AZ passed in the input // Find the autoscaling group that this is deployed into DescribeAutoScalingGroupsResponse autoScalingGroupsResponse = await asClient.DescribeAutoScalingGroupsAsync(); if (autoScalingGroupsResponse != null && autoScalingGroupsResponse.AutoScalingGroups.Count > 0) { // Note: This assumes an Auto Scaling group exists; no error checking for readability AutoScalingGroup autoScalingGroup = autoScalingGroupsResponse.AutoScalingGroups[0]; Console.WriteLine($"Updating the auto scaling group {autoScalingGroup.AutoScalingGroupName} to remove the subnet in {azName}"); UpdateAutoScalingGroupResponse updateAutoScalingGroupResponse = await asClient.UpdateAutoScalingGroupAsync(new UpdateAutoScalingGroupRequest { AutoScalingGroupName = autoScalingGroup.AutoScalingGroupName, VPCZoneIdentifier = String.Join(",", autoScalingGroup.VPCZoneIdentifier.Split(',').Where(x => !subnetIdsInSpecifiedAZ.Contains(x))) }); } Console.WriteLine("Creating new network ACL associations"); await BlockSubnetsInAZ(vpcId, subnetIdsInSpecifiedAZ); Console.WriteLine("Failing over database"); //fail over rds which is in the same AZ DescribeDBInstancesResponse describeDBInstancesResult = await rdsClient.DescribeDBInstancesAsync(); string dbInstancedId = describeDBInstancesResult.DBInstances.Where(x => String.Equals(x.DBSubnetGroup.VpcId, vpcId, StringComparison.OrdinalIgnoreCase) && String.Equals(x.AvailabilityZone, azName, StringComparison.OrdinalIgnoreCase) && x.MultiAZ && !x.StatusInfos.Any())?.Select(x => x.DBInstanceIdentifier).FirstOrDefault(); // we want to fail over rds if rds is present in the same az where it is affected if (!String.IsNullOrEmpty(dbInstancedId)) { Console.WriteLine("Rebooting dbInstanceId to secondary AZ " + dbInstancedId); var response = await rdsClient.RebootDBInstanceAsync(new RebootDBInstanceRequest() { DBInstanceIdentifier = dbInstancedId, ForceFailover = true }); } else { Console.WriteLine($"Didn't find DB in the same AZ as {azName}"); } Console.Write("Done"); } catch (Exception exception) { Console.WriteLine("Unknown exception occurred " + exception.Message); } }
public static void Configure() { //Amazon Credentials string accessKey = ConfigurationManager.AppSettings["AWSAccessKeyId"]; string secretKey = ConfigurationManager.AppSettings["AWSSecretKey"]; string launchConfigurationName = "ScheduledServicesLaunchConfiguration"; string autoScalingGroupName = "ScheduledServiceASG"; string scaleOutPolicyName = "ScheduledServicesScaleOutSQSPolicy"; string scaleInPolicyName = "ScheduledServicesScaleInSQSPolicy"; string scaleOutARN = ""; string scaleInARN = ""; string queueName = "ScheduledServicesSQS"; string queueURL = ""; string amiID = "AMI_ID"; string instanceType = "INSTANCE_TYPE"; AmazonAutoScalingClient autoScaleClient = new AmazonAutoScalingClient(accessKey, secretKey, RegionEndpoint.USWest2); AmazonSQSClient sqsClient = new AmazonSQSClient(accessKey, secretKey, RegionEndpoint.USWest2); Console.WriteLine("¡¡¡CONFIGURATION INITIALIZED!!!"); Console.WriteLine(""); Console.WriteLine("--------- SQS ---------"); Console.WriteLine(""); Console.WriteLine("Creating the simple queue service item"); Console.WriteLine(""); //Get or create the sqs instance CreateQueueRequest createQueueRequest = new CreateQueueRequest(queueName); CreateQueueResponse createQueueResponse = sqsClient.CreateQueue(createQueueRequest); queueURL = createQueueResponse.QueueUrl; Console.WriteLine("Created the simple queue service item with name: " + queueName + " and url: " + queueURL); Console.WriteLine(""); Console.WriteLine("--------- EC2 ---------"); Console.WriteLine(""); //If not exists any launch configuration with this name, creates DescribeLaunchConfigurationsRequest describeLaunchConfigurationsRequest = new DescribeLaunchConfigurationsRequest(); describeLaunchConfigurationsRequest.LaunchConfigurationNames = new List <string>() { launchConfigurationName }; DescribeLaunchConfigurationsResponse describeLaunchConfigurationsResponse = autoScaleClient.DescribeLaunchConfigurations(describeLaunchConfigurationsRequest); Console.WriteLine("Creating the launch configuration"); Console.WriteLine(""); if (describeLaunchConfigurationsResponse.LaunchConfigurations.Count == 0) { //Create Launch Configuration Request CreateLaunchConfigurationRequest launchConfigurationRequest = new CreateLaunchConfigurationRequest(); launchConfigurationRequest.LaunchConfigurationName = launchConfigurationName; launchConfigurationRequest.ImageId = amiID; launchConfigurationRequest.InstanceType = instanceType; //Create Launch Configuration Response CreateLaunchConfigurationResponse launchConfigurationResponse = autoScaleClient.CreateLaunchConfiguration(launchConfigurationRequest); Console.WriteLine("Created the launch configuration with name: " + launchConfigurationName); Console.WriteLine(""); } else { Console.WriteLine("Founded the launch configuration with name: " + launchConfigurationName); Console.WriteLine(""); } Console.WriteLine("Creating the autoscaling group"); Console.WriteLine(""); DescribeAutoScalingGroupsRequest describeAutoScalingGroupsRequest = new DescribeAutoScalingGroupsRequest(); describeAutoScalingGroupsRequest.AutoScalingGroupNames = new List <string>() { autoScalingGroupName }; DescribeAutoScalingGroupsResponse describeAutoScalingGroupsResponse = autoScaleClient.DescribeAutoScalingGroups(describeAutoScalingGroupsRequest); if (describeAutoScalingGroupsResponse.AutoScalingGroups.Count == 0) { //Create Auto Scaling Group Request CreateAutoScalingGroupRequest autoScalingGroupRequest = new CreateAutoScalingGroupRequest(); autoScalingGroupRequest.AutoScalingGroupName = autoScalingGroupName; autoScalingGroupRequest.MinSize = 1; autoScalingGroupRequest.MaxSize = 3; autoScalingGroupRequest.DesiredCapacity = 1; autoScalingGroupRequest.AvailabilityZones = new List <string>() { "us-west-2a", "us-west-2b", "us-west-2c" }; autoScalingGroupRequest.LaunchConfigurationName = launchConfigurationName; //Create Auto Scaling Group Response autoScaleClient.CreateAutoScalingGroup(autoScalingGroupRequest); Console.WriteLine("Created the autoscaling group with name: " + autoScalingGroupName); Console.WriteLine(""); } else { Console.WriteLine("Founded the autoscaling group with name: " + autoScalingGroupName); Console.WriteLine(""); } Console.WriteLine("Creating the scale out policy"); Console.WriteLine(""); //Policies //Creating scaling out policy for the SQS PutScalingPolicyRequest scalingOutPolicyRequest = new PutScalingPolicyRequest(); scalingOutPolicyRequest.PolicyName = scaleOutPolicyName; scalingOutPolicyRequest.AutoScalingGroupName = autoScalingGroupName; scalingOutPolicyRequest.ScalingAdjustment = -1; scalingOutPolicyRequest.AdjustmentType = "ChangeInCapacity"; PutScalingPolicyResponse scalingOutPolicyResponse = autoScaleClient.PutScalingPolicy(scalingOutPolicyRequest); scaleOutARN = scalingOutPolicyResponse.PolicyARN; Console.WriteLine("Created the scale out policy with arn: " + scaleOutARN); Console.WriteLine(""); Console.WriteLine("Creating the scale in policy"); Console.WriteLine(""); //Creating scaling in policy for the SQS PutScalingPolicyRequest scalingInPolicyRequest = new PutScalingPolicyRequest(); scalingInPolicyRequest.PolicyName = scaleInPolicyName; scalingInPolicyRequest.AutoScalingGroupName = autoScalingGroupName; scalingInPolicyRequest.ScalingAdjustment = 1; scalingInPolicyRequest.AdjustmentType = "ChangeInCapacity"; PutScalingPolicyResponse scalingInPolicyResponse = autoScaleClient.PutScalingPolicy(scalingInPolicyRequest); scaleInARN = scalingInPolicyResponse.PolicyARN; Console.WriteLine("Created the scale in policy with arn: " + scaleInARN); Console.WriteLine(""); AmazonCloudWatchClient cloudWatchClient = new AmazonCloudWatchClient(accessKey, secretKey, RegionEndpoint.USWest2); Console.WriteLine("--------- CLOUD WATCH ---------"); Console.WriteLine(""); Console.WriteLine("Creating the scale in policy"); Console.WriteLine(""); //Scale In PutMetricAlarmRequest metricAlarmScaleInRequest = new PutMetricAlarmRequest(); metricAlarmScaleInRequest.AlarmName = "ScheduledServicesScaleInMetric"; metricAlarmScaleInRequest.MetricName = "ApproximateNumberOfMessagesVisible"; metricAlarmScaleInRequest.Namespace = "AWS/SQS"; metricAlarmScaleInRequest.Period = 300; metricAlarmScaleInRequest.Threshold = 3; metricAlarmScaleInRequest.ComparisonOperator = ComparisonOperator.GreaterThanOrEqualToThreshold; metricAlarmScaleInRequest.Statistic = new Statistic("Average"); Dimension dimensionScaleIn = new Dimension(); dimensionScaleIn.Name = "QueueName"; dimensionScaleIn.Value = queueName; metricAlarmScaleInRequest.Dimensions.Add(dimensionScaleIn); metricAlarmScaleInRequest.EvaluationPeriods = 2; metricAlarmScaleInRequest.AlarmActions.Add(scaleInARN); cloudWatchClient.PutMetricAlarm(metricAlarmScaleInRequest); Console.WriteLine("Created the scale in policy with name: ScheduledServicesScaleInMetric"); Console.WriteLine(""); Console.WriteLine("Creating the scale out policy"); Console.WriteLine(""); //Scale Out PutMetricAlarmRequest metricAlarmScaleOutRequest = new PutMetricAlarmRequest(); metricAlarmScaleOutRequest.AlarmName = "ScheduledServicesScaleOutMetric"; metricAlarmScaleOutRequest.MetricName = "ApproximateNumberOfMessagesVisible"; metricAlarmScaleOutRequest.Namespace = "AWS/SQS"; metricAlarmScaleOutRequest.Period = 300; metricAlarmScaleOutRequest.Threshold = 3; metricAlarmScaleOutRequest.ComparisonOperator = ComparisonOperator.LessThanThreshold; metricAlarmScaleOutRequest.Statistic = new Statistic("Average"); Dimension dimensionScaleOut = new Dimension(); dimensionScaleOut.Name = "QueueName"; dimensionScaleOut.Value = queueName; metricAlarmScaleOutRequest.Dimensions.Add(dimensionScaleOut); metricAlarmScaleOutRequest.EvaluationPeriods = 2; metricAlarmScaleOutRequest.AlarmActions.Add(scaleOutARN); cloudWatchClient.PutMetricAlarm(metricAlarmScaleOutRequest); Console.WriteLine("Created the scale out policy with name: ScheduledServicesScaleOutMetric"); Console.WriteLine(""); Console.WriteLine("¡¡¡CONFIGURATION FINISHED!!!"); }
private static AutoScalingGroup GetAutoScalingGroupByTagDescriptionValue(DescribeAutoScalingGroupsResponse reponse, string tagValue) => reponse.AutoScalingGroups.FirstOrDefault(scalingGroup => scalingGroup.Tags.Any(tagDescription => tagDescription.Value.Equals(tagValue)));