Amazon ec2 EC2 Java SDK-用户数据脚本
我正在寻找一种方法,将用户数据脚本附加到JavaSDK中的EC2RunRequest(相当于命令行工具) 我已经读到,任何带有“#!”的用户数据字符串都将执行,但情况似乎并非如此 这可能吗 仅供参考:这是我的测试课程: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
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中,并执行我需要的所有操作。