2010-07-01 48 views
5

我正在尋找一種將用戶數據腳本附加到Java SDK中的EC2 RunRequest(等效於命令行工具ec2-run-instances ami-1234567 -f startup-script.zip)的方法。EC2 Java SDK - 用戶數據腳本

Severalthings我讀過表明任何用戶數據字符串都帶有「#!」將會執行,但這似乎不是這種情況。

這甚至可能嗎?

FYI:這是我的測試類:

public class AWSTest { 

    public static void main(String[] args) { 

     AWSCredentials credentials = new BasicAWSCredentials("access-key","secret-access-key"); 
     AmazonEC2Client ec2 = new AmazonEC2Client(credentials); 
     RunInstancesRequest request = new RunInstancesRequest(); 
     request.setInstanceType(InstanceType.M1Small.toString()); 
     request.setMinCount(1); 
     request.setMaxCount(1); 
     request.setImageId("ami-84db39ed"); 
     request.setKeyName("linux-keypair"); 
     request.setUserData(getUserDataScript()); 
     ec2.runInstances(request);  
    } 

    private static String getUserDataScript(){ 
     ArrayList<String> lines = new ArrayList<String>(); 
     lines.add("#! /bin/bash"); 
     lines.add("curl http://www.google.com > google.html"); 
     lines.add("shutdown -h 0"); 
     String str = new String(Base64.encodeBase64(join(lines, "\n").getBytes())); 
     return str; 
    } 

    static String join(Collection<String> s, String delimiter) { 
     StringBuilder builder = new StringBuilder(); 
     Iterator<String> iter = s.iterator(); 
     while (iter.hasNext()) { 
      builder.append(iter.next()); 
      if (!iter.hasNext()) { 
       break; 
      } 
      builder.append(delimiter); 
     } 
     return builder.toString(); 
    } 

} 

不幸的是,我運行此之後,我能夠通過SSH進入禁區,並確認

  • 它並沒有關閉和
  • 它沒有下載文件

任何幫助是極大的讚賞。

最佳,

扎克

回答

1

這可能是可能是您使用的是不支持用戶數據腳本的AMI? 請使用www.alestic.com上的AMI。

一個很好的參考也http://alestic.com/2009/06/ec2-user-data-scripts

+0

你是完全正確的。看起來亞馬遜的默認版本不會執行用戶腳本。雖然Alestic的AMI是可靠的,但我有一些Fedora特定的代碼,所以我繼續使用Java庫來SSH進入盒子並執行我需要的一切。 – 2010-07-02 20:06:53

0

該作品在一個實例上運行要求插入用戶數據,在這種情況下,特別是加入一個ECS集羣:

private static String getECSuserData(String clusterName) { 
    String userData = ""; 
    userData = userData + "#!/bin/bash" + "\n"; 
    userData = userData + "echo ECS_CLUSTER=" + clusterName + " "; 
    userData = userData + ">> /etc/ecs/ecs.config"; 
    String base64UserData = null; 
    try { 
     base64UserData = new String(Base64.encodeBase64(userData.getBytes("UTF-8")), "UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    return base64UserData; 
}