您可以将工作流执行过程中的 HTTP 调用指定到专用端点, 将 Service Directory 的服务注册表与 Workflows 搭配使用。 通过在虚拟私有云 (VPC) 网络中创建专用端点, 该端点可以兼容 VPC Service Controls。
VPC Service Controls 提供了一层额外的安全防御, 与 Identity and Access Management (IAM) 无关。虽然 IAM 支持 基于身份的精细访问权限控制,VPC Service Controls 可实现更广泛的 基于上下文的边界安全性,包括控制 边界。
Service Directory 是 Service Registry,用于存储已注册的网络服务的相关信息, 包括其名称、位置和属性。无论 您可以自动注册服务,并捕获其 。这样,您就可以大规模地发现、发布和连接服务, 所有服务端点
VPC 网络 还可以创建专用端点 在 VPC 网络内使用内部 IP 地址。HTTP 对 VPC 网络资源的调用通过专用网络发送 同时强制执行 IAM 和 VPC Service Controls
VPC Service Controls 是 一种 Google Cloud 功能,可用于设置服务边界并创建 数据传输边界您可以将 VPC Service Controls 与 有助于保护您的服务和降低风险的 Workflows 数据渗漏的风险
本文档介绍如何在 VPC 网络中注册虚拟机 用作 Service Directory 端点这样,您就可以 使用 Service Directory 服务名称创建工作流。您的 工作流执行会使用从服务注册表中检索到的信息 发送适当的 HTTP 请求,而不出站到公共网络。
下图进行了简要介绍:
概括来讲,您必须执行以下操作:
- 向 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 资源,请授予 Service Directory Viewer 角色 将项目的 (
servicedirectory.viewer
) 权限导出到 Workflows 服务代理: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 网络,请执行以下操作: 授予 Private Service Connect Authorized Service 角色 针对项目的 (
roles/servicedirectory.pscAuthorizedService
) 配置 Workflows 服务代理: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 网络,并允许来自任何 IPv4 地址的入站流量,
0.0.0.0/0
.如果 --rules
标志的值设为 all
,则规则适用于所有
协议和所有目标端口
gcloud compute firewall-rules create RULE_NAME \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --source-ranges=0.0.0.0/0 \ --rules=all
将 RULE_NAME
替换为防火墙规则的名称。
如需了解详情,请参阅使用 VPC 防火墙规则。
在 VPC 网络中创建虚拟机实例
虚拟机实例包括 Google Kubernetes Engine (GKE) 集群、App Engine 柔性环境实例以及基于该 API 构建的其他 Google Cloud 产品 Compute Engine 虚拟机为了支持 专用网络访问通道, VPC 网络资源可以是虚拟机实例 Cloud Interconnect IP 地址或第 4 层内部负载均衡器。
Compute Engine 实例可以运行适用于 Linux 和 Windows 的公共映像 以及 Google 提供的私有自定义映像, 是创建还是从现有系统导入。你还可以将 Docker containers.
您可以选择实例的机器属性,例如 虚拟 CPU 数量和内存量,使用一组预定义的机器进行计算 也可以创建您自己的自定义机器类型
例如,以下命令通过公共 IP 地址 具有连接到您所用 VPC 网络的网络接口的映像 创建 Deployment
创建并启动虚拟机实例:
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) 上的所有传入流量。要保存更改,请点击保存。
如需重启虚拟机,请点击启动/恢复。
如需了解详情,请参阅创建并启动虚拟机实例。
在虚拟机上部署应用
测试网络配置并确认流量是以 如预期,您可以在虚拟机上部署一个简单的应用来监听端口。
例如,以下命令会创建一个 Node.js Web 服务来监听 端口 3000
与虚拟机建立 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" }
安装 Web 应用 Express 适用于 Node.js 的框架:
npm install express
为测试应用编写代码:
vim app.js
以下示例将创建一个应用程序,以响应
GET
对 包含文本“Hello, world!”的根路径 (/
)记下应用正在监听的端口。必须使用相同的端口号 (在为 Service Directory 配置端点时) 服务。
确认应用正在监听端口 3000:
node app.js
Compute Engine 提供了各种部署选项。有关 请参阅 为您的工作负载选择 Compute Engine 部署策略。
配置 Service Directory
如需支持从工作流执行中调用专用端点,您必须设置 创建 Service Directory 命名空间,在 命名空间,并为该服务添加一个端点。
例如,以下命令会创建命名空间、服务和 用于指定 VPC 网络和内部 IP 地址的端点 虚拟机实例的 IP 地址
创建命名空间:
gcloud service-directory namespaces create NAMESPACE \ --location=REGION
替换以下内容:
NAMESPACE
:命名空间的 ID,或整个命名空间的 ID 命名空间的限定标识符REGION
:需要访问 Google Cloud Storage 存储区域的 包含命名空间;例如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),但您可以将任何
将 call
字段设置为 http.request
,然后指定 HTTP 请求的类型
使用 method
字段指定请求的类型。如需更多信息
请参阅发出 HTTP 请求。
为工作流创建源代码文件:
touch call-private-endpoint.JSON_OR_YAML
将
JSON_OR_YAML
替换为yaml
或json
具体取决于工作流程的格式在文本编辑器中,复制以下工作流程(在本例中使用
url
值的 HTTP 协议)添加到您的源代码文件中: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 或其他端点。