【问题标题】:How to execute a shell script on EC-2 instance using java?如何使用 java 在 EC-2 实例上执行 shell 脚本?
【发布时间】:2019-09-03 22:01:48
【问题描述】:

我需要编写一个 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 !");
    }
}

【问题讨论】:

  • This 可能会有帮助。

标签: amazon-web-services amazon-ec2 aws-sdk


【解决方案1】:

您可以使用AWS EC2 User Data 执行此操作。

当您在 Amazon EC2 中启动实例时,您可以选择将用户数据传递给实例,这些数据可用于执行常见的自动化配置任务,甚至在实例启动后运行脚本。

如下修改你的代码:

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));

其中getUserDataScript()可以如下:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2020-12-23
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多