예제 #1
0
        private static async Task DeleteOrphanSnapshots()
        {
            var client = new AmazonEC2Client(RegionEndpoint.APSoutheast2);
            var describeSnapshotRequest = new DescribeSnapshotsRequest();

            describeSnapshotRequest.OwnerIds.Add(ownerId);

            var snapshots = await client.DescribeSnapshotsAsync(describeSnapshotRequest);

            var describeImagesRequest = new DescribeImagesRequest();

            describeImagesRequest.Owners.Add(ownerId);

            var images = await client.DescribeImagesAsync(describeImagesRequest);

            const int numberOfdaysToKeepImage = 30;

            foreach (var snapshot in snapshots.Snapshots.Where(s =>
                                                               !images.Images.Any(i => i.BlockDeviceMappings.Any(d => d.Ebs.SnapshotId == s.SnapshotId)) &&
                                                               DateTime.Today.Subtract(s.StartTime).Days > numberOfdaysToKeepImage))
            {
                Console.WriteLine($"Deleting snapshot {snapshot.Description}...");
                await client.DeleteSnapshotAsync(new DeleteSnapshotRequest(snapshot.SnapshotId));
            }
        }
예제 #2
0
 public async Task <IEnumerable <CloudImage> > GetImages()
 {
     return((await client.DescribeImagesAsync(new DescribeImagesRequest()
     {
         Owners = new List <string>(new string[] { "self" })
     })).Images.Select(m => new CloudImage(m, client)));
 }
        public List <Image> GetAllOwnedPrivateAMIs(ILambdaContext context)
        {
            String accountId        = context.InvokedFunctionArn.Split(':')[4];
            var    ec2Client        = new AmazonEC2Client();
            var    asClient         = new AmazonAutoScalingClient();
            var    getImagesRequest = new DescribeImagesRequest();
            var    getLCRequest     = new DescribeLaunchConfigurationsRequest();

            getLCRequest.MaxRecords = 100;

            getImagesRequest.Filters.Add(new Amazon.EC2.Model.Filter
            {
                Name   = "is-public",
                Values = new List <string>()
                {
                    "false"
                }
            });
            getImagesRequest.Filters.Add(new Amazon.EC2.Model.Filter
            {
                Name   = "owner-id",
                Values = new List <string>()
                {
                    accountId
                }
            });

            var imagesResponse = ec2Client.DescribeImagesAsync(getImagesRequest);

            imagesResponse.Wait();

            return(imagesResponse.Result.Images);
        }
예제 #4
0
        public async Task <IEnumerable <ImageDto> > GetAvailableImagesAsync()
        {
            var request = new DescribeImagesRequest
            {
                // Ignore all images that don't have the tag "maci".
                Filters = { new Filter {
                                Name = "tag-key", Values ={ "maci"                     }
                            } },
            };

            var imageResult = await _client.DescribeImagesAsync(request);

            var images = imageResult.Images.Select(i => new ImageDto
            {
                HostId       = Id,
                Id           = i.ImageId,
                Name         = i.Name,
                Description  = i.Description,
                Capabilities = i.Tags.Single(t => t.Key == "maci").Value.Split(',').Select(c => c.Trim())
            });

            return(images);
        }
예제 #5
0
        public async Task <List <AMImage> > DescribeImages()
        {
            DescribeImagesRequest request = new DescribeImagesRequest();

            request.Owners.Add(_accountId);
            DescribeImagesResponse response = await _ec2Client.DescribeImagesAsync(request);

            List <AMImage> amiImages = new List <AMImage>();

            foreach (var item in response.Images)
            {
                amiImages.Add(new AMImage(item.ImageId, item.Name, item.Description, item.CreationDate, item.Architecture, item.Platform, item.State, item.OwnerId));
            }

            return(amiImages);
        }
예제 #6
0
        private String getImagesAsCsv(ILambdaContext context)
        {
            String accountId        = context.InvokedFunctionArn.Split(':')[4];
            var    ec2Client        = new AmazonEC2Client();
            var    asClient         = new AmazonAutoScalingClient();
            var    getImagesRequest = new DescribeImagesRequest();
            var    getLCRequest     = new DescribeLaunchConfigurationsRequest();

            getLCRequest.MaxRecords = 100;


            getImagesRequest.Filters.Add(new Amazon.EC2.Model.Filter
            {
                Name   = "is-public",
                Values = new List <string>()
                {
                    "false"
                }
            });
            getImagesRequest.Filters.Add(new Amazon.EC2.Model.Filter
            {
                Name   = "owner-id",
                Values = new List <string>()
                {
                    accountId
                }
            });

            var lcResponse     = asClient.DescribeLaunchConfigurationsAsync(getLCRequest);
            var imagesResponse = ec2Client.DescribeImagesAsync(getImagesRequest);

            imagesResponse.Wait();
            lcResponse.Wait();
            imagesResponse.Result.Images.Sort((image1, image2) => - 1 * image1.CreationDate.CompareTo(image2.CreationDate));
            List <LaunchConfiguration> launchConfigIds = lcResponse.Result.LaunchConfigurations;

            var sb = new StringBuilder();

            sb.Append("DateCreated,AMI-Name,AMI-ID,OwnerID,LaunchConfigExists,LaunchConfigName,Description\n");
            imagesResponse.Result.Images.ForEach(i => {
                List <String> lcs = launchConfigIds.FindAll(lc => lc.ImageId.Equals(i.ImageId)).Select(lc => lc.LaunchConfigurationName).ToList();
                bool lcExists     = lcs.Count > 0;
                String sLcs       = lcExists ? String.Join(",", lcs) : String.Empty;
                sb.Append($"{i.CreationDate},{i.Name},{i.ImageId},{i.OwnerId},{lcExists},{sLcs},{i.Description}\n");
            });
            return(sb.ToString());
        }
예제 #7
0
        /// <summary>
        /// Возвращает AMI пренадлежащие текущему аккаунту
        /// </summary>
        /// <param name="endPoint">Регион расположения</param>
        /// <returns></returns>
        public async Task <IEnumerable <Image> > LoadSelfImagesAsync(RegionEndpoint endPoint)
        {
            using (var client = new AmazonEC2Client(endPoint))
            {
                var describeImagesRequest = new DescribeImagesRequest
                {
                    Owners = new List <string>()
                    {
                        "self"
                    }
                };

                //throw new InvalidOperationException();
                var result = await client.DescribeImagesAsync(describeImagesRequest);

                return(result.Images);
            }
        }
예제 #8
0
        private static async Task DeleteAmis()
        {
            var client    = new AmazonEC2Client(RegionEndpoint.APSoutheast2);
            var asgClient = new AmazonAutoScalingClient(RegionEndpoint.APSoutheast2);

            var request = new DescribeImagesRequest();

            request.Owners.Add(ownerId);
            var images = await client.DescribeImagesAsync(request);

            var launchConfigs = await asgClient.DescribeLaunchConfigurationsAsync();

            var dateToKeepAmisFrom = new DateTime(2018, 11, 03);

            foreach (var image in images.Images.Where(x => DateTime.Parse(x.CreationDate) < dateToKeepAmisFrom))
            {
                Console.WriteLine($"Deleting Image: {image.ImageId} - {image.Name}...");
                if (!image.Tags.Any(t => t.Key == "Master"))
                {
                    if (launchConfigs.LaunchConfigurations.Any(x => x.ImageId == image.ImageId))
                    {
                        Console.WriteLine("Skipped belonging to Launch configuration.");
                    }
                    else
                    {
                        await client.DeregisterImageAsync(new DeregisterImageRequest(image.ImageId));

                        var snapshotIds = image.BlockDeviceMappings.Select(x => x.Ebs.SnapshotId);
                        foreach (var snapshotId in snapshotIds)
                        {
                            Console.WriteLine($"Deleting Snapshot {snapshotId}...");
                            await client.DeleteSnapshotAsync(new DeleteSnapshotRequest(snapshotId));
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Skipping because having Tag of Master.");
                }
            }
        }
예제 #9
0
 public async Task <Image> DescribeImageAsync(string name, AMIStatus state = AMIStatus.available, CancellationToken cancellationToken = default(CancellationToken))
 => (await _client.DescribeImagesAsync(new DescribeImagesRequest()
 {
     Filters = new List <Filter>()
     {
         new Filter()
         {
             Name = "name", Values = new List <string>()
             {
                 name
             }
         },
         new Filter()
         {
             Name = "state", Values = new List <string>()
             {
                 state.ToString()
             }
         }
     }
 }, cancellationToken).EnsureSuccessAsync()).Images.SingleOrDefault();
예제 #10
0
        /****************************************** EC2  ******************************************/
        public async Task <List <SA_Ec2Instance> > GetEc2InsatancesList(string region = null)
        {
            var lstRegions = new List <string>();
            var lstImages  = new List <Image>();
            var ret        = new List <SA_Ec2Instance>();

            if (region == null)
            {
                foreach (var objRegion in Regions.GetRegionList())
                {
                    lstRegions.Add(objRegion.Key);
                }
            }
            else
            {
                lstRegions.Add(region);
            }

            foreach (var itemRegion in lstRegions)
            {
                client = new AmazonEC2Client(
                    CredentiaslManager.GetCredential(profile),
                    AwsCommon.GetRetionEndpoint(itemRegion));



                //hello, world
                var request  = new DescribeInstancesRequest();
                var response = await client.DescribeInstancesAsync(request);

                var imageIds   = new HashSet <string>();
                var asgHelper  = new AutoScalingHelper(profile, itemRegion, "green");
                var asgEc2Maps = asgHelper.GetAsgEc2Maps(itemRegion);
                foreach (var reservation in response.Reservations)
                {
                    foreach (var instance in reservation.Instances)
                    {
                        var saInstance = new SA_Ec2Instance()
                        {
                            Name           = instance.Tags.Find(o => o.Key == "Name") == null ? string.Empty : instance.Tags.Find(o => o.Key == "Name").Value,
                            Keyname        = instance.KeyName,
                            InstanceId     = instance.InstanceId,
                            InstanceType   = instance.InstanceType,
                            VpcId          = instance.VpcId,
                            State          = instance.State.Name,
                            PrivateDnsName = instance.PrivateDnsName,
                            ImageId        = instance.ImageId,
                            Zone           = instance.Placement.AvailabilityZone
                        };
                        //imageIds.Add(instance.ImageId);

                        DescribeImagesRequest requestImage = new DescribeImagesRequest();
                        requestImage.ImageIds.Add(instance.ImageId);
                        //imageIds.Add(instance.ImageId);
                        var responseImages = await client.DescribeImagesAsync(requestImage);

                        if (responseImages.Images.Count > 0)
                        {
                            saInstance.OS = responseImages.Images[0].ImageLocation;
                        }

                        var searchedAsgEc2Map = asgEc2Maps.Find(o => o.InstanceId == instance.InstanceId);
                        if (searchedAsgEc2Map != null)
                        {
                            saInstance.AsgName = searchedAsgEc2Map.AutoScalingGroupName;
                        }
                        else
                        {
                            saInstance.AsgName = string.Empty;
                        }
                        ret.Add(saInstance);
                    }
                }

                //Get all Images in EC2 instances
                //DescribeImagesRequest requestImage = new DescribeImagesRequest();
                //requestImage.ImageIds = imageIds.ToList();
                //var responseImages = await client.DescribeImagesAsync(requestImage);
                //lstImages.AddRange(responseImages.Images);
                //foreach (var imageId in imageIds)
                //{
                //    DescribeImageAttributeRequest arq = new DescribeImageAttributeRequest();
                //    arq.ImageId = imageId;
                //    //var arp = client.DescribeImageAttribute(arq);
                //}
            }

            var results = ret.OrderBy(o => o.State).ToList();

            return(results);
        }
예제 #11
0
        public String DeregisterReportedAMIs(AMICleanupInput input, ILambdaContext context)
        {
            var ec2Client = new AmazonEC2Client();
            var s3client  = new AmazonS3Client();

            String[] lines = new AWSCommon().GetS3ContextAsText(input.BucketName, input.Key).Split("\n".ToCharArray());
            int      index = 0;

            foreach (String line in lines)
            {
                if (input.StartIndex > index)
                {
                    if (index == input.StartIndex - 1)
                    {
                        context.Logger.LogLine($"Skipped processing up to index #{index}");
                    }
                    index++;
                    continue;
                }

                if (context.RemainingTime.Seconds < 10)
                {
                    context.Logger.LogLine($"Less than 10 seconds for lambda execution, starting function recursively..");
                    var lambdaClient = new Amazon.Lambda.AmazonLambdaClient();
                    input.StartIndex = index;
                    lambdaClient.InvokeAsync(new Amazon.Lambda.Model.InvokeRequest()
                    {
                        InvocationType = Amazon.Lambda.InvocationType.Event,
                        FunctionName   = context.FunctionName,
                        Payload        = JsonConvert.SerializeObject(input)
                    }).Wait();
                    return("Started recursively with index=" + index);
                }

                index = index + 1;

                String[] cells = line.Split(',');
                if (cells.Length >= 3)
                {
                    String amiId = cells[2];
                    if (amiId.StartsWith("ami-"))
                    {
                        try {
                            var describeResponse = ec2Client.DescribeImagesAsync(new DescribeImagesRequest()
                            {
                                ImageIds = new List <String>()
                                {
                                    amiId
                                }
                            });
                            describeResponse.Wait();

                            context.Logger.LogLine($"De-registering AMI {amiId}");
                            ec2Client.DeregisterImageAsync(new DeregisterImageRequest()
                            {
                                ImageId = amiId
                            }).Wait();

                            describeResponse.Result.Images[0].BlockDeviceMappings.ForEach(mapping => {
                                if (mapping.Ebs != null && mapping.Ebs.SnapshotId != null)
                                {
                                    context.Logger.LogLine($"Deleting snapshot {mapping.Ebs.SnapshotId} for ami {amiId}");
                                    ec2Client.DeleteSnapshotAsync(new DeleteSnapshotRequest()
                                    {
                                        SnapshotId = mapping.Ebs.SnapshotId
                                    }).Wait();
                                }
                            });
                        } catch (Exception ex) {
                            context.Logger.LogLine($"Failed to delete ami {amiId} with following error:");
                            context.Logger.LogLine(ex.ToString());
                        }
                    }
                    else
                    {
                        context.Logger.LogLine($"Skppingg non-ami id : {amiId}");
                    }
                }
            }


            return("OK");
        }