【问题标题】:EC2 Java SDK - User data scriptEC2 Java SDK - 用户数据脚本
【发布时间】:2016-01-23 03:52:36
【问题描述】:

我正在寻找一种将用户数据脚本附加到 Java SDK 中的 EC2 RunRequest 的方法(相当于命令行工具的 ec2-run-instances ami-1234567 -f startup-script.zip)。

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

这可能吗?

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

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 连接到盒子,并确认

  • 它没有关闭并且
  • 没有下载文件

非常感谢任何帮助。

最好的,

扎克

【问题讨论】:

    标签: amazon-ec2 amazon-web-services


    【解决方案1】:

    这用于在实例运行请求中插入用户数据,在这种情况下专门用于加入 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      也是一个很好的参考http://alestic.com/2009/06/ec2-user-data-scripts

      【讨论】:

      • 你是完全正确的。亚马逊的默认构建似乎不执行用户脚本。虽然 Alestic 的 AMI 很可靠,但我有一些 Fedora 特定的代码,所以我继续使用 Java 库通过 SSH 连接到盒子并执行我需要的一切。
      猜你喜欢
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2014-04-14
      • 2013-07-21
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多