44 "context"
55 "errors"
66 "sort"
7+ "strconv"
78 "time"
89
910 "github.com/aws/aws-sdk-go/aws"
@@ -23,6 +24,8 @@ func ResourceMachineCreate(ctx context.Context, d *schema.ResourceData, m interf
2324 ami := d .Get ("image" ).(string )
2425 keyPublic := d .Get ("ssh_public" ).(string )
2526 securityGroup := d .Get ("aws_security_group" ).(string )
27+ spot := d .Get ("spot" ).(bool )
28+ spotPrice := d .Get ("spotPrice" ).(float64 )
2629 if ami == "" {
2730 ami = "iterative-cml"
2831 }
@@ -139,35 +142,71 @@ func ResourceMachineCreate(ctx context.Context, d *schema.ResourceData, m interf
139142 return errors .New ("no subnets found" )
140143 }
141144
142- //launch instance
143- runResult , err := svc .RunInstancesWithContext (ctx , & ec2.RunInstancesInput {
144- UserData : aws .String (userData ),
145- ImageId : aws .String (instanceAmi ),
146- KeyName : aws .String (pairName ),
147- InstanceType : aws .String (instanceType ),
148- MinCount : aws .Int64 (1 ),
149- MaxCount : aws .Int64 (1 ),
150- SecurityGroupIds : []* string {aws .String (sgID )},
151- SubnetId : aws .String (* subDesc .Subnets [0 ].SubnetId ),
152- BlockDeviceMappings : []* ec2.BlockDeviceMapping {
153- {
154- //VirtualName: aws.String("Root"),
155- DeviceName : aws .String ("/dev/sda1" ),
156- Ebs : & ec2.EbsBlockDevice {
157- DeleteOnTermination : aws .Bool (true ),
158- Encrypted : aws .Bool (false ),
159- //Iops: aws.Int64(0),
160- VolumeSize : aws .Int64 (int64 (hddSize )),
161- VolumeType : aws .String ("gp2" ),
162- },
145+ blockDeviceMappings := []* ec2.BlockDeviceMapping {
146+ {
147+ DeviceName : aws .String ("/dev/sda1" ),
148+ Ebs : & ec2.EbsBlockDevice {
149+ DeleteOnTermination : aws .Bool (true ),
150+ Encrypted : aws .Bool (false ),
151+ VolumeSize : aws .Int64 (int64 (hddSize )),
152+ VolumeType : aws .String ("gp2" ),
163153 },
164154 },
165- })
166- if err != nil {
167- return err
168155 }
169156
170- instanceID := * runResult .Instances [0 ].InstanceId
157+ //launch instance
158+ var instanceID string
159+ if spot {
160+ spotInstanceRequest , err := svc .RequestSpotInstances (& ec2.RequestSpotInstancesInput {
161+ LaunchSpecification : & ec2.RequestSpotLaunchSpecification {
162+ UserData : aws .String (userData ),
163+ ImageId : aws .String (instanceAmi ),
164+ KeyName : aws .String (pairName ),
165+ InstanceType : aws .String (instanceType ),
166+ SecurityGroupIds : []* string {aws .String (sgID )},
167+ SubnetId : aws .String (* subDesc .Subnets [0 ].SubnetId ),
168+ BlockDeviceMappings : blockDeviceMappings ,
169+ },
170+ InstanceCount : aws .Int64 (1 ),
171+ SpotPrice : aws .String (strconv .FormatFloat (spotPrice , 'f' , 5 , 64 )),
172+ })
173+ if err != nil {
174+ return err
175+ }
176+
177+ spotInstanceRequestID := * spotInstanceRequest .SpotInstanceRequests [0 ].SpotInstanceRequestId
178+ err = svc .WaitUntilSpotInstanceRequestFulfilled (& ec2.DescribeSpotInstanceRequestsInput {
179+ SpotInstanceRequestIds : []* string {aws .String (spotInstanceRequestID )},
180+ })
181+ if err != nil {
182+ return err
183+ }
184+ resolvedSpotInstance , err := svc .DescribeSpotInstanceRequests (& ec2.DescribeSpotInstanceRequestsInput {
185+ SpotInstanceRequestIds : []* string {aws .String (spotInstanceRequestID )},
186+ })
187+ if err != nil {
188+ return err
189+ }
190+
191+ instanceID = * resolvedSpotInstance .SpotInstanceRequests [0 ].InstanceId
192+ } else {
193+ runResult , err := svc .RunInstancesWithContext (ctx , & ec2.RunInstancesInput {
194+ UserData : aws .String (userData ),
195+ ImageId : aws .String (instanceAmi ),
196+ KeyName : aws .String (pairName ),
197+ InstanceType : aws .String (instanceType ),
198+ MinCount : aws .Int64 (1 ),
199+ MaxCount : aws .Int64 (1 ),
200+ SecurityGroupIds : []* string {aws .String (sgID )},
201+ SubnetId : aws .String (* subDesc .Subnets [0 ].SubnetId ),
202+ BlockDeviceMappings : blockDeviceMappings ,
203+ })
204+ if err != nil {
205+ return err
206+ }
207+
208+ instanceID = * runResult .Instances [0 ].InstanceId
209+ }
171210
172211 // Add name to the created instance
173212 _ , err = svc .CreateTags (& ec2.CreateTagsInput {
0 commit comments