Exemplo n.º 1
1
func (aws *RealAWSService) RunInstances(idef *InstancesDefinition) ([]string, error) {
	count := int64(idef.Count)
	rs := int64(20)
	vt := "gp2"
	rdn := "/dev/xvda"
	ud, err := encodeUserData(idef.UserData)
	if err != nil {
		return []string{}, err
	}
	if idef.RootSizeGB != 0 {
		rs = int64(idef.RootSizeGB)
	}
	root := ec2.BlockDeviceMapping{
		DeviceName: &rdn,
		Ebs: &ec2.EbsBlockDevice{
			DeleteOnTermination: &True,
			VolumeSize:          &rs,
			VolumeType:          &vt,
		},
	}
	if idef.EncryptedRoot {
		root.Ebs.Encrypted = &idef.EncryptedRoot // leave nil otherwise
	}
	bdm := []*ec2.BlockDeviceMapping{&root}
	for _, bd := range idef.BlockDevices {
		vt := strings.ToLower(bd.Type.String())
		nbd := &ec2.BlockDeviceMapping{
			DeviceName: &bd.Name,
			Ebs: &ec2.EbsBlockDevice{
				DeleteOnTermination: &bd.DeleteOnTermination,
				Encrypted:           &bd.Encrypted,
				Iops:                &bd.Iops,
				SnapshotId:          &bd.SnapshotID,
				VolumeSize:          &bd.Size,
				VolumeType:          &vt,
			},
		}
		bdm = append(bdm, nbd)
	}
	ri := ec2.RunInstancesInput{
		ImageId:             &idef.AMI,
		MinCount:            &count,
		MaxCount:            &count,
		KeyName:             &idef.Keypair,
		InstanceType:        &idef.Type,
		BlockDeviceMappings: bdm,
		UserData:            &ud,
	}
	if idef.GetPublicIP {
		devindx := int64(0)
		ri.NetworkInterfaces = []*ec2.InstanceNetworkInterfaceSpecification{&ec2.InstanceNetworkInterfaceSpecification{
			AssociatePublicIpAddress: &True,
			Groups:      []*string{&idef.SecurityGroup},
			DeviceIndex: &devindx,
			SubnetId:    &idef.Subnet,
		}}
	} else {
		ri.SubnetId = &idef.Subnet
		ri.SecurityGroupIds = []*string{&idef.SecurityGroup}
	}
	r, err := aws.ec2.RunInstances(&ri)
	if err != nil {
		return []string{}, err
	}
	instances := []string{}
	for _, inst := range r.Instances {
		instances = append(instances, *(inst.InstanceId))
	}
	return instances, nil
}