Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 EC2 Java SDK-用户数据脚本_Amazon Ec2_Amazon Web Services - Fatal编程技术网

Amazon ec2 EC2 Java SDK-用户数据脚本

Amazon ec2 EC2 Java SDK-用户数据脚本,amazon-ec2,amazon-web-services,Amazon Ec2,Amazon Web Services,我正在寻找一种方法,将用户数据脚本附加到JavaSDK中的EC2RunRequest(相当于命令行工具) 我已经读到,任何带有“#!”的用户数据字符串都将执行,但情况似乎并非如此 这可能吗 仅供参考:这是我的测试课程: public class AWSTest { public static void main(String[] args) { AWSCredentials credentials = new BasicAWSCredentials("access-k

我正在寻找一种方法,将用户数据脚本附加到JavaSDK中的EC2RunRequest(相当于命令行工具)

我已经读到,任何带有“#!”的用户数据字符串都将执行,但情况似乎并非如此

这可能吗

仅供参考:这是我的测试课程:

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();
    }

}
公共类AWSTest{
公共静态void main(字符串[]args){
AWSCredentials credentials=新的基本WSCredentials(“访问密钥”、“秘密访问密钥”);
AmazonEC2Client ec2=新的AmazonEC2Client(凭证);
RunInstanceRequest=新的RunInstanceRequest();
request.setInstanceType(InstanceType.M1Small.toString());
请求setMinCount(1);
请求setMaxCount(1);
setImageId(“ami-84db39ed”);
setKeyName(“linux密钥对”);
setUserData(getUserDataScript());
ec2.运行实例(请求);
}
私有静态字符串getUserDataScript(){
ArrayList行=新的ArrayList();
行。添加(“#!/bin/bash”);
行。添加(“卷曲”)http://www.google.com >谷歌(google.html),;
行。添加(“关机-h 0”);
String str=新字符串(Base64.encodeBase64(join(line,“\n”).getBytes());
返回str;
}
静态字符串联接(集合s、字符串分隔符){
StringBuilder=新的StringBuilder();
迭代器iter=s.Iterator();
while(iter.hasNext()){
append(iter.next());
如果(!iter.hasNext()){
打破
}
builder.append(分隔符);
}
返回builder.toString();
}
}
不幸的是,在我运行了这个之后,我能够用SSH连接到这个盒子中,并确认这一点

  • 它还没有关闭和关闭
  • 它没有下载文件
非常感谢您的帮助

最好的


Zach

您使用的AMI可能不支持用户数据脚本? 请使用www.alestic.com上的AMI


还有一个很好的参考

这可以在实例运行请求中插入用户数据,在这种情况下,特别是加入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;
}

你完全正确。Amazon的默认版本似乎不执行用户脚本。虽然Alestic的AMI是可靠的,但我有一些Fedora特定的代码,所以我继续使用Java库将SSH连接到box中,并执行我需要的所有操作。