为 AEM as a Cloud Service 配置高级联网功能

本文意在介绍 AEM as a Cloud Service 中的各种高级联网功能,包括 VPN 的自助预配、非标准端口以及专用出口 IP 地址。

信息提示

您还可以在此位置找到一系列旨在引导您了解各个高级联网选项的文章。

概述

AEM as a Cloud Service 提供了多种高级联网功能,客户可以使用 Cloud Manager API 配置这些功能。这些功能包括:

此文章详细介绍了上述各个选项,包括如何对它们进行配置。作为常规配置策略,在程序级别调用 /networkInfrastructures API 端点,以声明所需的高级联网类型,接着调用每个环境的 /advancedNetworking 端点,以启用基础设施并配置特定于环境的参数。要了解每个正式语法以及请求和响应示例,请参考 Cloud Manager API 文档中的相应端点。

一个程序可以预配一个高级联网变体。在灵活端口出口和专用出口 IP 地址之间进行选择时,如果无需特定 IP 地址,则建议您选择灵活端口出口,因为 Adobe 可以优化灵活端口出口流量的性能。

信息提示

高级联网对沙盒程序不可用。
此外,环境必须升级到 AEM 版本 5958 或更高版本。

注意

对于已经预配了旧版专用出口技术的客户,在需要配置这些选项之一时,不应这样操作,否则网站连接可能会受到影响。如需帮助,请与 Adobe 支持部门联系。

灵活端口出口

此高级联网功能允许您对 AEM as a Cloud Service 进行配置,通过默认打开的 HTTP(端口 80)和 HTTPS(端口 443)以外的端口来传入流量。

注意事项

如果流量不依赖于专用出口就可以实现较高的吞吐量,因而您不需要 VPN 和专用出口 IP 地址,那么推荐选择灵活端口出口。

配置

每个程序调用一次 POST /program/<programId>/networkInfrastructures 端点,只需传递 kind 参数和区域的 flexiblePortEgress 值。端点使用 network_id 以及包括状态在内的其他信息进行响应。参数的完整集合和精确语法,以及诸如以后无法更改的参数等重要信息, 可在API文档中引用。

在调用后,通常需要大约 15 分钟来预配联网基础设施。对 Cloud Manager 的网络基础设施 GET 端点 的调用将显示状态“就绪”。

如果整个程序的灵活端口出口配置已就绪,则必须对每个环境调用 PUT /program/<program_id>/environment/<environment_id>/advancedNetworking 端点,以在环境级别启用联网,并可以选择声明任何端口转发规则。可以根据各个环境来配置参数以提供灵活性。

应为 80/443 以外的任何目标端口说明端口转发规则,但应仅在不使用 http 或 https 协议的情况下,通过指定目标主机集(名称或 IP 以及端口)来进行。对于每个目标主机,必须将指向的目标端口映射到 30000 到 30999 之间的端口。

API 应在几秒内响应,指示更新的状态,然后在大约 10 分钟后,端点的 GET 方法应指示高级联网已启用。

更新

程序级别的配置可以通过调用 PUT /api/program/<program_id>/network/<network_id> 端点来更新,并将在几分钟内生效。

注意

“kind”参数(flexiblePortEgressdedicatedEgressIPVPN)无法修改。如需帮助,请联系客户支持,说明已经创建的内容以及进行更改的原因。

每个环境的端口转发规则同样可以通过调用 PUT /program/{programId}/environment/{environmentId}/advancedNetworking 端点进行更新,确保包括完整的配置参数集而不是其子集。

禁用灵活端口出口

要​禁用​特定环境的灵活端口出口,请调用 DELETE [/program/{programId}/environment/{environmentId}/advancedNetworking] ()

有关 API 的详细信息,请参阅 Cloud Manager API 文档

流量路由

对于流向 80 或 443 端口以外端口的 http 或 https 流量,应使用以下主机和端口环境变量来配置代理。

  • 对于 HTTP:AEM_PROXY_HOST/AEM_HTTP_PROXY_PORT (在 AEM 版本 6094 之前,默认为 proxy.tunnel:3128
  • 对于 HTTPS:AEM_PROXY_HOST/AEM_HTTPS_PROXY_PORT (在 AEM 版本 6094 之前,默认为 proxy.tunnel:3128

例如,以下是发送请求到 www.example.com:8443 的示例代码:

String url = "www.example.com:8443"
String proxyHost = System.getenv().getOrDefault("AEM_PROXY_HOST", "proxy.tunnel");
int proxyPort = Integer.parseInt(System.getenv().getOrDefault("AEM_HTTPS_PROXY_PORT", "3128"));
HttpClient client = HttpClient.newBuilder()
      .proxy(ProxySelector.of(new InetSocketAddress(proxyHost, proxyPort)))
      .build();

HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

如果使用非标准 Java 联网库,请使用以上属性为所有流量配置代理。

如果非 http/https 流量流经 portForwards 参数中声明的端口,应该引用名为 AEM_PROXY_HOST 的属性以及映射的端口。例如:

DriverManager.getConnection("jdbc:mysql://" + System.getenv("AEM_PROXY_HOST") + ":53306/test");

下表描述了流量路由:

流量 目标条件 端口 连接 外部目标示例
Http 或 https 协议 标准 http/https 流量 80 或 443 允许
非标准流量(在 80 或 443 以外的端口上),这些流量流经使用以下环境变量和代理端口号配置的 http 代理。不要在 Cloud Manager API 调用的 portForwards 参数中声明目标端口:
  • AEM_PROXY_HOST(在 AEM 版本 6094 之前,默认为“proxy.tunnel”)
  • AEM_HTTPS_PROXY_PORT(在 AEM 版本 6094 之前,默认为端口 3128)
80 或 443 以外的端口 允许 example.com:8443
不使用 http 代理的非标准流量(位于端口 80 或 443 之外的其他端口) 80 或 443 以外的端口 已阻止
非 http 或非 https 客户端使用在 portForwards API 参数中声明的 portOrig 连接到 AEM_PROXY_HOST 环境变量。 任意 允许 mysql.example.com:3306
其他所有条件 任意 已阻止 db.example.com:5555

Apache/Dispatcher 配置

AEM Cloud Service Apache/Dispatcher 层的 mod_proxy 指令可以使用上述属性进行配置。

ProxyRemote "http://example.com:8080" "http://${AEM_PROXY_HOST}:3128"
ProxyPass "/somepath" "http://example.com:8080"
ProxyPassReverse "/somepath" "http://example.com:8080"
SSLProxyEngine on //needed for https backends

ProxyRemote "https://example.com:8443" "http://${AEM_PROXY_HOST}:3128"
ProxyPass "/somepath" "https://example.com:8443"
ProxyPassReverse "/somepath" "https://example.com:8443"

专用出口 IP 地址

注意

如果您已在 2021 年 9 月发布 (10/6/21) 之前预配了专用出口 IP,请参阅旧版专用出口地址客户

好处

在与 SaaS 供应商(例如 CRM 供应商)集成时,或者对于在 AEM as a Cloud Service 之外提供 IP 地址允许列表的其他集成,此专用 IP 地址可以增强安全性。通过将专用 IP 地址添加到允许列表,可以确保只有来自客户的 AEM Cloud Service 的流量允许流向外部服务。这是在允许的其他所有 IP 之外的流量。

未启用专用 IP 地址功能时,传出 AEM as a Cloud Service 的流量会流经与其他客户共享的一组 IP。

配置

信息提示

无法对专用出口 IP 地址使用 Splunk 转发功能。

专用出口 IP 地址的配置方法与灵活端口出口相同。

主要差别在于,该流量始终从专用的唯一 IP 地址传出。要查找该 IP,请使用 DNS 解析器来确定与 p{PROGRAM_ID}.external.adobeaemcloud.com 关联的 IP 地址。该 IP 地址不应改变,但如果未来需要改变,则会提供高级通知。

除了 PUT /program/<program_id>/environment/<environment_id>/advancedNetworking 端点中的灵活端口出口支持的路由规则之外,专用出口 IP 地址还支持 nonProxyHosts 参数。这使得您可以声明一组主机,并且这组主机应通过共享 IP 地址范围而不是专用 IP 进行路由,由于通过共享 IP 传出的流量可能会进一步进行优化,此功能可能会很有用。nonProxyHost URL 可能会遵循 example.com*.example.com 的模式,这种情况下仅支持在域的开头使用通配符。

在灵活端口出口和专用出口 IP 地址之间进行选择时,如果无需特定 IP 地址,客户应选择灵活端口出口,因为 Adobe 可以优化灵活端口出口流量的性能。

禁用专用出口 IP 地址

为了​禁用​来自特定环境的专用出口 IP 地址,调用 DELETE [/program/{programId}/environment/{environmentId}/advancedNetworking] ()

有关 API 的详细信息,请参阅 Cloud Manager API 文档

流量路由

Http 或 https 流量将通过预配置的代理,前提是它们使用标准 Java 系统属性进行代理配置。

如果非 http/https 流量流经 portForwards 参数中声明的端口,应该引用名为 AEM_PROXY_HOST 的属性以及映射的端口。例如:

DriverManager.getConnection("jdbc:mysql://" + System.getenv("AEM_PROXY_HOST") + ":53306/test");
流量 目标条件 端口 连接 外部目标示例
Http 或 https 协议 流向 Azure 或 Adobe 服务的流量 任意 通过共享集群 IP(而非专用 IP) adobe.io
api.windows.net
主机匹配 nonProxyHosts 参数 80 或 443 通过共享集群 IP
主机匹配 nonProxyHosts 参数 80 或 443 以外的端口 已阻止
通过 http 代理配置,默认情况下使用标准 Java HTTP 客户端库为 http/https 流量进行配置。 任意 通过专用出口 IP
忽略 http 代理配置(例如,如果明确从标准 Java HTTP 客户端库中删除,或者如果使用的 Java 库忽略标准代理配置) 80 或 443 通过共享集群 IP
忽略 http 代理配置(例如,如果明确从标准 Java HTTP 客户端库中删除,或者如果使用的 Java 库忽略标准代理配置) 80 或 443 以外的端口 已阻止
非 http 或非 https 客户端使用在 portForwards API 参数中声明的 portOrig 连接到 AEM_PROXY_HOST 环境变量 任意 通过专用出口 IP mysql.example.com:3306
其他所有条件 已阻止

功能用法

该功能与产生传出流量的 Java 代码或库兼容,前提是它们的代理配置使用了标准 Java 系统属性。实际上,这应该包括了大多数常用库。

下面是代码示例:

public JSONObject getJsonObject(String relativePath, String queryString) throws IOException, JSONException {
  String relativeUri = queryString.isEmpty() ? relativePath : (relativePath + '?' + queryString);
  URL finalUrl = endpointUri.resolve(relativeUri).toURL();
  URLConnection connection = finalUrl.openConnection();
  connection.addRequestProperty("Accept", "application/json");
  connection.addRequestProperty("X-API-KEY", apiKey);

  try (InputStream responseStream = connection.getInputStream(); Reader responseReader = new BufferedReader(new InputStreamReader(responseStream, Charsets.UTF_8))) {
    return new JSONObject(new JSONTokener(responseReader));
  }
}

一些库需要明确配置,以便为代理配置使用标准 Java 系统属性。

使用 Apache HttpClient 的示例,其中需要明确调用
HttpClientBuilder.useSystemProperties() 或使用
HttpClients.createSystem()

public JSONObject getJsonObject(String relativePath, String queryString) throws IOException, JSONException {
  String relativeUri = queryString.isEmpty() ? relativePath : (relativePath + '?' + queryString);
  URL finalUrl = endpointUri.resolve(relativeUri).toURL();

  HttpClient httpClient = HttpClientBuilder.create().useSystemProperties().build();
  HttpGet request = new HttpGet(finalUrl.toURI());
  request.setHeader("Accept", "application/json");
  request.setHeader("X-API-KEY", apiKey);
  HttpResponse response = httpClient.execute(request);
  String result = EntityUtils.toString(response.getEntity());
}

相同的专用 IP 应用到客户在其 Adobe 组织中的所有程序,并用于其各个程序的所有环境。它适用于创作和发布服务。

调试注意事项

为了验证该流量是否确实在预期的专用 IP 地址上传出,请查看目标服务中的日志(如果可用)。否则,调用 https://ifconfig.me/IP 等调试服务可能会有帮助,调试服务会返回调用 IP 地址。

旧版专用出口地址客户

如果在 2021 年 9 月 30 日之前已为您配置了专用出口 IP,则您的专用出口 IP 功能仅支持 HTTP 和 HTTPS 端口。这包括 HTTP/1.1 以及加密的 HTTP/2。此外,一个专用出口端点只能通过端口80/443上的HTTP/HTTPS与任何目标通信。

虚拟专用网络 (VPN)

利用 VPN 可从创作、发布或预览服务连接到内部部署基础设施或数据中心。例如,用于访问数据库。

它还允许连接到 SaaS 供应商(例如支持 VPN 的 CRM 供应商),或者允许从公司网络连接到 AEM as a Cloud Service 的创作、预览或发布服务。

支持大部分采用 IPSec 技术的 VPN 设备。请根据 RouteBased 配置说明​列的信息,查阅此页面中的设备列表。按表中所述配置设备。

常规注意事项

  • 仅限于支持单个 VPN 连接
  • 无法在 VPN 连接上使用 Splunk 转发功能。

创建

每个程序调用一次 POST /program/<programId>/networkInfrastructures 端点,传入配置信息的负载,包括:kind 参数的“VPN”值、区域、地址空间(CIDR 列表,请注意此项以后不可修改)、DNS 解析器(用于解析客户网络中的名称)以及 VPN 连接信息(例如网关配置、共享 VPN 密钥以及 IP 安全性策略)。端点使用 network_id 以及包括状态在内的其他信息进行响应。要查看完整的参数集和确切的语法,可参阅 API 文档

在调用后,通常需要 45 到 60 分钟来预配联网基础设施。可以调用 API 的 GET 方法以返回当前状态,这最终会从 creating 翻转到 ready。请参考 API 文档来了解所有状态。

如果整个程序的 VPN 配置已就绪,则必须对每个环境调用 PUT /program/<program_id>/environment/<environment_id>/advancedNetworking 端点,以在环境级别启用联网并声明任何端口转发规则。可以根据各个环境来配置参数以提供灵活性。

有关详细信息,请参阅 API 文档

对于应通过 VPN 路由的任何非 http/https TCP 流量,应通过指定目标主机集(名称或 IP 以及端口)来声明端口转发规则。对于每个目标主机,必须将指向的目标端口映射到 30000 到 30999 之间的端口,该值必须在程序的所有环境中唯一。客户还可以在 nonProxyHosts 参数中列出一组 URL,这会声明其流量应绕开 VPN 路由的 URL,改为通过共享 IP 范围进行传输。它遵循 example.com*.example.com 的模式,这种情况下仅支持在域的开头使用通配符。

API 应在几秒钟内响应,指示状态 updating,然后在大约 10 分钟后,对 Cloud Manager 环境 GET 端点的调用将显示状态 ready,指示对环境的更新已应用。

请注意,即使没有环境流量路由规则(托管或绕过),仍必须调用 PUT /program/<program_id>/environment/<environment_id>/advancedNetworking,只不过在调用时使用空负载。

更新 VPN

程序级别的 VPN 可以通过调用 PUT /api/program/<program_id>/network/<network_id> 端点来更新。

请注意,在初始预配 VPN 之后,无法更改地址空间。如果必须要更改,请联系客户支持。此外,无法修改 kind 参数(flexiblePortEgressdedicatedEgressIPVPN)。如需帮助,请联系客户支持,说明已经创建的内容以及进行更改的原因。

每个环境的路由规则同样可以通过调用 PUT /program/{programId}/environment/{environmentId}/advancedNetworking 端点进行更新,确保包括完整的配置参数集而不是其子集。环境更新的应用通常需要 5 到 10 分钟。

禁用 VPN

要禁用特定环境的 VPN,请调用 DELETE /program/{programId}/environment/{environmentId}/advancedNetworking。有关详细信息,请参阅 API 文档

流量路由

下表描述了流量路由。

流量 目标条件 端口 连接 外部目标示例
Http 或 https 协议 流向 Azure 或 Adobe 服务的流量 任意 通过共享集群 IP(而非专用 IP) adobe.io
api.windows.net
主机匹配 nonProxyHosts 参数 80 或 443 通过共享集群 IP
主机匹配 nonProxyHosts 参数 80 或 443 以外的端口 已阻止
如果 IP 处于 VPN 网关地址空间范围内,并且通过 http 代理配置传输流量(默认情况下使用标准 Java HTTP 客户端库为 http/https 流量进行配置) 任意 通过 VPN 10.0.0.1:443这也可以是主机名。
如果 IP 没有处于 VPN 网关地址空间范围内,并且通过 http 代理配置传输流量(默认情况下使用标准 Java HTTP 客户端库为 http/https 流量进行配置) 任意 通过专用出口 IP
忽略 http 代理配置(例如,如果明确从标准 Java HTTP 客户端库中删除,或者如果使用省略了标准代理配置的 Java 库) 80 或 443 通过共享集群 IP
忽略 http 代理配置(例如,如果明确从标准 Java HTTP 客户端库中删除,或者如果使用省略了标准代理配置的 Java 库) 80 或 443 以外的端口 已阻止
非 http 或非 https 如果 IP 处于 VPN 网关地址空间范围内,并且客户端使用在 portForwards API 参数中声明的 portOrig 连接到 AEM_PROXY_HOST 环境变量 任意 通过 VPN 10.0.0.1:3306这也可以是主机名。
如果 IP 没有处于 VPN 网关地址空间范围内,并且客户端使用在 portForwards API 参数中声明的 portOrig 连接到 AEM_PROXY_HOST 环境变量 任意 通过专用出口 IP
其他所有条件 任意 已阻止

对配置非常有用的域

下图直观地展示了在配置和开发时非常有用的一组域和关联 IP。该图下方的表进一步说明了这些域和 IP。

VPN 域配置

域模式 出口(自 AEM)含义 入口(至 AEM)含义
p{PROGRAM_ID}.external.adobeaemcloud.com 专用出口 IP 地址用于流向 Internet 的流量,而非通过专用网络的流量 来自 VPN 的连接将在 CDN 上显示为来自此 IP。要仅允许来自 VPN 的连接进入 AEM,请将 Cloud Manager 配置为仅允许此 IP 并阻止其他所有流量。有关详细信息,请参阅“将传入限制为 VPN 连接”。
p{PROGRAM_ID}-gateway.external.adobeaemcloud.com 不适用 AEM 侧 VPN 网关的 IP。客户的网络工程团队可以使用此项来仅允许源自特定 IP 地址的 VPN 连接进入其 VPN 网关。
p{PROGRAM_ID}.inner.adobeaemcloud.net 流量从 AEM 端的 VPN 流向客户端时使用的 IP。这可以列入客户配置的允许列表中,以确保只接受来自 AEM 的连接。 如果客户希望允许通过 VPN 访问 AEM,他们应该配置 CNAME DNS 条目以将其自定义域和/或 author-p{PROGRAM_ID}-e{ENVIRONMENT_ID}.adobeaemcloud.com 和/或 publish-p{PROGRAM_ID}-e{ENVIRONMENT_ID}.adobeaemcloud.com 映射到此项。

将传入限制为 VPN 连接

如果您希望只允许通过 VPN 访问 AEM,则可以在 Cloud Manager 中配置环境允许列表,这样可以只允许 p{PROGRAM_ID}.external.adobeaemcloud.com 定义的 IP 与环境通信。此操作与在 Cloud Manager 中定义其他任何基于 IP 的允许列表相同。

如果规则必须基于路径,则在 Dispatcher 级别使用标准 http 指令来拒绝或允许特定 IP。它们可以确保所需路径在 CDN 上不可缓存,因此请求始终将获取到来源。

Httpd 配置示例

Order deny,allow
Deny from all
Allow from 192.168.0.1
Header always set Cache-Control private

删除项目的网络基础架构

要​删除​项目的网络基础架构,请调用 DELETE /program/{program ID}/networkinfrastructure/{networkinfrastructureID}

注意

只有在所有环境都禁用其高级网络的情况下,删除操作才会删除基础架构。

高级联网类型之间的转换

可以按照以下过程在高级网络类型之间进行迁移:

  • 在所有环境中禁用高级网络
  • 删除高级网络基础架构
  • 使用正确的值重新创建高级网络基础架构
  • 启用环境级别高级网络
警告

此过程将导致在删除和重新创建之间停用高级网络服务

如果停机会对业务产生重大影响,请联系客户支持以寻求帮助,并说明已创建的内容和更改的原因。

在此页面上