docs: public Cloud resize() throws Exception {
  
      AmazonEC2Client ec2 = new AmazonEC2Client(new PersistS3.H2OAWSCredentialsProviderChain());
      ec2.setEndpoint("ec2." + region + ".amazonaws.com");
      DescribeInstancesResult describeInstancesResult = ec2.describeInstances();
      List<Reservation> reservations = describeInstancesResult.getReservations();
      List<Instance> instances = new ArrayList<Instance>();
  
      for( Reservation reservation : reservations ) {
        for( Instance instance : reservation.getInstances() ) {
          String ip = ip(instance);
          if( ip != null ) {
            String name = null;
            if( instance.getTags().size() > 0 )
              name = instance.getTags().get(0).getValue();
            if( NAME.equals(name) )
              instances.add(instance);
          }
        }
      }
      System.out.println("Found " + instances.size() + " EC2 instances for user " + USER);
  
      if( instances.size() > boxes ) {
        for( int i = 0; i < instances.size() - boxes; i++ ) {
          // TODO terminate?
        }
      } else if( instances.size() < boxes ) {
        int launchCount = boxes - instances.size();
        System.out.println("Creating " + launchCount + " EC2 instances.");
        if( confirm ) {
          System.out.println("Please confirm [y/n]");
          String s = Utils.readConsole();
          if( s == null || !s.equalsIgnoreCase("y") )
            throw new Exception("Aborted");
        }
  
        CreatePlacementGroupRequest group = new CreatePlacementGroupRequest();
        group.withGroupName(USER);
        group.withStrategy(PlacementStrategy.Cluster);
        try {
          ec2.createPlacementGroup(group);
        } catch( AmazonServiceException ex ) {
          if( !"InvalidPlacementGroup.Duplicate".equals(ex.getErrorCode()) )
            throw ex;
        }
  
        RunInstancesRequest run = new RunInstancesRequest();
        run.withInstanceType(type);
        run.withImageId(image);
        run.withMinCount(launchCount).withMaxCount(launchCount);
        run.withSecurityGroupIds(securityGroup);
        Placement placement = new Placement();
        placement.setGroupName(USER);
        run.withPlacement(placement);
        BlockDeviceMapping map = new BlockDeviceMapping();
        map.setDeviceName("/dev/sdb");
        map.setVirtualName("ephemeral0");
        run.withBlockDeviceMappings(map);
        run.withUserData(new String(Base64.encodeBase64(cloudConfig.getBytes())));
  
        RunInstancesResult runRes = ec2.runInstances(run);
        ArrayList<String> ids = new ArrayList<String>();
        for( Instance instance : runRes.getReservation().getInstances() )
          ids.add(instance.getInstanceId());
  
        List<Instance> created = wait(ec2, ids);
        System.out.println("Created " + created.size() + " EC2 instances.");
        instances.addAll(created);
      }
  
      String[] pub = new String[boxes];
      String[] prv = new String[boxes];
      for( int i = 0; i < boxes; i++ ) {
        pub[i] = instances.get(i).getPublicIpAddress();
        prv[i] = instances.get(i).getPrivateIpAddress();
      }
      System.out.println("EC2 public IPs: " + Utils.join(' ', pub));
      System.out.println("EC2 private IPs: " + Utils.join(' ', prv));
      Cloud cloud = new Cloud();
      cloud.publicIPs.addAll(Arrays.asList(pub));
      cloud.privateIPs.addAll(Arrays.asList(prv));
      return cloud;
    }