JClouds:在Google Compute Engine上定义防火墙规则

时间:2015-02-04 04:00:25

标签: google-compute-engine jclouds

我正在尝试使用JClouds在Google Compute Engine中创建实例。我无法正确设置防火墙规则,唯一打开的端口是22(默认端口)。

我在文档和示例中找不到任何内容。以下代码仅打开端口22。

如何打开其他端口,如80,5432等? 有没有办法打开所有端口?

    final String POLL_PERIOD_TWENTY_SECONDS = String.valueOf(SECONDS.toMillis(20));

    Properties overrides = new Properties();
    overrides.setProperty(ComputeServiceProperties.POLL_INITIAL_PERIOD, POLL_PERIOD_TWENTY_SECONDS);
    overrides.setProperty(ComputeServiceProperties.POLL_MAX_PERIOD, POLL_PERIOD_TWENTY_SECONDS);

    Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule(), new SLF4JLoggingModule());
    //Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule());

    ComputeServiceContext context = ContextBuilder.newBuilder("google-compute-engine")
            .credentials("valid email", "valid cert")
            .modules(modules)
            .overrides(overrides)
            .buildView(ComputeServiceContext.class);
    ComputeService computeService = context.getComputeService();

    Template template = computeService.templateBuilder()
            .locationId("asia-east1-a")
            .imageId("https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20150128")
            .hardwareId("https://www.googleapis.com/compute/v1/projects/MY-PROJECT/zones/asia-east1-a/machineTypes/f1-micro")
            .build();

// Those options are not working as expected
    // List<String> networks = new ArrayList<>();
    // networks.add("default");
    // template.getOptions().as(GoogleComputeEngineTemplateOptions.class).networks(networks);
    // template.getOptions().as(GoogleComputeEngineTemplateOptions.class).inboundPorts(5432,1,2,3);

    Set<? extends NodeMetadata> nodes = computeService.createNodesInGroup("m456", 1, template);

    for (NodeMetadata nodeMetadata : nodes) {
        String publicAddress = nodeMetadata.getPublicAddresses().iterator().next();
        //String privateAddress = nodeMetadata.getPrivateAddresses().iterator().next();
        String username = nodeMetadata.getCredentials().getUser();
        String password = nodeMetadata.getCredentials().getPassword();
        System.out.println(publicAddress);
        System.out.println(username);
        System.out.println(password);
    }

提前致谢。

3 个答案:

答案 0 :(得分:1)

尝试将完整的URI用于“默认”网络。例如:“https://www.googleapis.com/compute/v1/projects/xxx-project/global/networks/default

答案 1 :(得分:0)

根据JClouds主页中的available providers list,对GCE的支持为here。将它添加到项目后,您将拥有以下类:

  • org.jclouds.googlecomputeengine.domain.Firewall.Rule
  • org.jclouds.googlecomputeengine.domain.Firewall.Rule.Builder
  • org.jclouds.googlecomputeengine.domain.Network
  • org.jclouds.googlecomputeengine.domain.Instance.Tags

虽然我自己不是Java开发人员,但我敢打赌这就是你要求的。使用目标和实例标记,您可以仅将规则限制为某些实例。如果未使用目标targ,则规则中的端口将对应用规则的网络中的所有实例打开。希望这可以帮助。

答案 2 :(得分:-1)

Google Compute Engine项目有两个默认防火墙规则(在默认网络上),允许端口80和/或443上的入站连接(来自互联网)到具有的任何实例http-server 和/或 https-server 标记。可以在VM实例化时或之后定义所述标签。