您可以将 Service Directory 的服务注册与 Workflows 搭配使用,以将工作流执行中的 HTTP 调用定向到专用端点。通过在虚拟私有云 (VPC) 网络中创建专用端点,该端点可以符合 VPC Service Controls 的要求。
VPC Service Controls 是一项Google Cloud 功能,可让您设置服务边界并创建数据传输边界。这可以提供一层额外的、独立于 Identity and Access Management (IAM) 的安全防御。IAM 实现了精细的基于身份的访问权限控制,而 VPC Service Controls 可实现更广泛的基于上下文的边界安全性,包括控制跨边界数据出站流量。
按照本指南中的步骤操作后,您可以创建服务边界,并将 VPC Service Controls 与 Workflows 搭配使用,以降低数据渗漏风险。
已注册的网络服务概览
本文档介绍了如何将 VPC 网络中的虚拟机注册为 Service Directory 端点。这样,您就可以为工作流提供 Service Directory 服务名称。工作流执行会使用从服务注册表中检索到的信息来发送相应的 HTTP 请求,而不会流出到公共网络。
VPC 网络可为您的虚拟机 (VM) 实例提供连接,并允许您使用内部 IP 地址在 VPC 网络中创建专用端点。在执行 IAM 和 VPC Service Controls 时,通过专用网络向 VPC 网络资源发送 HTTP 调用。
Service Directory 是一个服务注册表,用于存储已注册的网络服务的相关信息,包括其名称、位置和属性。无论服务的基础架构如何,您都可以自动注册服务并捕获其详细信息。这样,您就可以大规模发现、发布和连接所有服务端点对应的服务。
下图简要展示了此过程:
概括来讲,您必须执行以下操作:
- 向 Cloud Workflows 服务代理授予权限,以便该服务代理可以查看 Service Directory 资源并使用 Service Directory 访问 VPC 网络。
- 创建 VPC 网络以提供网络功能。
- 创建 VPC 防火墙规则,以便您可以允许或拒绝流量进出 VPC 网络中的虚拟机实例。
- 在 VPC 网络中创建虚拟机实例。Compute Engine 虚拟机实例是托管在 Google 基础设施上的虚拟机。术语“Compute Engine 实例”“虚拟机实例”和“虚拟机”是同义词,可互换使用。
- 在虚拟机上部署应用。您可以在虚拟机实例上运行应用,并确认流量是否按预期提供。
配置 Service Directory,以便工作流执行可以调用 Service Directory 端点。
创建并部署工作流。工作流中的
private_service_name
值指定了您在上一步中注册的 Service Directory 端点。
向 Cloud Workflows 服务代理授予权限
某些 Google Cloud 服务具有服务代理,让服务可以访问您的资源。如果 API 需要服务代理,则 Google 会在您激活并使用 API 后创建服务代理。
首次部署工作流时,系统会自动创建 Cloud Workflows 服务代理,其格式如下:
service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com
您可以使用以下命令在没有任何工作流的项目中手动创建服务账号:
gcloud beta services identity create \ --service=workflows.googleapis.com \ --project=PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud项目 ID。如需查看 Service Directory 资源,请向 Workflows 服务代理授予项目的 Service Directory Viewer 角色 (
servicedirectory.viewer
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.viewer
将
PROJECT_NUMBER
替换为您的 Google Cloud项目编号。您可以在 Google Cloud 控制台的欢迎页面上,或通过运行以下命令来查找项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
如需使用 Service Directory 访问 VPC 网络,请向 Workflows 服务代理授予项目的 Private Service Connect Authorized Service 角色 (
roles/servicedirectory.pscAuthorizedService
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.pscAuthorizedService
创建 VPC 网络
VPC 网络是物理网络的虚拟版本,在 Google 的生产网络内实现。可为 Compute Engine 虚拟机实例提供连接。
您可以创建自动模式或自定义模式 VPC 网络。您创建的每个新网络在同一项目内必须具有唯一的名称。
例如,以下命令会创建一个自动模式 VPC 网络:
gcloud compute networks create NETWORK_NAME \ --subnet-mode=auto
将 NETWORK_NAME
替换为 VPC 网络的名称。
如需了解详情,请参阅创建和管理 VPC 网络。
创建 VPC 防火墙规则
通过 VPC 防火墙规则,您可以根据端口号、标记或协议来允许或拒绝进出 VPC 网络中的虚拟机实例的流量。
VPC 防火墙规则是在网络级别定义的,仅会应用于在其中创建它们的网络;但是,您为规则选择的名称在项目中必须是唯一的。
例如,以下命令会为您之前创建的 VPC 网络创建防火墙规则。
gcloud compute firewall-rules create RULE_NAME \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --source-ranges=IP_ADDRESS_RANGE \ --rules=all
替换以下内容:
RULE_NAME
:防火墙规则的名称。IP_ADDRESS_RANGE
:一个或多个 IPv4 或 IPv6 地址范围。最佳实践是指定允许访问所需的特定 IP 地址范围。请注意以下几点:Service Directory 的专用网络访问通道将
35.199.192.0/19
用作仅限内部使用的范围,其下一个跃点完全在 Google 网络内。如需了解详情,请参阅 Cloud DNS 和 Service Directory 的路径。如果满足所有其他前提条件,则在来源范围中包含
35.235.240.0/20
允许使用 Identity-Aware Proxy (IAP) TCP 转发的 SSH 连接。如需了解详情,请参阅使用 IAP 进行 TCP 转发。如果您使用 SSH-in-browser 工具从 Google Cloud 控制台内连接到 Compute Engine 虚拟机,则需要满足特定要求。
--rules
标志值为all
时,防火墙规则适用于所有协议和所有目标端口。您可以通过指定协议和端口来缩小范围。(可选)您可以使用
--target-tags
和--target-service-accounts
标志来定义目标;否则,规则将应用于网络中的所有目标。
如需了解详情,请参阅使用 VPC 防火墙规则。
在 VPC 网络中创建虚拟机实例
虚拟机实例包括 Google Kubernetes Engine (GKE) 集群、App Engine 柔性环境实例,以及 Compute Engine 虚拟机上构建的其他 Google Cloud 产品。为了支持专用网络访问,VPC 网络资源可以是虚拟机实例、Cloud Interconnect IP 地址或第 4 层内部负载均衡器。
Compute Engine 实例可以运行 Google 提供的 Linux 和 Windows Server 公开映像,也可以运行由您创建或从现有系统导入的私有自定义映像。您还可以部署 Docker 容器。
您可以使用一组预定义机器类型或创建自己的自定义机器类型,以选择实例的机器属性,例如虚拟 CPU 数量和内存容量。
例如,以下命令会通过公共映像创建一个 Linux 虚拟机实例,该实例的网络接口已附加到您之前创建的 VPC 网络。
创建并启动虚拟机实例:
gcloud compute instances create VM_NAME \ --image-family=debian-11 \ --image-project=debian-cloud \ --machine-type=e2-micro \ --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME
将
VM_NAME
替换为虚拟机名称。如果系统提示您确认实例的可用区,请键入
y
。创建虚拟机实例后,记下返回的
INTERNAL_IP
地址。在 Google Cloud 控制台中,前往虚拟机实例页面。
在名称列中,点击相应虚拟机实例的名称。
如果虚拟机正在运行,请点击
停止以停止虚拟机。如需修改虚拟机,请点击
修改。在网络 > 防火墙部分中,如需允许 HTTP 或 HTTPS 流量流向虚拟机,请选择允许 HTTP 流量或允许 HTTPS 流量。
在此示例中,请选中允许 HTTP 流量复选框。
Compute Engine 会向您的虚拟机添加一个网络标记,以将防火墙规则与该虚拟机相关联。然后,它会创建相应的入站防火墙规则,该规则允许
tcp:80
(HTTP) 或tcp:443
(HTTPS) 上的所有传入流量。要保存更改,请点击保存。
如需重启虚拟机,请点击启动/恢复。
如需了解详情,请参阅创建并启动虚拟机实例。
在虚拟机上部署应用
如需测试网络配置并确认流量是否按预期提供,您可以在虚拟机上部署一个监听端口的基本应用。
例如,以下命令会创建一个监听端口 3000 的 Node.js Web 服务。
与虚拟机实例建立 SSH 连接。
更新您的软件包代码库:
sudo apt update
-
如需了解详情,请参阅设置 Node.js 开发环境。
以交互方式创建
package.json
文件:npm init
例如:
{ "name": "test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "hello" }, "author": "", "license": "ISC" }
安装 Express,这是 Node.js 的 Web 应用框架:
npm install express
为测试应用编写代码:
vim app.js
以下示例创建了一个应用,该应用会以文本“Hello, world!”响应对根路径 (
/
) 的GET
请求。记下应用正在侦听的端口。为 Service Directory 服务配置端点时,必须使用相同的端口号。
确认应用正在监听端口 3000:
node app.js
Compute Engine 提供了一系列部署选项。如需了解详情,请参阅为工作负载选择 Compute Engine 部署策略。
配置 Service Directory
如需支持从工作流执行中调用专用端点,您必须设置 Service Directory 命名空间、在该命名空间中注册服务,并向该服务添加端点。
例如,以下命令会创建一个命名空间、一项服务和一个端点,用于指定虚拟机实例的 VPC 网络和内部 IP 地址。
创建命名空间:
gcloud service-directory namespaces create NAMESPACE \ --location=REGION
替换以下内容:
NAMESPACE
:命名空间的 ID 或命名空间的完全限定标识符。REGION
:包含命名空间的 Google Cloud 区域;例如us-central1
。
创建服务:
gcloud service-directory services create SERVICE \ --namespace=NAMESPACE \ --location=REGION
将
SERVICE
替换为您要创建的服务的名称。配置端点。
gcloud service-directory endpoints create ENDPOINT \ --namespace=NAMESPACE \ --service=SERVICE \ --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \ --port=PORT_NUMBER \ --address=IP_ADDRESS \ --location=REGION
替换以下内容:
ENDPOINT
:您要创建的端点的名称。PORT_NUMBER
:端点运行所在的端口;例如3000
。IP_ADDRESS
:端点的 IPv6 或 IPv4 地址;这是您之前记下的内部 IP 地址。
如需了解详情,请参阅配置 Service Directory 和配置专用网络访问权限。
创建和部署工作流
从 Workflows 调用专用端点是通过 HTTP 请求完成的。最常见的 HTTP 请求方法具有调用快捷方式(例如 http.get 和 http.post),但您可以发出任何类型的 HTTP 请求,方法是将 call
字段设置为 http.request
并使用 method
字段指定请求类型。如需了解详情,请参阅发出 HTTP 请求。
为工作流创建源代码文件:
touch call-private-endpoint.JSON_OR_YAML
将
JSON_OR_YAML
替换为yaml
或json
,具体取决于工作流的格式。在文本编辑器中,将以下工作流(在本例中,该工作流使用 HTTP 协议作为
url
值)复制到您的源代码文件中:YAML
main: steps: - checkHttp: call: http.get args: url: http://IP_ADDRESS private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" result: res - ret: return: ${res}
JSON
{ "main": { "steps": [ { "checkHttp": { "call": "http.get", "args": { "url": "http://IP_ADDRESS", "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" }, "result": "res" } }, { "ret": { "return": "${res}" } } ] } }
private_service_name
值必须是一个字符串,用于指定已注册的 Service Directory 服务名称,格式如下:projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME
部署工作流。为了进行测试,您可以将 Compute Engine 默认服务账号附加到工作流以代表其身份:
gcloud workflows deploy call-private-endpoint \ --source=call-private-endpoint.JSON_OR_YAML \ --location=REGION \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
执行工作流:
gcloud workflows run call-private-endpoint \ --location=REGION
您应该会看到类似如下所示的结果:
argument: 'null' duration: 0.650784403s endTime: '2023-06-09T18:19:52.570690079Z' name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932 result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html; charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}' startTime: '2023-06-09T18:19:51.919905676Z' state: SUCCEEDED
后续步骤
- 详细了解 Private Service Connect。
- 使用 VPC Service Controls 设置服务边界。
- 通过启用 IAP 调用私有本地、Compute Engine、GKE 或其他端点。