Skip to content

Commit 5552dee

Browse files
Merge pull request #184 from axeal/add-ec2-metadata-options-on-initial-instance-creation
Add MetadataOptions on initial create
2 parents f1cb5f6 + 815449d commit 5552dee

1 file changed

Lines changed: 49 additions & 35 deletions

File tree

drivers/amazonec2/amazonec2.go

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -689,35 +689,49 @@ func (d *Driver) innerCreate() error {
689689

690690
var instance *ec2.Instance
691691
if d.RequestSpotInstance {
692-
req := ec2.RequestSpotInstancesInput{
693-
LaunchSpecification: &ec2.RequestSpotLaunchSpecification{
694-
ImageId: &d.AMI,
695-
Placement: &ec2.SpotPlacement{
696-
AvailabilityZone: &regionZone,
697-
},
698-
KeyName: &d.KeyName,
699-
InstanceType: &d.InstanceType,
700-
NetworkInterfaces: netSpecs,
701-
Monitoring: &ec2.RunInstancesMonitoringEnabled{Enabled: aws.Bool(d.Monitoring)},
702-
IamInstanceProfile: &ec2.IamInstanceProfileSpecification{
703-
Name: &d.IamInstanceProfile,
692+
req := ec2.RunInstancesInput{
693+
ImageId: &d.AMI,
694+
MinCount: aws.Int64(1),
695+
MaxCount: aws.Int64(1),
696+
Placement: &ec2.Placement{
697+
AvailabilityZone: &regionZone,
698+
},
699+
KeyName: &d.KeyName,
700+
InstanceType: &d.InstanceType,
701+
NetworkInterfaces: netSpecs,
702+
Monitoring: &ec2.RunInstancesMonitoringEnabled{Enabled: aws.Bool(d.Monitoring)},
703+
IamInstanceProfile: &ec2.IamInstanceProfileSpecification{
704+
Name: &d.IamInstanceProfile,
705+
},
706+
EbsOptimized: &d.UseEbsOptimizedInstance,
707+
BlockDeviceMappings: bdmList,
708+
UserData: &userdata,
709+
MetadataOptions: &ec2.InstanceMetadataOptionsRequest{},
710+
InstanceMarketOptions: &ec2.InstanceMarketOptionsRequest{
711+
MarketType: aws.String(ec2.MarketTypeSpot),
712+
SpotOptions: &ec2.SpotMarketOptions{
713+
MaxPrice: &d.SpotPrice,
714+
SpotInstanceType: aws.String(ec2.SpotInstanceTypeOneTime),
704715
},
705-
EbsOptimized: &d.UseEbsOptimizedInstance,
706-
BlockDeviceMappings: bdmList,
707-
UserData: &userdata,
708716
},
709-
InstanceCount: aws.Int64(1),
710-
SpotPrice: &d.SpotPrice,
711717
}
712-
if d.BlockDurationMinutes != 0 {
713-
req.BlockDurationMinutes = &d.BlockDurationMinutes
718+
719+
if d.HttpEndpoint != "" {
720+
req.MetadataOptions.HttpEndpoint = aws.String(d.HttpEndpoint)
721+
}
722+
723+
if d.HttpTokens != "" {
724+
req.MetadataOptions.HttpTokens = aws.String(d.HttpTokens)
714725
}
715726

716-
spotInstanceRequest, err := d.getClient().RequestSpotInstances(&req)
727+
if d.BlockDurationMinutes != 0 {
728+
req.InstanceMarketOptions.SpotOptions.BlockDurationMinutes = &d.BlockDurationMinutes
729+
}
730+
res, err := d.getClient().RunInstances(&req)
717731
if err != nil {
718732
return fmt.Errorf("Error request spot instance: %s", err)
719733
}
720-
d.spotInstanceRequestId = *spotInstanceRequest.SpotInstanceRequests[0].SpotInstanceRequestId
734+
d.spotInstanceRequestId = *res.Instances[0].SpotInstanceRequestId
721735

722736
log.Info("Waiting for spot instance...")
723737
for i := 0; i < 3; i++ {
@@ -777,7 +791,7 @@ func (d *Driver) innerCreate() error {
777791
ec2VolumeResource, // EBS volume
778792
ec2NetworkInterfaceResource,
779793
})
780-
inst, err := d.getClient().RunInstances(&ec2.RunInstancesInput{
794+
req := ec2.RunInstancesInput{
781795
ImageId: &d.AMI,
782796
MinCount: aws.Int64(1),
783797
MaxCount: aws.Int64(1),
@@ -794,13 +808,24 @@ func (d *Driver) innerCreate() error {
794808
EbsOptimized: &d.UseEbsOptimizedInstance,
795809
BlockDeviceMappings: bdmList,
796810
UserData: &userdata,
811+
MetadataOptions: &ec2.InstanceMetadataOptionsRequest{},
797812
TagSpecifications: resourceTags,
798-
})
813+
}
814+
815+
if d.HttpEndpoint != "" {
816+
req.MetadataOptions.HttpEndpoint = aws.String(d.HttpEndpoint)
817+
}
818+
819+
if d.HttpTokens != "" {
820+
req.MetadataOptions.HttpTokens = aws.String(d.HttpTokens)
821+
}
822+
823+
res, err := d.getClient().RunInstances(&req)
799824

800825
if err != nil {
801826
return fmt.Errorf("Error launching instance: %s", err)
802827
}
803-
instance = inst.Instances[0]
828+
instance = res.Instances[0]
804829
}
805830

806831
d.InstanceId = *instance.InstanceId
@@ -830,17 +855,6 @@ func (d *Driver) innerCreate() error {
830855
}
831856
}
832857

833-
if d.HttpEndpoint != "" || d.HttpTokens != "" {
834-
_, err := d.getClient().ModifyInstanceMetadataOptions(&ec2.ModifyInstanceMetadataOptionsInput{
835-
InstanceId: aws.String(d.InstanceId),
836-
HttpEndpoint: aws.String(d.HttpEndpoint),
837-
HttpTokens: aws.String(d.HttpTokens),
838-
})
839-
if err != nil {
840-
return fmt.Errorf("Error modifying instance metadata options for instance: %s", err)
841-
}
842-
}
843-
844858
log.Debugf("created instance ID %s, IP address %s, Private IP address %s",
845859
d.InstanceId,
846860
d.IPAddress,

0 commit comments

Comments
 (0)