2016-08-17 3 views
0

Я хочу создать экземпляры ec2, когда придет новый пользователь. Для этого я создал класс сервлета. Когда пользователь приходит, я проверяю DB, который является пользователем нового или нет, если новый затем создает экземпляр и отправляет обратно свой IP-адрес. Когда я отправляю HTTP-запрос на этот сервлет один за другим для пользователей, я правильно получаю IP-адрес. Но когда я отправляю HTTP-вызов в параллель (для запроса отправки user1 в tab1, для отправки запроса user2 в tab2 одновременно, прежде чем получать ответ от HTTP-вызова user1). Когда я делаю это, я получил ошибку. Иногда user1 сказалAWS EC2 Экземпляры: запуск нескольких экземпляров

«Идентификатор экземпляра 'я-0b79495934c3b5459' не существует (Service: AmazonEC2; код Статус: 400; Код ошибки: InvalidInstanceID.NotFound; Request ID: e18a9eaa-cb1b-4130-a3ee -bf1b19fa184c) "

И пользователь2 посылает IP в ответ. Пожалуйста, помогите мне. В чем проблема и как это решить. Это класс сервлета, который я создал.

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

ответ

2

Согласно documentation:

«Если вы успешно выполнить команду RunInstances, а затем немедленно выполнить другую команду, используя идентификатор экземпляра, который был содержится в ответе RunInstances, он может return Ошибка InvalidInstanceID.NotFound.Это не означает, что экземпляр не существует. Некоторые конкретные команды, которые могут быть затронуты, следующие: DescribeInstances: для подтверждения фактического состояния экземпляра запустите эта команда использует алгоритм экспоненциального отклика. TerminateInstances: для подтверждения состояния экземпляра сначала выполните команду команды DescribeInstances с использованием алгоритма экспоненциального отклика. "

Смежные вопросы