2016-08-17 8 views
0

새로운 사용자가 도착할 때마다 ec2 인스턴스를 만들고 싶습니다. 이를 위해 서블릿 클래스를 만들었습니다. 사용자가 도착하면 새로운 사용자인지 아닌지 DB를 확인한 다음 새로 작성한 다음 인스턴스를 생성하고 해당 사용자의 IP를 다시 보냅니다. 사용자가이 서블릿에 하나씩 HTTP 요청을 보내면 IP가 올바르게 수신됩니다. 하지만 HTTP 호출을 병렬로 보낼 때 (user1은 tab1에서 요청을 보내고 user2는 user1 HTTP 호출로부터 응답을 받기 전에 tab2에서 요청을 동시에 보냅니다). 내가 이럴 때 오류가있어. (400), 오류 코드 : InvalidInstanceID.NotFound, 요청 ID : e18a9eaa-cb1b-4130-a3ee, 상태 코드 AmazonEC2 : 때때로 사용자 1은AWS EC2 인스턴스 : 여러 인스턴스 시작

는 "인스턴스 ID가 '내가-0b79495934c3b5459이'(서비스가 존재하지 않는다고 말했다 -bf1b19fa184c) "

그리고 user2가 응답으로 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; 
    } 
} 

답변

2

(가) documentation에 따르면

성공적으로 RunInstances 명령을 실행 한 다음 즉시 이 RunInstances의 응답에 제공된 인스턴스 ID를 사용하여 다른 명령을 실행하면

", 그것은 할 수있다 InvalidInstanceID.NotFound 오류를 반환합니다. 인스턴스가 이 아닌 것을 의미하지 않습니다. 영향을받을 수있는 특정 명령은 다음과 같습니다. DescribeInstances : 인스턴스의 실제 상태를 확인하려면를 실행하십시오.이 명령은 지수 적 백 오프 알고리즘을 사용합니다. TerminateInstances : 인스턴스의 상태를 확인하려면 먼저 지수 백 오프 알고리즘을 사용하여 DescribeInstances 명령을 실행하십시오.