2016-08-12 62 views
0

我想在产生一个新的实例时发送一些userData,但不幸的是它不工作。代码是:EC2 UserData不能与Java SDK一起工作

为了进行调试,我刚刚使用了一个echo语句,但是我找不到在机器上生成的任何新文件。我还检查了/ var/log文件夹中的cloud-init日志,但没有一个存在。

任何人都可以帮助我找出一种方法来调试这个问题,或者是有什么重要的,我失踪?

我使用C4.8xLarge实例作为参考。

public static String getUserData() throws UnsupportedEncodingException { 
String userData = ""; 
userData = userData + "#!/bin/bash" + "\n"; 
userData += "echo hello > hello" + "\n"; 

String base64UserData = null; 
try { 
    base64UserData = new String(Base64.encodeBase64(userData.getBytes("UTF-8")), "UTF-8"); 
} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} 
return base64UserData; 
} 

RunInstancesRequest runInstancesRequest = new RunInstancesRequest(); 
runInstancesRequest.setImageId(AMI_ID); 
runInstancesRequest.setEbsOptimized(true); 
runInstancesRequest.setInstanceType(INSTANCE_TYPE); 
runInstancesRequest.setMinCount(1); 
runInstancesRequest.setMaxCount(1); 
runInstancesRequest.withSecurityGroups("JavaSecurityGroup1"); 

runInstancesRequest.withUserData(getUserData()); 

List<BlockDeviceMapping> map = new ArrayList<>(); 
map.add(new BlockDeviceMapping().withEbs(new EbsBlockDevice().withSnapshotId("snap-af8s67ef").withIops(9000).withVolumeSize(300).withVolumeType("io1")).withDeviceName("/dev/sdf")); 
runInstancesRequest.withBlockDeviceMappings(map); 

RunInstancesResult runInsRes = ec2.runInstances(runInstancesRequest); 

谢谢!

回答

0

创建实例后,进入EC2 Web控制台并查看实例上的用户数据。您应该能够在Web控制台中以纯文本形式查看它。如果它不在那里,或者如果它包含的是您尝试设置为用户数据的两行以外的内容,那么您将知道设置用户数据的方式存在问题。

如果它在那里并且看起来正确,那么您需要查看创建的实例上的cloud-init服务日志/var/log/cloud-init-output.log以查看错误是什么。

编辑:我刚刚注意到你说云初始化日志没有出现在机器上。你使用的是什么操作系统?它可能没有cloud-init服务。

+0

是的。我用我自己的AMI,它没有安装cloud-init。安装后,该脚本起作用。我没有看到任何名为'cloud-init-output.log'的输出文件。我怀疑这是一个AWS功能。在这种情况下,我可以在哪里查看脚本的输出以及脚本是否已成功运行? – LearningToCode