2016-08-17 3 views
0

Ich möchte ec2-Instanzen erstellen, wenn der neue Benutzer eintrifft. Ich habe eine Servlet-Klasse dafür erstellt. Wenn der Benutzer ankommt, prüfe ich die DB, die neu ist oder nicht, wenn neu, dann erzeuge die Instanz und sende ihre IP zurück. Wenn ich eine HTTP-Anfrage an dieses Servlet eins nach dem anderen für Benutzer sende, bekomme ich die IP korrekt. Aber wenn ich HTTP Call parallel sende (für user1 send request in tab1, für user2 send request in tab2 simultan, bevor ich eine Antwort von user1 HTTP-Aufruf bekomme). Wenn ich das mache, habe ich Fehler bekommen. Manchmal sagte benutzer1AWS EC2-Instanzen: Mehrere Instanzen starten

„Die Instanz-ID 'i-0b79495934c3b5459' existiert nicht (Service: AmazonEC2; Statuscode: 400; Fehlercode: InvalidInstanceID.NotFound; Anfrage-ID: e18a9eaa-CB1b-4130-a3ee -bf1b19fa184c) "

und Benutzer2 IP als Antwort senden. Bitte hilf mir Was ist das Problem und wie kann ich das beheben? Dies ist die Servlet-Klasse, die ich erstellt habe.

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

Antwort

2

Nach dem documentation:

„Wenn Sie erfolgreich die RunInstances Befehl ausführen, und dann sofort einen anderen Befehl mit der Instanz-ID ausführen, die in der Antwort von RunInstances vorgesehen war, kann es Gibt einen InvalidInstanceID.NotFound-Fehler zurück Dies bedeutet nicht, dass die Instanz nicht existiert Einige bestimmte Befehle, die betroffen sein können, sind: DescribeInstances: Führen Sieaus, um den tatsächlichen Status der Instanz zu bestätigenDieser Befehl verwendet einen exponentiellen Backoff-Algorithmus. TerminateInstances: Um den Status der Instanz zu bestätigen, führen Sie zuerst den Befehl DescribeInstances unter Verwendung eines exponentiellen Backoff-Algorithmus aus. "

Verwandte Themen