2016-08-17 28 views
0

新しいユーザーが到着するたびにec2インスタンスを作成したいと考えています。私はこれを行うサーブレットクラスを作成しました。ユーザーが到着すると、新しいユーザーであるDBをチェックし、新規ユーザーであればインスタンスを作成し、そのユーザーのIPを返送します。ユーザーがこのサーブレットにhttpリクエストを1つずつ送信すると、IPが正しく取得されます。しかし、私は並列にHTTP呼び出しを送信するとき(user1 HTTPリクエストからの応答を得る前に、user1がtab1でリクエストを送信し、user2がtab2でリクエストを送信する)。私はこれを行うときにエラーが発生します。ステータスコード; AmazonEC2:400;エラーコード:InvalidInstanceID.NotFound; 要求ID:e18a9eaa-cb1b-4130-a3ee時々、user1が、「インスタンスID 'I-0b79495934c3b5459は、' サービス(存在しないAWS EC2インスタンス:複数のインスタンスを起動

言いました-bf1b19fa184c) "

そして、user2が応答してIPを送信します。親切に私を助けてください何が問題であり、これを解決する方法です。 これは私が作成したサーブレットクラスです。 documentationによると

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

「あなたは成功し、それがかもしれない、 はRunInstancesの応答で提供されたインスタンスIDを使用して別のコマンドを実行し、すぐにRunInstancesコマンドを実行し、その後、 場合 InvalidInstanceID.NotFoundエラー。 が存在しないことを意味しません。影響を受ける特定のコマンドは次のとおりです。 DescribeInstances:インスタンスの実際の状態を確認するには、を実行します。指数バックオフアルゴリズムを使用してこのコマンドを実行します。 TerminateInstances:インスタンスの状態を確認するには、指数バックオフアルゴリズムを使用して DescribeInstancesコマンドを実行してください。

関連する問題