internal void LaunchServer(ref bool actionSucceeded, ref string actionMessage) { try { string keyPairPath = string.Empty; LaunchRequest.KeyPairName = $"KeyPair-{Guid.NewGuid().ToString()}"; while (!CreateKeyPair(LaunchRequest.KeyPairName, ref keyPairPath)) { LaunchRequest.KeyPairName = Guid.NewGuid().ToString(); } DescribeVpcsRequest vpcRequest = new DescribeVpcsRequest(); DescribeVpcsResponse vpcResponse = Ec2Client.DescribeVpcsAsync(vpcRequest).GetAwaiter().GetResult(); Vpc defaultVPC = vpcResponse.Vpcs.Find(x => x.IsDefault); //get the default vpc List <Filter> subnetFilter = new List <Filter>() { new Filter() { Name = "availability-zone", Values = new List <string>() { LaunchRequest.AvailabilityZone } }, new Filter() { Name = "vpc-id", Values = new List <string>() { defaultVPC.VpcId } } }; DescribeSubnetsRequest subnetRequest = new DescribeSubnetsRequest(); subnetRequest.Filters = subnetFilter; DescribeSubnetsResponse subnetResponse = Ec2Client.DescribeSubnetsAsync(subnetRequest).GetAwaiter().GetResult(); Subnet defaultSubnet = subnetResponse.Subnets.FirstOrDefault(); Filter SGFilter = new Filter { Name = "vpc-id", Values = new List <string>() { defaultVPC.VpcId } }; DescribeSecurityGroupsRequest SGrequest = new DescribeSecurityGroupsRequest(); SGrequest.Filters.Add(SGFilter); DescribeSecurityGroupsResponse SGresponse = Ec2Client.DescribeSecurityGroupsAsync(SGrequest).GetAwaiter().GetResult(); SecurityGroup defaultSG = SGresponse.SecurityGroups.FirstOrDefault(); InstanceNetworkInterfaceSpecification defaultENI = new InstanceNetworkInterfaceSpecification() { DeviceIndex = 0, SubnetId = defaultSubnet.SubnetId, Groups = new List <string>() { defaultSG.GroupId }, AssociatePublicIpAddress = true }; List <InstanceNetworkInterfaceSpecification> enis = new List <InstanceNetworkInterfaceSpecification>() { defaultENI }; EbsBlockDevice ebsBlockDevice = new EbsBlockDevice { VolumeSize = 10, VolumeType = GetActualStorageType(LaunchRequest.StorageType) }; BlockDeviceMapping blockDeviceMapping = new BlockDeviceMapping { DeviceName = "/dev/xvda" }; blockDeviceMapping.Ebs = ebsBlockDevice; var launchRequest = new RunInstancesRequest() { ImageId = GetImageID(LaunchRequest.AMIType), InstanceType = GetActualInstanceType(LaunchRequest.InstanceType), MinCount = LaunchRequest.NumOfInstances, MaxCount = LaunchRequest.NumOfInstances, KeyName = LaunchRequest.KeyPairName, Placement = new Placement(LaunchRequest.AvailabilityZone), NetworkInterfaces = enis, BlockDeviceMappings = new List <BlockDeviceMapping>() { blockDeviceMapping } }; RunInstancesResponse launchResponse = Ec2Client.RunInstancesAsync(launchRequest).GetAwaiter().GetResult(); List <String> instanceIds = new List <string>(); foreach (Instance instance in launchResponse.Reservation.Instances) { Console.WriteLine(instance.InstanceId); instanceIds.Add(instance.InstanceId); } actionSucceeded = true; actionMessage = $"The instance(s) are being launched. Please check the AWS Console to verify. {keyPairPath}"; } catch (Exception ex) { context.Logger.LogLine($"ServerOperationsHelper::LaunchServer {ex.Message}"); context.Logger.LogLine($"ServerOperationsHelper::LaunchServer {ex.StackTrace}"); actionSucceeded = false; actionMessage = $"Could not launch the server . Please contact your administrator."; } }
public async Task <IHost[]> LaunchAsync(LaunchHostRequest launchRequest, ISecurityContext context) { Validate.NotNull(launchRequest, nameof(launchRequest)); Validate.NotNull(context, nameof(context)); var zoneId = LocationId.Create(launchRequest.Location.Id); if (zoneId.ZoneNumber == 0) { throw new Exception("Must launch within in availability zone. Was a region:" + launchRequest.Location.Name); } var cluster = launchRequest.Cluster; var zone = launchRequest.Location; var template = launchRequest.Template; var region = Locations.Get(zoneId.WithZoneNumber(0)); var image = await imageService.GetAsync(template.ImageId);; var machineType = AwsInstanceType.Get(template.MachineTypeId); var request = new RunInstancesRequest { ClientToken = Guid.NewGuid().ToString(), InstanceType = machineType.Name, ImageId = image.ResourceId, MinCount = launchRequest.LaunchCount, MaxCount = launchRequest.LaunchCount, Placement = new Placement(availabilityZone: zone.Name), TagSpecifications = new[] { new TagSpecification( resourceType: "instance", tags: new[] { new Amazon.Ec2.Tag("envId", cluster.EnvironmentId.ToString()) } ) } }; var startupScript = launchRequest.StartupScript ?? template.StartupScript; if (startupScript != null) { request.UserData = Convert.ToBase64String(Encoding.UTF8.GetBytes(startupScript)); } #region AWS Specific Properties foreach (var property in template.Properties) { switch (property.Key) { case HostTemplateProperties.IamRole: // NOTE: This requires the PassRole permission // https://aws.amazon.com/blogs/security/granting-permission-to-launch-ec2-instances-with-iam-roles-passrole-permission/ request.IamInstanceProfile = new IamInstanceProfileSpecification(property.Value); break; case HostTemplateProperties.KernelId: request.KernelId = property.Value; break; case HostTemplateProperties.SecurityGroupIds: request.SecurityGroupIds = property.Value.ToArrayOf <string>(); break; case HostTemplateProperties.EbsOptimized: request.EbsOptimized = (bool)property.Value; break; case HostTemplateProperties.Monitoring: request.Monitoring = new RunInstancesMonitoringEnabled((bool)property.Value); break; case HostTemplateProperties.Volume: var volSpec = property.Value.As <AwsVolumeSpecification>(); // TODO: Device Name request.BlockDeviceMappings = new[] { new BlockDeviceMapping(BlockDeviceNames.Root, new EbsBlockDevice( volumeType: volSpec.Type, volumeSize: (int)volSpec.Size )) }; break; case HostTemplateProperties.KeyName: request.KeyName = property.Value; break; } } #endregion var runInstancesResponse = await ec2.RunInstancesAsync(request);; var hosts = new IHost[runInstancesResponse.Instances.Length]; for (var i = 0; i < hosts.Length; i++) { var registerRequest = await GetRegistrationAsync( instance : runInstancesResponse.Instances[i], cluster : cluster, image : image, machineType : machineType, location : zone ); hosts[i] = await hostService.RegisterAsync(registerRequest);; } #region Logging await eventLog.CreateAsync(new Event( action : "launch", resource : "hosts", userId : context.UserId) );; #endregion return(hosts); }