Example usage for com.amazonaws.services.ec2.model RunInstancesRequest withPlacement

List of usage examples for com.amazonaws.services.ec2.model RunInstancesRequest withPlacement

Introduction

In this page you can find the example usage for com.amazonaws.services.ec2.model RunInstancesRequest withPlacement.

Prototype


public RunInstancesRequest withPlacement(Placement placement) 

Source Link

Document

The placement for the instance.

Usage

From source file:com.cloudera.director.aws.ec2.EC2Provider.java

License:Apache License

/**
 * Builds a {@code RunInstancesRequest} starting from a template and a set of
 * virtual IDs./*from  w ww.java  2s.c  o m*/
 *
 * @param template           the instance template
 * @param virtualInstanceIds the virtual instance IDs
 */
@SuppressWarnings("ConstantConditions")
private RunInstancesRequest newRunInstancesRequest(EC2InstanceTemplate template,
        Collection<String> virtualInstanceIds, int minCount) {

    LOG.info(">> Building instance requests");

    int groupSize = virtualInstanceIds.size();
    String image = template.getImage();
    String type = template.getType();

    InstanceNetworkInterfaceSpecification network = getInstanceNetworkInterfaceSpecification(template);

    List<BlockDeviceMapping> deviceMappings = getBlockDeviceMappings(template);

    LOG.info(">> Instance request type: {}, image: {}, group size: {}", type, image, groupSize);

    RunInstancesRequest request = new RunInstancesRequest().withImageId(image).withInstanceType(type)
            .withMaxCount(groupSize).withMinCount(minCount)
            .withClientToken(
                    getHashOfVirtualInstanceIdsForClientToken(virtualInstanceIds, Optional.<Long>absent()))
            .withNetworkInterfaces(network).withBlockDeviceMappings(deviceMappings);

    if (template.getIamProfileName().isPresent()) {
        request.withIamInstanceProfile(
                new IamInstanceProfileSpecification().withName(template.getIamProfileName().get()));
    }

    if (template.getKeyName().isPresent()) {
        request.withKeyName(template.getKeyName().get());
    }

    Placement placement = null;
    if (template.getAvailabilityZone().isPresent()) {
        placement = new Placement().withAvailabilityZone(template.getAvailabilityZone().get());
    }
    if (template.getPlacementGroup().isPresent()) {
        placement = (placement == null) ? new Placement().withGroupName(template.getPlacementGroup().get())
                : placement.withGroupName(template.getPlacementGroup().get());
    }
    placement = (placement == null) ? new Placement().withTenancy(template.getTenancy())
            : placement.withTenancy(template.getTenancy());

    request.withPlacement(placement);

    return request;
}

From source file:com.urbancode.terraform.tasks.aws.helpers.AWSHelper.java

License:Apache License

/**
 * Launches a single instance with given parameters.
 * The REQUIRED parameters are amiId;/* www .j  a v a2  s  . c  o m*/
 * You should always pass in a keyPair also, unless you know exactly what you are doing. Chances
 * are that you won't be able to get into your instance and it will be useless.
 * If groups is null, the instance will be launched with the default security group.
 * Subnet is only required if you're launching into a VPC.
 *
 * This will return the instanceId of the instance launched.
 *
 * @param amiId
 * @param subnetId
 * @param keyPair
 * @param size
 * @param userData
 * @param groups
 * @param ec2Client
 * @return instanceId
 */
public String launchAmi(String amiId, String subnetId, String keyPair, String size, String userData,
        List<String> groups, List<BlockDeviceMapping> blockMaps, String ariId, String akiId, String zone,
        String privateIp, AmazonEC2 ec2Client) {
    String instanceId = null;
    RunInstancesRequest request = new RunInstancesRequest().withImageId(amiId).withMinCount(1).withMaxCount(1);
    if (subnetId != null && !subnetId.isEmpty()) {
        // launch in VPC
        request = request.withSubnetId(subnetId);
    } else if (zone != null && !zone.isEmpty()) {
        // launch in EC2
        Placement placement = new Placement().withAvailabilityZone(zone);
        request = request.withPlacement(placement);
    } else {
        log.error("No place to launch the instance specified." + "\nPlease specify either a subnet or region");
    }
    if (keyPair != null) {
        request = request.withKeyName(keyPair);
    }
    if (size != null) {
        request = request.withInstanceType(size);
    }
    if (userData != null) {
        request = request.withUserData(Base64.encodeBase64String(userData.getBytes()));
    }
    if (groups != null && !groups.isEmpty()) {
        request = request.withSecurityGroupIds(groups);
    }
    if (blockMaps != null && !blockMaps.isEmpty()) {
        request = request.withBlockDeviceMappings(blockMaps);
    }
    if (ariId != null && !ariId.isEmpty()) {
        request = request.withRamdiskId(ariId);
    }
    if (akiId != null && !akiId.isEmpty()) {
        request = request.withKernelId(akiId);
    }
    if (privateIp != null && !privateIp.isEmpty()) {
        request = request.withPrivateIpAddress(privateIp);
    }

    RunInstancesResult result = ec2Client.runInstances(request);

    List<Instance> instances = result.getReservation().getInstances();

    if (instances == null) {
        instanceId = null;
        log.error("List of instances is null!");
    } else if (instances.size() == 0) {
        instanceId = null;
        log.error("List of instances is empty!");
    } else if (instances.size() == 1) {
        instanceId = instances.get(0).getInstanceId();
        log.info("Created instance with Id: " + instanceId);
    } else if (instances.size() > 1) {
        log.error("Too many instances! This is not supported!");
    }

    return instanceId;
}

From source file:com.xebialabs.overcast.host.Ec2CloudHost.java

License:Apache License

protected String runInstance() {
    RunInstancesRequest run = new RunInstancesRequest(amiId, 1, 1);
    run.withInstanceInitiatedShutdownBehavior("terminate");
    if (amiInstanceType != null) {
        run.withInstanceType(amiInstanceType);
    }//from w  ww .j  a  v  a  2 s . c o  m
    if (amiSecurityGroup != null) {
        run.withSecurityGroups(amiSecurityGroup);
    }
    if (amiKeyName != null) {
        run.withKeyName(amiKeyName);
    }
    if (amiAvailabilityZone != null) {
        run.withPlacement(new Placement(amiAvailabilityZone));
    }

    RunInstancesResult result = ec2.runInstances(run);

    return result.getReservation().getInstances().get(0).getInstanceId();
}

From source file:com.zotoh.cloudapi.aws.EC2Instance.java

License:Open Source License

@Override
public VirtualMachine launch(String ami, VirtualMachineProduct type, String zone, String name,
        String descOrUserData, String keypair, String vpcId, boolean monitoring, boolean asImageSandbox,
        String[] firewalls, Tag... tags) throws InternalException, CloudException {
    tstEStrArg("image-id", ami);
    tstObjArg("product-type", type);
    tstEStrArg("keypair", keypair);
    tstEStrArg("zone", zone);
    RunInstancesRequest req = new RunInstancesRequest().withInstanceType(type.getProductId()).withImageId(ami)
            .withKeyName(keypair).withMaxCount(1).withMinCount(1).withMonitoring(monitoring);
    if (!isNilArray(firewalls)) {
        req.withSecurityGroups(firewalls);
    }// w w  w . ja  va 2  s .  co  m
    String[] ss = zone.split("\\|");
    _svc.getCloud().setAWSSite(ss[0]);
    if (ss.length > 1) {
        req.withPlacement(new Placement().withAvailabilityZone(trim(ss[1])));
    }
    if (!isEmpty(descOrUserData)) {
        req.withUserData(descOrUserData);
    }
    RunInstancesResult res = _svc.getCloud().getEC2().runInstances(req);
    Reservation r = res == null ? null : res.getReservation();
    VirtualMachine vm = null;
    if (r != null) {
        List<Instance> lst = r.getInstances();
        vm = toVM(r.getOwnerId(), isNil(lst) ? null : lst.get(0));
    }
    return vm;
}

From source file:jp.primecloud.auto.process.aws.AwsInstanceProcess.java

License:Open Source License

public void run(AwsProcessClient awsProcessClient, Long instanceNo) {
    Instance instance = instanceDao.read(instanceNo);
    AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
    ImageAws imageAws = imageAwsDao.read(instance.getImageNo());
    PlatformAws platformAws = awsProcessClient.getPlatformAws();

    // ?/*w w w.j  a  v  a  2  s . c o  m*/
    RunInstancesRequest request = new RunInstancesRequest();
    request.withMinCount(1);
    request.withMaxCount(1);
    request.withImageId(imageAws.getImageId());
    request.withKernelId(StringUtils.isEmpty(imageAws.getKernelId()) ? null : imageAws.getKernelId());
    request.withRamdiskId(StringUtils.isEmpty(imageAws.getRamdiskId()) ? null : imageAws.getRamdiskId());
    request.withKeyName(awsInstance.getKeyName());
    request.withInstanceType(awsInstance.getInstanceType());

    // UserData
    Map<String, String> userData = createUserData(instanceNo);
    request.withUserData(encodeUserData(userData));

    // ?VPC??
    if (BooleanUtils.isNotTrue(platformAws.getVpc())) {
        // AvailabilityZone
        if (StringUtils.isNotEmpty(awsInstance.getAvailabilityZone())) {
            request.withPlacement(new Placement(awsInstance.getAvailabilityZone()));
        }

        // SecurityGroup
        if (StringUtils.isNotEmpty(awsInstance.getSecurityGroups())) {
            for (String groupName : StringUtils.split(awsInstance.getSecurityGroups(), ",")) {
                request.withSecurityGroups(groupName.trim());
            }
        }
    }
    // VPC??
    else {
        // Subnet
        request.withSubnetId(awsInstance.getSubnetId());

        // SecurytiGroup
        List<SecurityGroup> securityGroups = awsCommonProcess.describeSecurityGroupsByVpcId(awsProcessClient,
                platformAws.getVpcId());
        for (String groupName : StringUtils.split(awsInstance.getSecurityGroups(), ",")) {
            groupName = groupName.trim();
            for (SecurityGroup securityGroup : securityGroups) {
                if (StringUtils.equals(groupName, securityGroup.getGroupName())) {
                    request.withSecurityGroupIds(securityGroup.getGroupId());
                    break;
                }
            }
        }

        // PrivateIpAddress
        if (StringUtils.isNotEmpty(awsInstance.getPrivateIpAddress())) {
            request.withPrivateIpAddress(awsInstance.getPrivateIpAddress());
        }
    }

    // BlockDeviceMapping
    List<BlockDeviceMapping> blockDeviceMappings = createBlockDeviceMappings(awsProcessClient, imageAws,
            awsInstance);
    request.withBlockDeviceMappings(blockDeviceMappings);

    // 
    processLogger.debug(null, instance, "AwsInstanceCreate",
            new Object[] { awsProcessClient.getPlatform().getPlatformName() });

    // ??
    RunInstancesResult result = awsProcessClient.getEc2Client().runInstances(request);
    Reservation reservation = result.getReservation();

    if (reservation == null || reservation.getInstances().size() != 1) {
        // ?
        throw new AutoException("EPROCESS-000105");
    }

    com.amazonaws.services.ec2.model.Instance instance2 = reservation.getInstances().get(0);

    // 
    if (log.isInfoEnabled()) {
        log.info(MessageUtils.getMessage("IPROCESS-100115", instance2.getInstanceId()));
    }

    // 
    awsInstance.setInstanceId(instance2.getInstanceId());
    awsInstance.setStatus(instance2.getState().getName());
    awsInstanceDao.update(awsInstance);
}

From source file:org.apache.usergrid.chop.api.store.amazon.EC2InstanceManager.java

License:Apache License

/**
 * Launches instances of given cluster./*from  ww w  .ja  v  a2  s .  c  o m*/
 *
 * After launching instances, blocks for maximum <code>timeout</code> amount until all
 * instances get into the Running state.
 *
 * @param stack     <code>ICoordinatedStack</code> object containing the <code>cluster</code>
 * @param cluster
 * @param timeout   in milliseconds, if smaller than <code>getDefaultTimeout()</code> it doesn't wait
 * @return          resulting runner instances which successfully got in Running state
 */
@Override
public LaunchResult launchCluster(ICoordinatedStack stack, ICoordinatedCluster cluster, int timeout) {

    RunInstancesResult runInstancesResult = null;
    try {
        RunInstancesRequest runInstancesRequest = new RunInstancesRequest();

        runInstancesRequest.withImageId(cluster.getInstanceSpec().getImageId())
                .withInstanceType(cluster.getInstanceSpec().getType()).withMinCount(cluster.getSize())
                .withMaxCount(cluster.getSize()).withKeyName(cluster.getInstanceSpec().getKeyName())
                .withSecurityGroups(stack.getIpRuleSet().getName());

        if (stack.getDataCenter() != null && !stack.getDataCenter().isEmpty()) {
            runInstancesRequest = runInstancesRequest.withPlacement(new Placement(stack.getDataCenter()));
            client.setEndpoint(AmazonUtils.getEndpoint(stack.getDataCenter()));
        }

        runInstancesResult = client.runInstances(runInstancesRequest);
    } catch (Exception e) {
        LOG.error("Error while launching cluster instances.", e);
        return new EC2LaunchResult(cluster.getInstanceSpec(), Collections.EMPTY_LIST);
    }

    LOG.info("Created instances, setting the names now...");

    List<String> instanceIds = new ArrayList<String>(cluster.getSize());

    String instanceNames = getInstanceName(stack, cluster);

    int i = 0;
    for (com.amazonaws.services.ec2.model.Instance instance : runInstancesResult.getReservation()
            .getInstances()) {

        try {
            instanceIds.add(i, instance.getInstanceId());
            LOG.debug("Setting name of cluster instance with id: {}", instanceIds.get(i));

            List<Tag> tags = new ArrayList<Tag>();

            Tag t = new Tag();
            t.setKey("Name");
            t.setValue(instanceNames);
            tags.add(t);

            CreateTagsRequest ctr = new CreateTagsRequest();
            ctr.setTags(tags);
            ctr.withResources(instanceIds.get(i));
            client.createTags(ctr);
        } catch (Exception e) {
            LOG.warn("Error while setting names", e);
        }
        i++;
    }

    LOG.info("Names of the instances are set");

    if (timeout > SLEEP_LENGTH) {
        LOG.info("Waiting for maximum {} msec until all instances are running", timeout);
        boolean stateCheck = waitUntil(instanceIds, InstanceState.Running, timeout);

        if (!stateCheck) {
            LOG.warn("Waiting for instances to get into Running state has timed out");
        }
    }

    Collection<Instance> instances = toInstances(getEC2Instances(instanceIds));

    return new EC2LaunchResult(cluster.getInstanceSpec(), instances);
}

From source file:org.apache.usergrid.chop.api.store.amazon.EC2InstanceManager.java

License:Apache License

/**
 * Launches runner instances of given stack.
 *
 * Given <code>ICoordinatedStack</code> and an <code>InstanceSpec</code>
 * defining its runners' instance specifications, launches all runner instances.
 * After launching instances, blocks for maximum <code>timeout</code> amount until all
 * instances get into the Running state.
 *
 * @param stack/*ww w.j ava  2  s . c  o m*/
 * @param spec
 * @param timeout   in milliseconds, if smaller than <code>getDefaultTimeout()</code> it doesn't wait
 * @return          resulting runner instances which successfully got in Running state
 */
@Override
public LaunchResult launchRunners(ICoordinatedStack stack, InstanceSpec spec, int timeout) {

    RunInstancesResult runInstancesResult = null;
    try {
        RunInstancesRequest runInstancesRequest = new RunInstancesRequest();

        runInstancesRequest.withImageId(spec.getImageId()).withInstanceType(spec.getType())
                .withMinCount(stack.getRunnerCount()).withMaxCount(stack.getRunnerCount())
                .withKeyName(spec.getKeyName()).withSecurityGroups(stack.getIpRuleSet().getName());

        if (stack.getDataCenter() != null && !stack.getDataCenter().isEmpty()) {
            runInstancesRequest = runInstancesRequest.withPlacement(new Placement(stack.getDataCenter()));
            client.setEndpoint(AmazonUtils.getEndpoint(stack.getDataCenter()));
        }

        runInstancesResult = client.runInstances(runInstancesRequest);
    } catch (Exception e) {
        LOG.error("Error while launching runner instances.", e);
        return new EC2LaunchResult(spec, Collections.EMPTY_LIST);
    }

    LOG.info("Created instances, setting the names now...");

    List<String> instanceIds = new ArrayList<String>(stack.getRunnerCount());
    String runnerNames = getRunnerName(stack);

    int i = 0;
    for (com.amazonaws.services.ec2.model.Instance instance : runInstancesResult.getReservation()
            .getInstances()) {

        try {
            instanceIds.add(i, instance.getInstanceId());
            LOG.debug("Setting name of runner instance with id: {}", instanceIds.get(i));

            List<Tag> tags = new ArrayList<Tag>();

            Tag t = new Tag();
            t.setKey("Name");
            t.setValue(runnerNames);
            tags.add(t);

            CreateTagsRequest ctr = new CreateTagsRequest();
            ctr.setTags(tags);
            ctr.withResources(instanceIds.get(i));
            client.createTags(ctr);
        } catch (Exception e) {
            LOG.warn("Error while setting names", e);
        }
        i++;
    }

    LOG.info("Names of the instances are set");

    if (timeout > SLEEP_LENGTH) {
        LOG.info("Waiting for maximum {} msec until all instances are running", timeout);
        boolean stateCheck = waitUntil(instanceIds, InstanceState.Running, timeout);

        if (!stateCheck) {
            LOG.warn("Waiting for instances to get into Running state has timed out");
        }
    }

    Collection<Instance> instances = toInstances(getEC2Instances(instanceIds));

    return new EC2LaunchResult(spec, instances);
}

From source file:org.cloudifysource.esc.driver.provisioning.privateEc2.PrivateEC2CloudifyDriver.java

License:Open Source License

private Instance createEC2Instance(final PrivateEc2Template cfnTemplate, final ProvisioningContextImpl ctx,
        final boolean management, final String machineName, final long duration, final TimeUnit unit)
        throws CloudProvisioningException, TimeoutException {

    final InstanceProperties properties = cfnTemplate.getEC2Instance().getProperties();

    final String availabilityZone = properties.getAvailabilityZone() == null ? null
            : properties.getAvailabilityZone().getValue();
    final Placement placement = availabilityZone == null ? null : new Placement(availabilityZone);

    final String imageId = properties.getImageId() == null ? null : properties.getImageId().getValue();
    final String instanceType = properties.getInstanceType() == null ? null
            : properties.getInstanceType().getValue();
    final String keyName = properties.getKeyName() == null ? null : properties.getKeyName().getValue();
    final String privateIpAddress = properties.getPrivateIpAddress() == null ? null
            : properties.getPrivateIpAddress().getValue();
    final List<String> securityGroupIds = properties.getSecurityGroupIdsAsString();
    final List<String> securityGroups = properties.getSecurityGroupsAsString();

    S3Object s3Object = null;
    try {//w w  w  .ja va  2s . co m

        String userData = null;
        if (properties.getUserData() != null) {
            // Generate ENV script for the provisioned machine
            final StringBuilder sb = new StringBuilder();
            final String script = management ? this.generateManagementCloudifyEnv(ctx)
                    : this.generateCloudifyEnv(ctx);

            s3Object = this.uploadCloudDir(ctx, script, management);
            final String cloudFileS3 = this.amazonS3Uploader.generatePresignedURL(s3Object);

            ComputeTemplate template = this.getManagerComputeTemplate();
            String cloudFileDir = (String) template.getRemoteDirectory();
            // Remove '/' from the path if it's the last char.
            if (cloudFileDir.length() > 1 && cloudFileDir.endsWith("/")) {
                cloudFileDir = cloudFileDir.substring(0, cloudFileDir.length() - 1);
            }
            final String endOfLine = " >> /tmp/cloud.txt\n";
            sb.append("#!/bin/bash\n");
            sb.append("export TMP_DIRECTORY=/tmp").append(endOfLine);
            sb.append("export S3_ARCHIVE_FILE='" + cloudFileS3 + "'").append(endOfLine);
            sb.append("wget -q -O $TMP_DIRECTORY/cloudArchive.tar.gz $S3_ARCHIVE_FILE").append(endOfLine);
            sb.append("mkdir -p " + cloudFileDir).append(endOfLine);
            sb.append("tar zxvf $TMP_DIRECTORY/cloudArchive.tar.gz -C " + cloudFileDir).append(endOfLine);
            sb.append("rm -f $TMP_DIRECTORY/cloudArchive.tar.gz").append(endOfLine);
            sb.append("echo ").append(cloudFileDir).append("/").append(CLOUDIFY_ENV_SCRIPT).append(endOfLine);
            sb.append("chmod 755 ").append(cloudFileDir).append("/").append(CLOUDIFY_ENV_SCRIPT)
                    .append(endOfLine);
            sb.append("source ").append(cloudFileDir).append("/").append(CLOUDIFY_ENV_SCRIPT).append(endOfLine);

            sb.append(properties.getUserData().getValue());
            userData = sb.toString();
            logger.fine("Instanciate ec2 with user data:\n" + userData);
            userData = StringUtils.newStringUtf8(Base64.encodeBase64(userData.getBytes()));
        }

        List<BlockDeviceMapping> blockDeviceMappings = null;
        AWSEC2Volume volumeConfig = null;
        if (properties.getVolumes() != null) {
            blockDeviceMappings = new ArrayList<BlockDeviceMapping>(properties.getVolumes().size());
            for (final VolumeMapping volMapping : properties.getVolumes()) {
                volumeConfig = cfnTemplate.getEC2Volume(volMapping.getVolumeId().getValue());
                blockDeviceMappings
                        .add(this.createBlockDeviceMapping(volMapping.getDevice().getValue(), volumeConfig));
            }
        }

        final RunInstancesRequest runInstancesRequest = new RunInstancesRequest();
        runInstancesRequest.withPlacement(placement);
        runInstancesRequest.withImageId(imageId);
        runInstancesRequest.withInstanceType(instanceType);
        runInstancesRequest.withKeyName(keyName);
        runInstancesRequest.withPrivateIpAddress(privateIpAddress);
        runInstancesRequest.withSecurityGroupIds(securityGroupIds);
        runInstancesRequest.withSecurityGroups(securityGroups);
        runInstancesRequest.withMinCount(1);
        runInstancesRequest.withMaxCount(1);
        runInstancesRequest.withBlockDeviceMappings(blockDeviceMappings);
        runInstancesRequest.withUserData(userData);

        if (logger.isLoggable(Level.FINEST)) {
            logger.finest("EC2::Instance request=" + runInstancesRequest);
        }

        final RunInstancesResult runInstances = this.ec2.runInstances(runInstancesRequest);
        if (runInstances.getReservation().getInstances().size() != 1) {
            throw new CloudProvisioningException(
                    "Request runInstace fails (request=" + runInstancesRequest + ").");
        }

        Instance ec2Instance = runInstances.getReservation().getInstances().get(0);
        ec2Instance = this.waitRunningInstance(ec2Instance, duration, unit);
        this.tagEC2Instance(ec2Instance, machineName, cfnTemplate.getEC2Instance());
        this.tagEC2Volumes(ec2Instance.getInstanceId(), cfnTemplate);
        this.waitRunningAgent(ec2Instance.getPublicIpAddress(), duration, unit);

        return ec2Instance;
    } finally {
        if (s3Object != null) {
            this.amazonS3Uploader.deleteS3Object(s3Object.getBucketName(), s3Object.getKey());
        }
    }
}

From source file:org.excalibur.service.aws.ec2.EC2.java

License:Open Source License

@Override
public Instances createInstances(final InstanceTemplate template, final boolean waitForRunningState) {
    LoginCredentials credentials = template.getLoginCredentials();
    KeyPair keyPair = getKeyPair(checkNotNull(credentials.getCredentialName()));

    checkState(keyPair != null || (!isNullOrEmpty(credentials.getPublicKey())));

    if (keyPair == null) {
        String material = decrypt(credentials.getPublicKey());
        keyPair = new KeyPair().setKeyName(credentials.getCredentialName()).setKeyMaterial(material);
        keyPair.setKeyFingerprint(importKeyPair(keyPair)).setKeyMaterial(null);
    }//from w w  w . ja  v  a 2s  .  co m

    checkState(keyPair != null);

    createSecurityGroupIfDoesNotExist(defaultUserGroupName_);

    final Image image = getImageById(template.getImageId());
    checkNotNull(image, String.format("Image %s does not exist", template.getImageId()));

    StringBuilder sb = new StringBuilder();
    sb.append("#start-data\n").append("#").append(credentials.getPrivateKey());

    if (!isNullOrEmpty(credentials.getPublicKey())) {
        sb.append("\n#").append(credentials.getPublicKey());
    }
    sb.append("\n#end-data");

    String userData = Strings2.nullAsEmpty(template.getUserData())
            .concat(new String(Base64.encodeBase64(sb.toString().getBytes())));

    RunInstancesRequest runInstacesRequest = new RunInstancesRequest()
            .withInstanceType(template.getInstanceType().getName()).withImageId(template.getImageId())
            .withMinCount(template.getMinCount()).withMaxCount(template.getMaxCount())
            .withKeyName(keyPair.getKeyName()).withSecurityGroups(defaultUserGroupName_).withUserData(userData);

    Zone zone = null;

    final Placement placement = new Placement();

    if (template.getGroup() != null && !isNullOrEmpty(template.getGroup().getZone())) {
        zone = this.getZoneByName(template.getGroup().getZone());

        checkState(zone != null, String.format("Invalid zone name [%s] on region [%s]",
                template.getGroup().getZone(), credentials_.getRegion().getName()));

        placement.withAvailabilityZone(zone.getName());

        if (!isNullOrEmpty(template.getGroup().getGroupName())) {
            placement.withGroupName(template.getGroup().getGroupName());
            this.createPlacementGroupsIfDoNotExist(template.getGroup());
        }
    }

    if (zone == null) {
        zone = Lists2.first(listAvailableZonesOfRegion(this.credentials_.getRegion()));
        placement.withAvailabilityZone(zone.getName());
    }

    checkNotNull(zone);
    checkState(!isNullOrEmpty(placement.getAvailabilityZone()));

    runInstacesRequest.withPlacement(placement);

    BlockDeviceMapping blockDeviceMapping = image.getBlockDeviceMappings().get(0);

    Integer diskSize = template.getDiskSize() == null
            ? SystemUtils2.getIntegerProperty("org.excalibur.amazon.default.disk.size", 30)
            : template.getDiskSize();

    EbsBlockDevice disk = new EbsBlockDevice().withSnapshotId(blockDeviceMapping.getEbs().getSnapshotId())
            .withVolumeSize(diskSize).withVolumeType("gp2");

    runInstacesRequest.withBlockDeviceMappings(
            new BlockDeviceMapping().withDeviceName(image.getRootDeviceName()).withEbs(disk));

    RunInstancesResult result = ec2_.runInstances(runInstacesRequest);
    template.setStatus(new InstanceTemplateStatus().setStatus(Status.SUCCESS));

    Iterable<Instance> ec2Instances = waitForRunningState
            ? waitForRunningInstacesState(result.getReservation().getInstances())
            : describeEC2Instances(result.getReservation().getInstances());

    CreateTagsRequest tagsRequest = new CreateTagsRequest();

    String instanceName = isNullOrEmpty(template.getInstanceName()) ? UUID.randomUUID().toString()
            : template.getInstanceName();

    tagsRequest.withTags(new Tag().withKey(DEFAULT_INSTANCE_NAME_TAG).withValue(instanceName));
    tagsRequest.withTags(
            new Tag().withKey(DEFAULT_PLATFORM_INSTANCE_USERNAME_TAG).withValue(DEFAULT_PLATFORM_USER_NAME));
    tagsRequest.withTags(new Tag().withKey("keyname").withValue(keyPair.getKeyName()));

    tagsRequest.withResources(Collections2.transform(newArrayList(ec2Instances), INSTANCE_STRING_FUNCTION));

    for (org.excalibur.core.cloud.api.domain.Tag tag : template.getTags()) {
        if (!isNullOrEmpty(tag.getName()) && !isNullOrEmpty(tag.getValue())) {
            tagsRequest.withTags(new Tag().withKey(tag.getName()).withValue(tag.getValue()));
        }
    }

    ec2_.createTags(tagsRequest);

    if (template.getMaxCount() > 1) {

        for (int i = 0; i < result.getReservation().getInstances().size(); i++) {
            CreateTagsRequest request = new CreateTagsRequest();
            request.withResources(result.getReservation().getInstances().get(i).getInstanceId())
                    .withTags(new Tag().withKey(DEFAULT_INSTANCE_NAME_TAG)
                            .withValue(String.format("%s-%s", instanceName, i + 1)));
            ec2_.createTags(request);
        }
    }

    //        return new Instances(toExcaliburInstances(ec2Instances, keyPair));
    Instances instances = this.describeInstances(ec2Instances);

    //
    LOG.debug("Waiting instances' ready state....");
    ThreadUtils.sleep(30 * 1000);

    LOG.debug("Created [{}] instance(s) from [{}/{}]", instances.size(), template.getMinCount(),
            template.getMaxCount());

    return instances;
}