2015-02-10 126 views
2

我正嘗試使用JClouds將新卷附加到我的實例。但我找不到辦法。JClouds:如何將新卷附加到AWS EC2實例

final String POLL_PERIOD_TWENTY_SECONDS = String.valueOf(SECONDS.toMillis(20)); 

    Properties overrides = new Properties(); 
    overrides.setProperty(ComputeServiceProperties.POLL_INITIAL_PERIOD, POLL_PERIOD_TWENTY_SECONDS); 
    overrides.setProperty(ComputeServiceProperties.POLL_MAX_PERIOD, POLL_PERIOD_TWENTY_SECONDS); 

    Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule(), new SLF4JLoggingModule()); 
    //Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule()); 

    ComputeServiceContext context = ContextBuilder.newBuilder("aws-ec2") 
      .credentials("valid user", "valid password") 
      .modules(modules) 
      .overrides(overrides) 
      .buildView(ComputeServiceContext.class); 
    ComputeService computeService = context.getComputeService(); 

    // Ubuntu AMI 
    Template template = computeService.templateBuilder() 
      .locationId("us-east-1") 
      .imageId("us-east-1/ami-7c807d14") 
      .hardwareId("t1.micro") 
      .build(); 

    // This line creates the volume but does not attach it 
    template.getOptions().as(EC2TemplateOptions.class).mapNewVolumeToDeviceName("/dev/sdm", 100, true); 

    Set<? extends NodeMetadata> nodes = computeService.createNodesInGroup("m456", 1, template); 

    for (NodeMetadata nodeMetadata : nodes) { 
     String publicAddress = nodeMetadata.getPublicAddresses().iterator().next(); 
     //String privateAddress = nodeMetadata.getPrivateAddresses().iterator().next(); 
     String username = nodeMetadata.getCredentials().getUser(); 
     String password = nodeMetadata.getCredentials().getPassword(); 
     // [...] 
     System.out.println(String.format("ssh %[email protected]%s %s", username, publicAddress, password)); 
     System.out.println(nodeMetadata.getCredentials().getPrivateKey()); 
    } 

如何創建將卷附加到目錄「/ var」? 如何創建具有更多硬盤空間的實例?

回答

3

您可以在jclouds中使用ElasticBlockStoreApi。您所創建的實例了,所以創建和附加這樣的量:

// Get node 
NodeMetadata node = Iterables.getOnlyElement(nodes); 

// Get AWS EC2 API 
EC2Api ec2Api = computeServiceContext.unwrapApi(EC2Api.class); 

// Create 100 GiB Volume 
Volume volume = ec2Api.getElasticBlockStoreApi().get() 
     .createVolumeInAvailabilityZone(zoneId, 100); 

// Attach to instance 
Attachment attachment = ec2Api.getElasticBlockStoreApi().get() 
     .attachVolumeInRegion(region, volume.getId(), node.getId(), "/dev/sdx"); 

現在,你有一個EBS卷連接,以及VM具有爲其創建一個塊設備,你只需要運行正確的命令將其掛載在/var目錄中,這取決於您的特定操作系統。你可以運行這樣的腳本:

// Run script on instance 
computeService.runScriptOnNode(node.getId(), 
     Statements.exec("mount /dev/sdx /var"));