从私有实例连接到公共来源

本页面介绍了如何在开发流水线时从私有 Cloud Data Fusion 实例连接到软件即服务 (SaaS) 应用(例如 Salesforce)以及第三方云服务(例如 Amazon S3)。

本指南中使用了“出站流量”和“出站流量控制”这两个术语:

  • 出站流量是指通过公共互联网流出 Google Cloud 的网络流量。通常,当您创建对 Salesforce 等 SaaS 服务或 Amazon S3 等公有云服务进行读写的流水线时,会发生出站。

  • 出站流量控制使用代理虚拟机为出站流量定义保护措施,以允许流向一组预配置网域的出站流量成功,所有其他流量都将失败。它可为出站流量启用较高的安全边界,并可以防止来自私有实例的意外出站流量。

以下系统架构图展示了开发流水线时,私有 Cloud Data Fusion 实例如何与公共互联网连接:

私有实例架构图

在此场景中设计流水线时,Cloud Data Fusion 会通过 Cloud Data Fusion Preview 或 Wrangler 中的客户项目路由出站流量。此过程使用以下资源:

  • 自定义 VPC 网络路由:自定义 VPC 网络通过导入的自定义路由将流量路由到网关虚拟机,这些虚拟机使用 VPC 对等互连导出到租户项目 VPC。

  • 网关虚拟机:网关虚拟机通过公共互联网将来自 Google Cloud 的出站流量从 Cloud Data Fusion 租户项目路由到 SaaS 或第三方云。您可以在您的客户项目中管理此虚拟机。您可以使用内部负载平衡器 (ILB) 在高可用性 (HA) 环境中配置它。建议您将虚拟机重复用于同一 VPC 中的多个专用 Cloud Data Fusion 实例。

如需了解如何在设计和执行环境中设置出站流量控制,请参阅控制私有实例中的出站流量

准备工作

设置互联网连接

以下步骤介绍了如何在 Wrangler 中通过私有 Cloud Data Fusion 实例访问 Amazon S3 存储桶。当您在 Preview 或 Wrangler 中设计流水线时,相同的步骤也适用于通过公共互联网访问任何数据源。

在本指南中只使用了一个虚拟机,但对于任务关键型应用,我们建议您创建负载平衡虚拟机。如需了解详情,请参阅设置高可用性虚拟机

创建 NAT 网关

在 Cloud Data Fusion 私有实例所在的区域和 VPC 网络中,创建 Cloud NAT 网关

进入 Cloud NAT

创建网关虚拟机实例和防火墙规则

控制台

  1. 转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例。建议使用没有外部 IP 的虚拟机。

  3. 使用已通过私有 Cloud Data Fusion 实例设置网络对等互连的同一 VPC。如需详细了解在这种情况下的 VPC 网络对等互连,请参阅准备工作

  4. 为与 Cloud Data Fusion 实例位于同一网络中的实例启用 IP 转发

  5. 启动脚本字段中,输入以下脚本:

    #! /bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -j MASQUERADE
    echo net.ipv4.ip_forward=1 > /etc/sysctl.d/11-gce-network-security.conf
    iptables-save
    

    如需了解详情,请参阅运行启动脚本

    如需获取分配给 Cloud Data Fusion 实例的 IP 范围,请转到 Cloud Data Fusion 实例详情页面。

    暂存出站流量接口

gcloud

如需创建网关虚拟机和防火墙规则,请在 Google Cloud CLI 中运行以下脚本:

export CDF_PROJECT=CDF_PROJECT
export GATEWAY_VM=GATEWAY_VM_NAME
export ZONE=VM_ZONE
export SUBNET=SUBNET
export VPC_NETWORK=VPC_NETWORK
export COMPUTE_ENGINE_SA=COMPUTE_ENGINE_SA

gcloud beta compute --project=$CDF_PROJECT instances create $GATEWAY_VM --zone=$ZONE --machine-type=e2-medium --subnet=$SUBNET --network-tier=PREMIUM --metadata=startup-script=\#\!\ /bin/bash$'\n'echo\ 1\ \>\ /proc/sys/net/ipv4/ip_forward$'\n'iptables\ -t\ nat\ -A\ POSTROUTING\ -s\ 0.0.0.0/0\ -j\ MASQUERADE$'\n'echo\ net.ipv4.ip_forward=1\ \>\ /etc/sysctl.d/11-gce-network-security.conf$'\n'iptables-save  --can-ip-forward --no-address --maintenance-policy=MIGRATE --service-account=$COMPUTE_ENGINE_SA --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append --tags=http-server,https-server --image=debian-10-buster-v20210316 --image-project=debian-cloud --boot-disk-size=10GB --boot-disk-type=pd-balanced --boot-disk-device-name=$GATEWAY_VM --no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring --reservation-affinity=any

gcloud compute --project=$CDF_PROJECT firewall-rules create egress-allow-http --direction=INGRESS --priority=1000 --network=$VPC_NETWORK --action=ALLOW --rules=tcp:80 --source-ranges=CDF_IP_RANGE --target-tags=http-server

gcloud compute --project=$CDF_PROJECT firewall-rules create egress-allow-https --direction=INGRESS --priority=1000 --network=$VPC_NETWORK --action=ALLOW --rules=tcp:443 --source-ranges=CDF_IP_RANGE --target-tags=https-server

替换以下内容:

  • CDF_PROJECT:项目的唯一标识符
  • GATEWAY_VM:您要配置的虚拟机的名称
  • ZONE:您的虚拟机所在的可用区
  • SUBNET:子网
  • VPC_NETWORK:您的虚拟机的名称
  • COMPUTE_ENGINE_SA:您的 Compute Engine 服务帐号的名称
  • CDF_IP_RANGE:分配给 Cloud Data Fusion 实例的 IP 范围

使用共享 VPC

如果您使用共享 VPC 将您的私有 Cloud Data Fusion 实例连接到公共互联网上的来源,请在宿主项目(在其中通过租户项目设置 VPC 网络对等互连)中创建一个网关虚拟机。

创建自定义路由

创建自定义路由以连接到您创建的网关虚拟机实例

控制台

如需在 Google Cloud 控制台中创建路由,请参阅添加静态路由

配置路由时:

  • 优先级设置为大于或等于 1001。将目标设置为分配给 Cloud Data Fusion 实例的 IP 范围。
  • 使用与私有 Cloud Data Fusion 实例相同的项目和 VPC。
  • 确保您的 VPC 网络对等互连配置允许导出路由,以便 Cloud Data Fusion 租户项目 VPC 通过 VPC 网络对等互连导入此自定义路由。

gcloud

如需在 gcloud CLI 中创建路由,请运行以下命令:

export ROUTE=ROUTE
gcloud beta compute routes create $ROUTE --project=$CDF_PROJECT \
    --network=$VPC_NETWORK --priority=1001 \
    --destination-range=0.0.0.0/0 \
    --next-hop-instance=$GATEWAY_VM \
    --next-hop-instance-zone=$ZONE

替换以下内容:

  • ROUTE:自定义路由的名称。

验证设置

执行上述步骤后,验证您能否在预览版和 Wrangler 中访问 S3 存储桶服务(或其他 SaaS 或公有云服务)。

设置高可用性的网关

建议:对于任务关键型应用,我们建议您创建负载平衡虚拟机

创建健康检查的防火墙规则

创建防火墙规则以允许:

  • 所有来源范围内的端口 80 (HTTP) 和端口 443 (HTTPS)。
  • 来自健康检查探测器 IP 地址的 TCP、UDP 和 ICMP 流量。例如:130.211.0.0/22,35.191.0.0/16

控制台

创建防火墙规则,以允许所有来源范围和防火墙规则中的端口允许来自健康检查探测器 IP 地址(如 130.211.0.0/22,35.191.0.0/16)的 TCP、UDP 和 ICMP 流量。

请参阅创建健康检查

gcloud

为健康检查创建防火墙规则

export CDF_PROJECT=PROJECT_ID
export VPC_NETWORK=VPC_NETWORK

gcloud compute --project=$CDF_PROJECT firewall-rules create vpc-allow-http \
    --direction=INGRESS --priority=1000 \
    --network=$VPC_NETWORK \
    --action=ALLOW --rules=tcp:80 \
    --source-ranges=CDF_IP_RANGE \
    --target-tags=http-server

gcloud compute --project=$CDF_PROJECT firewall-rules create vpc-allow-https \
    --direction=INGRESS --priority=1000 --network=$VPC_NETWORK \
    --action=ALLOW --rules=tcp:443 --source-ranges=CDF_IP_RANGE \
    --target-tags=https-server

gcloud compute --project=$CDF_PROJECT firewall-rules create allow-health-checks \
    --network=$VPC_NETWORK \
    --action=allow --direction=ingress \
    --target-tags=allow-health-checks \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --rules=tcp,udp,icmp

替换以下内容:

  • PROJECT_ID:项目的可自定义唯一标识符。
  • VPC_NETWORK:您的 VPC 网络的名称。
  • CDF_IP_RANGE:分配给 Cloud Data Fusion 的 IP 地址范围。

创建网关虚拟机实例模板

控制台

在控制台中创建实例模板时:

  • 请在与 Cloud Data Fusion 实例相同的 VPC 中创建它。
  • 建议:使用具有专用 IP 地址的虚拟机。
  • 启用 HTTP/HTTPS 端口。
  • 启用 IP 转发
  • 启动脚本字段中,输入以下脚本:

    #! /bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -j MASQUERADE
    echo net.ipv4.ip_forward=1 > /etc/sysctl.d/11-gce-network-security.conf
    iptables-save
    

    如需了解详情,请参阅运行启动脚本

    如需获取分配给 Cloud Data Fusion 实例的 IP 范围,请转到 Cloud Data Fusion 实例详情页面。

gcloud

创建实例模板。

export TEMPLATE_NAME=TEMPLATE_NAME
export REGION=REGION
export SUBNET=SUBNET
export SERVICE_ACCOUNT=SERVICE_ACCOUNT

gcloud beta compute --project=$CDF_PROJECT instance-templates create $TEMPLATE_NAME \
--machine-type=e2-medium \
--subnet=projects/$CDF_PROJECT/regions/$REGION/subnetworks/$SUBNET \
--network-tier=PREMIUM --metadata=startup-script=sudo\ bash\ -c\ \"echo\ 1\ \>\ /proc/sys/net/ipv4/ip_forward\"$'\n'sudo\ iptables\ -t\ nat\ -A\ POSTROUTING\ -s\ 0.0.0.0/0\ -j\ MASQUERADE$'\n'sudo\ bash\ -c\ \"echo\ net.ipv4.ip_forward=1\ \>\ /etc/sysctl.d/11-gce-network-security.conf\"$'\n'sudo\ iptables-save \
--can-ip-forward --no-address --maintenance-policy=MIGRATE \
--service-account=$SERVICE_ACCOUNT \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--region=$REGION --tags=http-server,https-server,allow-health-checks \
--image=debian-10-buster-v20210316 \
--image-project=debian-cloud --boot-disk-size=10GB \
--boot-disk-type=pd-balanced \
--boot-disk-device-name=$TEMPLATE_NAME \
--no-shielded-secure-boot --no-shielded-vtpm \
--no-shielded-integrity-monitoring \
--reservation-affinity=any

创建健康检查

此网关虚拟机实例上没有任何服务运行,因此您可以将端口 22 用于健康检查。

控制台

请参阅创建健康检查

gcloud

创建健康检查:

export HEATH_CHECK=HEALTH_CHECK_NAME

gcloud beta compute health-checks create tcp $HEATH_CHECK --project=$CDF_PROJECT \
--port=22 --proxy-header=NONE --no-enable-logging \
--check-interval=5 --timeout=5 \
--unhealthy-threshold=2 --healthy-threshold=2

创建实例组

使用在上一步中创建的健康检查,创建一个实例组

控制台

请参阅创建代管式实例组

gcloud

创建实例组。

export INSTANCE_GROUP=INSTANCE_GROUP
gcloud beta compute --project=$CDF_PROJECT instance-groups managed create $INSTANCE_GROUP \
--base-instance-name=$INSTANCE_GROUP \
--template=$TEMPLATE_NAME --size=1 --zone=$ZONE \
--health-check=test --initial-delay=300

gcloud beta compute --project "$CDF_PROJECT" instance-groups managed set-autoscaling "$INSTANCE_GROUP" \
--zone "$ZONE" --cool-down-period "60" \
--max-num-replicas "10" --min-num-replicas "1" \
--target-cpu-utilization "0.6" --mode "on"

创建负载均衡器

通过在上一步中创建的实例组创建 TCP 负载均衡器 (ILB)。

将自定义路由添加到负载均衡器

自定义路由添加到 Cloud Data Fusion 实例所在 VPC 中的内部负载平衡器 (ILB)。

控制台

转到 VPC 网络页面。

进入 VPC 网络页面

路由标签页中,点击创建路由

添加自定义路由

gcloud

将自定义路由添加到内部负载均衡器:

export ROUTE=ROUTE_NAME
export ILB_FRONTEND=<ip_of_ilb_frontend>
gcloud beta compute routes create $ROUTE --project=$CDF_PROJECT \
--network=$VPC_NETWORK --priority=1001 \
--destination-range=0.0.0.0/0 \
--next-hop-ilb=$ILB_FRONTEND \
--next-hop-ilb-region=$REGION

问题排查

Preview 或 Wrangler 中出现连接超时错误

设置出站流量控制时,您可能会收到 Connection Timeout 错误。

如需解决该问题,请检查以下设置是否正确:

实例组健康检查未成功

检查防火墙规则是否允许来自 130.211.0.0/22,35.191.0.0/16 源范围的 TCP、UDP、ICMP 流量。

在 Dataproc 中执行时流水线失败

如需在执行时访问公共互联网,请在 Dataproc 集群所在的区域和网络中启用 Cloud NAT

后续步骤