Amazon web services 如何使用java在EC-2实例上执行shell脚本?
我需要编写一个java程序在孟买地区创建一个AWS EC2实例。 在EC2实例处于就绪状态后,程序还应该能够在该实例上执行shell脚本。我不想在我的程序中硬编码脚本。程序应该读取一个外部脚本文件。我找不到一份关于如何做的文件 这就是我想到的:Amazon web services 如何使用java在EC-2实例上执行shell脚本?,amazon-web-services,amazon-ec2,aws-sdk,Amazon Web Services,Amazon Ec2,Aws Sdk,我需要编写一个java程序在孟买地区创建一个AWS EC2实例。 在EC2实例处于就绪状态后,程序还应该能够在该实例上执行shell脚本。我不想在我的程序中硬编码脚本。程序应该读取一个外部脚本文件。我找不到一份关于如何做的文件 这就是我想到的: public class CreateInstance { private static final AWSCredentials AWS_CREDENTIALS; static { // Your accesskey
public class CreateInstance
{
private static final AWSCredentials AWS_CREDENTIALS;
static {
// Your accesskey and secretkey
AWS_CREDENTIALS = new BasicAWSCredentials(
"My ID",
"My secret"
);
}
public static Integer getInstanceStatus(String instanceId, AmazonEC2 ec2) {
DescribeInstancesRequest describeInstanceRequest = new DescribeInstancesRequest().withInstanceIds(instanceId);
DescribeInstancesResult describeInstanceResult = ec2.describeInstances(describeInstanceRequest);
InstanceState state = describeInstanceResult.getReservations().get(0).getInstances().get(0).getState();
return state.getCode();
}
public static void main(String[] args) {
// Set up the amazon ec2 client
AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(AWS_CREDENTIALS))
.withRegion(Regions.AP_SOUTH_1)
.build();
// Launch an Amazon EC2 Instance
RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId("ami-009110a2bf8d7dd0a")
.withInstanceType("t2.micro") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
.withMinCount(1)
.withMaxCount(1)
.withKeyName("prakhar")
.withNetworkInterfaces(new InstanceNetworkInterfaceSpecification()
.withAssociatePublicIpAddress(true)
.withDeviceIndex(0));
RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest);
Instance instance = runInstancesResult.getReservation().getInstances().get(0);
String instanceId = instance.getInstanceId();
//String Id = instanceId;
System.out.println("EC2 Instance Id: " + instanceId);
// Setting up the tags for the instance
CreateTagsRequest createTagsRequest = new CreateTagsRequest()
.withResources(instance.getInstanceId())
.withTags(new Tag("Name", "prakhardemo"));
ec2Client.createTags(createTagsRequest);
// Starting the Instance
StartInstancesRequest startInstancesRequest = new StartInstancesRequest().withInstanceIds(instanceId);
ec2Client.startInstances(startInstancesRequest);
//wait until its in running state
Integer instanceState = -1;
while(instanceState != 16) { //Loop until the instance is in the "running" state.
instanceState = getInstanceStatus(instanceId, ec2Client);
try {
Thread.sleep(5000);
} catch(InterruptedException e) {}
}
System.out.println("your created instance is now in running state !");
}
}
您可以使用
在AmazonEC2中启动实例时,您可以选择将用户数据传递给实例,该实例可用于执行常见的自动配置任务,甚至在实例启动后运行脚本
按如下方式更改代码:
RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId("ami-009110a2bf8d7dd0a")
.withInstanceType("t2.micro") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
.withMinCount(1)
.withMaxCount(1)
.withKeyName("prakhar")
.withUserData(getUserDataScript())
.withNetworkInterfaces(new InstanceNetworkInterfaceSpecification()
.withAssociatePublicIpAddress(true)
.withDeviceIndex(0));
private static String getUserDataScript(){
ArrayList<String> lines = new ArrayList<String>();
# Open and Read Your File into Lines
String str = new String(Base64.encodeBase64(join(lines, "\n").getBytes()));
return str;
}
其中getUserDataScript()
可以如下所示:
RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId("ami-009110a2bf8d7dd0a")
.withInstanceType("t2.micro") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
.withMinCount(1)
.withMaxCount(1)
.withKeyName("prakhar")
.withUserData(getUserDataScript())
.withNetworkInterfaces(new InstanceNetworkInterfaceSpecification()
.withAssociatePublicIpAddress(true)
.withDeviceIndex(0));
private static String getUserDataScript(){
ArrayList<String> lines = new ArrayList<String>();
# Open and Read Your File into Lines
String str = new String(Base64.encodeBase64(join(lines, "\n").getBytes()));
return str;
}
私有静态字符串getUserDataScript(){
ArrayList行=新的ArrayList();
#打开并将文件读入行中
String str=新字符串(Base64.encodeBase64(join(line,“\n”).getBytes());
返回str;
}
可能会有帮助。