새로운 사용자가 도착할 때마다 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;
}
}