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)); } }
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); }
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); }
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); }
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()); }
/// <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); } }
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."); } } }
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();
/****************************************** 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); }
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"); }