func getRunInstanceInput()

in pkg/ec2helper/ec2helper.go [987:1059]


func getRunInstanceInput(simpleConfig *config.SimpleInfo, detailedConfig *config.DetailedInfo) *ec2.RunInstancesInput {
	input := &ec2.RunInstancesInput{
		MaxCount: aws.Int64(1),
		MinCount: aws.Int64(1),
	}

	// Add launch template if present
	if simpleConfig.LaunchTemplateId != "" {
		input.LaunchTemplate = &ec2.LaunchTemplateSpecification{
			LaunchTemplateId: aws.String(simpleConfig.LaunchTemplateId),
			Version:          aws.String(simpleConfig.LaunchTemplateVersion),
		}
	}

	//Override settings if applicable
	if simpleConfig.ImageId != "" {
		input.ImageId = aws.String(simpleConfig.ImageId)
	}
	if simpleConfig.InstanceType != "" {
		input.InstanceType = aws.String(simpleConfig.InstanceType)
	}
	if simpleConfig.SubnetId != "" {
		input.SubnetId = aws.String(simpleConfig.SubnetId)
	}
	if simpleConfig.SecurityGroupIds != nil && len(simpleConfig.SecurityGroupIds) > 0 {
		input.SecurityGroupIds = aws.StringSlice(simpleConfig.SecurityGroupIds)
	}
	if simpleConfig.IamInstanceProfile != "" {
		input.IamInstanceProfile = &ec2.IamInstanceProfileSpecification{
			Name: aws.String(simpleConfig.IamInstanceProfile),
		}
	}

	setAutoTermination := false
	if detailedConfig != nil {
		// Set all EBS volumes not to be deleted, if specified
		if HasEbsVolume(detailedConfig.Image) && simpleConfig.KeepEbsVolumeAfterTermination {
			input.BlockDeviceMappings = detailedConfig.Image.BlockDeviceMappings
			for _, block := range input.BlockDeviceMappings {
				if block.Ebs != nil {
					block.Ebs.DeleteOnTermination = aws.Bool(false)
				}
			}
		}
		setAutoTermination = IsLinux(*detailedConfig.Image.PlatformDetails) && simpleConfig.AutoTerminationTimerMinutes > 0
	}

	if setAutoTermination {
		input.InstanceInitiatedShutdownBehavior = aws.String("terminate")
		autoTermCmd := fmt.Sprintf("#!/bin/bash\necho \"sudo poweroff\" | at now + %d minutes\n",
			simpleConfig.AutoTerminationTimerMinutes)
		if simpleConfig.BootScriptFilePath == "" {
			input.UserData = aws.String(base64.StdEncoding.EncodeToString([]byte(autoTermCmd)))
		} else {
			bootScriptRaw, _ := ioutil.ReadFile(simpleConfig.BootScriptFilePath)
			bootScriptLines := strings.Split(string(bootScriptRaw), "\n")
			//if #!/bin/bash is first, then replace first line otherwise, prepend termination
			if len(bootScriptLines) >= 1 && bootScriptLines[0] == "#!/bin/bash" {
				bootScriptLines[0] = autoTermCmd
			} else {
				bootScriptLines = append([]string{autoTermCmd}, bootScriptLines...)
			}
			bootScriptRaw = []byte(strings.Join(bootScriptLines, "\n"))
			input.UserData = aws.String(base64.StdEncoding.EncodeToString(bootScriptRaw))
		}
	} else {
		if simpleConfig.BootScriptFilePath != "" {
			bootScriptRaw, _ := ioutil.ReadFile(simpleConfig.BootScriptFilePath)
			input.UserData = aws.String(base64.StdEncoding.EncodeToString(bootScriptRaw))
		}
	}
	return input
}