//this quite an expensive operation (3M of data retrieved) - so I added caching support public static List<Image> getImagesList(this API_AmazonEC2 amazonEC2, AmazonEC2Client ec2Client) { if (amazonEC2.CachedImageListRequest.fileExists()) return amazonEC2.CachedImageListRequest.load<List<Amazon.EC2.Model.Image>>(); var describeImagesRequest = new DescribeImagesRequest(); "Retrieving ImagesList from Amazon..".info(); var images = ec2Client.DescribeImages(describeImagesRequest) .DescribeImagesResult.Image; if (images.isNull() || images.size()==0) { "in getImagesList, there was an error retrieving list (are we online?)".error(); } else { amazonEC2.CachedImageListRequest = images.save(); "The Image List was saved to : {0}".info(amazonEC2.CachedImageListRequest); } return images; }
public override void Execute() { AmazonEC2Client client = new AmazonEC2Client(AWSAuthConnection.OUR_ACCESS_KEY_ID, AWSAuthConnection.OUR_SECRET_ACCESS_KEY); DescribeInstancesRequest request = new DescribeInstancesRequest(); DescribeInstancesResponse response = client.DescribeInstances(request); Dictionary<string, List<RunningInstance>> instances = new Dictionary<string, List<RunningInstance>>(); foreach (Reservation r in response.DescribeInstancesResult.Reservation) foreach (RunningInstance i in r.RunningInstance) { if (!instances.ContainsKey(i.ImageId)) instances[i.ImageId] = new List<RunningInstance>(); instances[i.ImageId].Add(i); } List<string> allImageIds = new List<string>(); foreach (string imageId in instances.Keys) allImageIds.Add(imageId); DescribeImagesRequest imageReq = new DescribeImagesRequest(); imageReq.ImageId = allImageIds; DescribeImagesResponse imageResp = client.DescribeImages(imageReq); Dictionary<string, Image> imageDescriptions = new Dictionary<string, Image>(); foreach (Image image in imageResp.DescribeImagesResult.Image) imageDescriptions.Add(image.ImageId, image); foreach (string imageId in instances.Keys) { if (imageDescriptions.ContainsKey(imageId)) Console.WriteLine("--- {0} {1} ({2} {3})", imageId, imageDescriptions[imageId].ImageLocation, imageDescriptions[imageId].Platform, imageDescriptions[imageId].Architecture); else Console.WriteLine("--- {0} (AMI not found)", imageId); foreach (RunningInstance i in instances[imageId]) { DateTime launchTime = DateTime.Parse(i.LaunchTime); Console.Write("{0}\t{1}\t{2}\t{3}\t{4}", launchTime, i.InstanceType, i.InstanceState.Name, i.InstanceId, i.StateTransitionReason); if (ips) Console.Write("\t{0}\t{1}", i.PublicDnsName, i.PrivateDnsName); Console.WriteLine(); } Console.WriteLine(); } }