private void waitOnInstances(List<VPNEndpoint> vpnEndpoints) throws Exception {
    int timeoutInMinutes = 5; // TODO: Remove hardcoding and put in config
    boolean done = false;
    long startTime = System.currentTimeMillis();
    long endTime = startTime + (timeoutInMinutes * 60 * 1000);


    LOG.info(String.format("Waiting on EC2 VPN instances to launch..  This may take up to %d minutes", timeoutInMinutes));
    while (!done && (System.currentTimeMillis() < endTime)) {

      done = true;
      for (VPNEndpoint vpnEndpoint : vpnEndpoints) {
        try {
          ec2Client.setEndpoint(vpnEndpoint.getRegion().getEndpoint());
          String instanceId = vpnEndpoint.getInstance().getInstanceId();
          DescribeInstancesRequest descInstancesReq = new DescribeInstancesRequest().withInstanceIds(instanceId);
          List<Reservation> reservations = ec2Client.describeInstances(descInstancesReq).getReservations();
          Instance instance = reservations.get(0).getInstances().get(0);

          LOG.debug("Waiting on instances: " + instance.getInstanceId() + " state: " + instance.getState());
          if (!instance.getState().getName().equals("running")) {
            done = false;
          }
        } catch (Exception e) {
          LOG.debug("Ignoring exception: " + e.getMessage());
          e.printStackTrace();
        }
      }
      if (!done) {
        Thread.sleep(15 * 1000);
      }
    }

    LOG.debug("startTime: " + startTime);
    LOG.debug("endTime: " + endTime);
    LOG.debug("now: " + System.currentTimeMillis());

  }