Java AWS EC2实例:启动多个实例

Java AWS EC2实例:启动多个实例,java,amazon-web-services,servlets,amazon-ec2,aws-sdk,Java,Amazon Web Services,Servlets,Amazon Ec2,Aws Sdk,我想在新用户到达时创建ec2实例。为此,我创建了一个servlet类。当用户到达时,我检查数据库是否是用户新的,如果是新的,则创建实例并发回他/她的IP。当我为用户逐个向这个servlet发送http请求时,我正确地获得了IP。但当我并行发送HTTP调用时(对于tab1中的user1发送请求,对于tab2中的user2发送请求,在从user1 HTTP调用获得响应之前同时发送)。当我这样做的时候,我犯了一个错误。有时候用户1说 “实例ID‘i-0b79495934c3b5459’不存在(服务:

我想在新用户到达时创建ec2实例。为此,我创建了一个servlet类。当用户到达时,我检查数据库是否是用户新的,如果是新的,则创建实例并发回他/她的IP。当我为用户逐个向这个servlet发送http请求时,我正确地获得了IP。但当我并行发送HTTP调用时(对于tab1中的user1发送请求,对于tab2中的user2发送请求,在从user1 HTTP调用获得响应之前同时发送)。当我这样做的时候,我犯了一个错误。有时候用户1说

“实例ID‘i-0b79495934c3b5459’不存在(服务: AmazonEC2;状态代码:400;错误代码:InvalidInstanceID.NotFound; 请求ID:e18a9eaa-cb1b-4130-a3ee-bf1b19fa184c)

用户2发送IP作为响应。请帮助我什么是问题以及如何解决这个问题。 这是我创建的Servlet类

public class GateKeeperController extends HttpServlet {
    private static final long serialVersionUID = 1L;
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(credentials);
    AmazonEC2Client ec2Client = new AmazonEC2Client(awsCreds);
    RunInstancesRequest runInstancesRequest;
    RunInstancesResult runInstancesResult;
    Reservation reservation;
    Instance intstance;
    DescribeInstancesRequest describeInstanceRequest;
    DescribeInstancesResult describeInstanceResult;
    GatekeeperModal gateKeepermodal;
    String sourceAMI = null;
    String destinationAMI = null;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession s = request.getSession();
        String userID = (String) request.getParameter("userID");
        Double lattitude = Double.parseDouble((String) request.getParameter("lat"));
        Double lonitude = Double.parseDouble((String) request.getParameter("long"));
        if (userID != null) {
            Pair coordinates = new Pair(lattitude, lonitude);
            RegionSelection targetRegion = new RegionSelection();
            String regionResult = targetRegion.getRegion(coordinates);
            String instanceIP = null;
            gateKeepermodal = new GatekeeperModal();
            try {
                if (gateKeepermodal.checkUserIsNew(userID)) {
                    instanceIP = startInstance(userID, regionResult);
                    if (instanceIP != null) {
                        response.getWriter().write(instanceIP);
                    }
                } 
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {

        }
    }

    private String startInstance(String userID, String region) {
        String ami_id = new AMI().getAMI_ID(region);

        ec2Client.setEndpoint(region);
        runInstancesRequest = new RunInstancesRequest();
        runInstancesRequest.withImageId(ami_id).withInstanceType("t2.micro").withMinCount(1).withMaxCount(1)
                .withKeyName("GateKeeper_User").withSecurityGroups("GateKeeper User");
        runInstancesResult = ec2Client.runInstances(runInstancesRequest);
        reservation = runInstancesResult.getReservation();
        intstance = reservation.getInstances().get(0);
        String s1 = intstance.getState().getName();
        String s2 = InstanceStateName.Running.name();
        while (!s1.toLowerCase().equals(s2.toLowerCase())) {
            describeInstanceRequest = new DescribeInstancesRequest();
            describeInstanceRequest.withInstanceIds(intstance.getInstanceId());
            ec2Client.setEndpoint(region);
            describeInstanceResult = ec2Client.describeInstances(describeInstanceRequest);
            reservation = describeInstanceResult.getReservations().get(0);
            intstance = reservation.getInstances().get(0);
            s1 = intstance.getState().getName();
            s2 = InstanceStateName.Running.name();
        }
        GateKeeperUser user = new GateKeeperUser(userID, intstance.getInstanceId(), intstance.getPublicIpAddress(),
                region);
        Boolean result;
        try {
            result = gateKeepermodal.createUser(user);
            if (result) {
                return intstance.getPublicIpAddress();
            } else {
                return null;
            }

        } catch (SQLException e) {

        }
        return null;
    }
}
根据报告:

如果成功运行RunInstances命令,然后 立即使用创建的实例ID运行另一个命令 在RunInstances的响应中提供,它可能返回 InvalidInstanceID.NotFound错误。这并不意味着实例没有 不存在。可能受影响的某些特定命令包括: descripbeInstances:要确认实例的实际状态,请运行 此命令使用指数退避算法。 TerminateInstances:要确认实例的状态,请首先运行 使用指数退避算法的DescribeInstances命令。“

根据报告:

如果成功运行RunInstances命令,然后 立即使用创建的实例ID运行另一个命令 在RunInstances的响应中提供,它可能返回 InvalidInstanceID.NotFound错误。这并不意味着实例没有 不存在。可能受影响的某些特定命令包括: descripbeInstances:要确认实例的实际状态,请运行 此命令使用指数退避算法。 TerminateInstances:要确认实例的状态,请首先运行 使用指数退避算法的DescribeInstances命令。“