Amazon web services 如何使用java在EC-2实例上执行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

我需要编写一个java程序在孟买地区创建一个AWS EC2实例。 在EC2实例处于就绪状态后,程序还应该能够在该实例上执行shell脚本。我不想在我的程序中硬编码脚本。程序应该读取一个外部脚本文件。我找不到一份关于如何做的文件

这就是我想到的:

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;
}
可能会有帮助。