4
4
"context"
5
5
"errors"
6
6
"sort"
7
+ "strconv"
7
8
"time"
8
9
9
10
"github.com/aws/aws-sdk-go/aws"
@@ -23,6 +24,8 @@ func ResourceMachineCreate(ctx context.Context, d *schema.ResourceData, m interf
23
24
ami := d .Get ("image" ).(string )
24
25
keyPublic := d .Get ("ssh_public" ).(string )
25
26
securityGroup := d .Get ("aws_security_group" ).(string )
27
+ spot := d .Get ("spot" ).(bool )
28
+ spotPrice := d .Get ("spotPrice" ).(float64 )
26
29
if ami == "" {
27
30
ami = "iterative-cml"
28
31
}
@@ -139,35 +142,71 @@ func ResourceMachineCreate(ctx context.Context, d *schema.ResourceData, m interf
139
142
return errors .New ("no subnets found" )
140
143
}
141
144
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" ),
163
153
},
164
154
},
165
- })
166
- if err != nil {
167
- return err
168
155
}
169
156
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
+ }
171
210
172
211
// Add name to the created instance
173
212
_ , err = svc .CreateTags (& ec2.CreateTagsInput {
0 commit comments