| 15 | namespace ec2spot |
| 16 | { |
| 17 | public class Function |
| 18 | { |
| 19 | private static AmazonEC2Client ec2Client; |
| 20 | |
| 21 | static Function() { |
| 22 | AWSSDKHandler.RegisterXRayForAllServices(); |
| 23 | ec2Client = new AmazonEC2Client(); |
| 24 | } |
| 25 | |
| 26 | public async Task<string> FunctionHandler(Dictionary<string, string> input, ILambdaContext context) |
| 27 | { |
| 28 | // More AMI IDs: aws.amazon.com/amazon-linux-2/release-notes/ |
| 29 | // us-east-2 HVM EBS-Backed 64-bit Amazon Linux 2 |
| 30 | string ami = "ami-09d9edae5eb90d556"; |
| 31 | string sg = "default"; |
| 32 | // docs.aws.amazon.com/sdkfornet/v3/apidocs/items/EC2/TInstanceType.html |
| 33 | InstanceType type = InstanceType.T3aNano; |
| 34 | string price = "0.003"; |
| 35 | int count = 1; |
| 36 | var requestSpotInstances = await RequestSpotInstance(ami, sg, type, price, count); |
| 37 | var spotRequestId = requestSpotInstances.SpotInstanceRequests[0].SpotInstanceRequestId; |
| 38 | Console.WriteLine(spotRequestId); |
| 39 | |
| 40 | string instanceId; |
| 41 | while (true) |
| 42 | { |
| 43 | SpotInstanceRequest spotRequest = await GetSpotRequest(spotRequestId); |
| 44 | Console.WriteLine(spotRequest.State); |
| 45 | if (spotRequest.State == SpotInstanceState.Active) { |
| 46 | instanceId = spotRequest.InstanceId; |
| 47 | break; |
| 48 | } |
| 49 | } |
| 50 | var cancelRequest = CancelSpotRequest(spotRequestId); |
| 51 | var terminateRequest = TerminateSpotInstance(instanceId); |
| 52 | |
| 53 | await Task.WhenAll(cancelRequest, terminateRequest); |
| 54 | |
| 55 | Console.WriteLine("Complete"); |
| 56 | return spotRequestId; |
| 57 | } |
| 58 | |
| 59 | public async Task<RequestSpotInstancesResponse> RequestSpotInstance( |
| 60 | string amiId, |
| 61 | string securityGroupName, |
| 62 | InstanceType instanceType, |
| 63 | string spotPrice, |
| 64 | int instanceCount) |
| 65 | { |
| 66 | var request = new RequestSpotInstancesRequest(); |
| 67 | |
| 68 | // https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotLaunchSpecification.html |
| 69 | var launchSpecification = new LaunchSpecification(); |
| 70 | launchSpecification.ImageId = amiId; |
| 71 | launchSpecification.InstanceType = instanceType; |
| 72 | launchSpecification.SecurityGroups.Add(securityGroupName); |
| 73 | |
| 74 | request.SpotPrice = spotPrice; |
nothing calls this directly
no outgoing calls
no test coverage detected