コード例 #1
0
        public async override Task DoAction(string RoleARN)
        {
            await base.DoAction(RoleARN);

            var logger = LogManager.GetCurrentClassLogger();

            Parallel.ForEach(SharedLibrary.Utilities.GetRegions(), (region) =>
            {
                logger.Debug($"Checking EC2 instances in region {region.DisplayName }");
                var creds        = SharedLibrary.Utilities.AssumeRole(RoleARN, region);
                var sessionCreds = new SessionAWSCredentials(creds.AccessKeyId, creds.SecretAccessKey, creds.SessionToken);

                Amazon.EC2.AmazonEC2Client client = new Amazon.EC2.AmazonEC2Client(sessionCreds, region);

                string nextToken = null;


                do
                {
                    var describeInstancesResult = client.DescribeInstancesAsync(new DescribeInstancesRequest {
                        Filters = new List <Filter> {
                            new Filter("instance-state-name", new List <string> {
                                "running", "pending", "stopped", "stopping"
                            })
                        }, NextToken = nextToken
                    }).Result;

                    nextToken = describeInstancesResult.NextToken;

                    var instances = describeInstancesResult.Reservations.SelectMany(r => r.Instances).ToList();

                    if (instances.Count > 0)
                    {
                        logger.Debug($"Terminating {instances.Count} EC2 instance(s).");
                        var terminateResult = client.TerminateInstancesAsync(new Amazon.EC2.Model.TerminateInstancesRequest {
                            InstanceIds = instances.Select(a => a.InstanceId).ToList()
                        }).Result;

                        if (terminateResult.HttpStatusCode == System.Net.HttpStatusCode.OK)
                        {
                            logger.Debug($"Successfully terminated {terminateResult.TerminatingInstances.Count} EC2 instance(s).");
                        }
                    }
                } while (nextToken != null);
            });
        }
コード例 #2
0
        public async Task <IEnumerable <Ec2InstanceImage> > GetDeprecatedInstanceIds(Amazon.RegionEndpoint currentRegion)
        {
            Amazon.EC2.AmazonEC2Client ec2Client = new Amazon.EC2.AmazonEC2Client(AwsSdkVending.AccessKeyId, AwsSdkVending.SecretKey, currentRegion);


            string NextToken = null;

            List <Ec2InstanceImage> lstInstances = new List <Ec2InstanceImage>();

            List <string> lstImageIds = new List <string>();

            List <Image> lstAffectedImages = new List <Image>();

            do
            {
                var describeRequest = new DescribeInstancesRequest();
                describeRequest.Filters = new List <Filter>();
                describeRequest.Filters.Add(new Filter("platform", new List <string> {
                    "windows"
                }));
                describeRequest.Filters.Add(new Filter("instance-state-name", new List <string> {
                    "pending", "running", "shutting-down", "stopping", "stopped"
                }));
                describeRequest.NextToken = NextToken;

                var describeInstancesResult = await ec2Client.DescribeInstancesAsync(describeRequest);

                NextToken = describeRequest.NextToken;


                foreach (var instance in describeInstancesResult.Reservations.SelectMany(r => r.Instances))
                {
                    if (!lstImageIds.Contains(instance.ImageId))
                    {
                        lstImageIds.Add(instance.ImageId);
                    }
                }
            } while (NextToken != null);

            if (lstImageIds.Count > 0)
            {
                var describeImagesRequest = new DescribeImagesRequest {
                    ImageIds = lstImageIds
                };
                describeImagesRequest.Filters = new List <Filter>();
                describeImagesRequest.Filters.Add(new Filter {
                    Name = "is-public", Values = new List <string> {
                        "true"
                    }
                });
                var describeImagesResult = await ec2Client.DescribeImagesAsync(describeImagesRequest);

                foreach (var currentImage in describeImagesResult.Images)
                {
                    if (string.IsNullOrEmpty(currentImage.Description))
                    {
                        continue;
                    }

                    if (DeprecatedDescriptions.Any(d => Regex.IsMatch(currentImage.Description, d, RegexOptions.IgnoreCase)))
                    {
                        lstAffectedImages.Add(currentImage);
                        Console.WriteLine($"{currentImage.ImageId} - {currentImage.Description} is facing deprecation");
                    }
                }


                Console.WriteLine($"{lstAffectedImages.Count} images are marked for deprecation in {currentRegion.DisplayName}");
            }

            if (lstAffectedImages.Count > 0)
            {
                foreach (var image in lstAffectedImages)
                {
                    do
                    {
                        var describeInstancesRequest = new DescribeInstancesRequest();

                        describeInstancesRequest.Filters = new List <Filter>();
                        describeInstancesRequest.Filters.Add(new Filter("image-id", new List <string> {
                            image.ImageId
                        }));
                        describeInstancesRequest.Filters.Add(new Filter("instance-state-name", new List <string> {
                            "pending", "running", "shutting-down", "stopping", "stopped"
                        }));
                        describeInstancesRequest.NextToken = NextToken;

                        var describeInstancesResult = await ec2Client.DescribeInstancesAsync(describeInstancesRequest);

                        NextToken = describeInstancesRequest.NextToken;


                        foreach (var instance in describeInstancesResult.Reservations.SelectMany(r => r.Instances))
                        {
                            lstInstances.Add(new Ec2InstanceImage
                            {
                                Region           = currentRegion.DisplayName,
                                ImageDescription = image.Description,
                                ImageId          = image.ImageId,
                                ImageName        = image.Name,
                                InstanceId       = instance.InstanceId
                            });

                            Console.WriteLine($"Instance {instance.InstanceId} in {currentRegion.DisplayName} ({image.Name}) is marked for deprecation and needs to be snapshotted.");
                        }
                    } while (NextToken != null);
                }
            }

            return(lstInstances);
        }