无法在 GCP 中使用 Terraform 创建基于经典路由的 VPN 隧道

Joh*_*han 5 google-cloud-platform terraform google-cloud-networking

我想要实现的目标:

我希望 Terraform 在 GCP 中创建基于经典路由的 VPN 隧道。

背景:

在 GCP 中设置 VPN 隧道时,有 3 个选项用于路由 BGP 基于路由 基于策略

在 GCP 中创建基于路由的 VPN 隧道时,您需要指定远程子网。如果您要创建基于策略的 VPN 隧道,您还需要指定本地子网。

由于我想创建基于路由的 VPN 隧道,因此我只需要提供远程子网。

问题:

但是在 Terraform 中,资源“google_compute_vpn_tunnel”没有与要使用的路由类型有关的选项。好吧,也许它是由缺少“local_traffic_selector”决定的,然后变成基于路由的 VPN 隧道。但即使我在 main.tf 中省略了“local_traffic_selector”选项,它仍然存在于计划中。

' + local_traffic_selector =(应用后已知)

由于我没有为其指定任何值,Terraform 尝试将其与空值一起使用,这是不可能的。

Error: Error creating VpnTunnel: googleapi: Error 400: Invalid value for field 'resource.localTrafficSelector[0]': ''. The local_traffic_selector field cannot be empty for network in custom subnet mode., invalid

  on main.tf line 51, in resource "google_compute_vpn_tunnel" "tunnel1":
  51: resource "google_compute_vpn_tunnel" "tunnel1" {
Run Code Online (Sandbox Code Playgroud)

如果我指定它,VPN 隧道的类型将是基于策略而不是基于路由。

是否不支持 Terraform 在 GCP 中创建基于路由的经典 VPN 隧道?

另一个奇怪的事情是在创建 VPN 网关时。当您在 GCP 控制台中执行此操作时,您需要指定 VPN 网关具有的外部 IP 地址。这是一个非常重要的属性。但是 Terraform 没有设置资源“google_compute_vpn_gateway”的 IP 地址的选项在这里的示例中: https: //www.terraform.io/docs/providers/google/r/compute_vpn_gateway.html他们创建一个静态 IP 对象,但是它从未在配置中分配给 VPN 网关。

gui*_*ere 2

根据VPN路由策略的文档,如果本地选择器Route Based位于Policy based0.0.0.0/0

基于路由的 VPN 隧道与使用基于策略的路由的隧道类似,不同之处在于仅指定了远程 IP 范围(右侧)。本地 IP 范围列表假定为任意网络 (0.0.0.0/0),因此您只需指定远程流量选择器。

顺便添加local_traffic_selector= ["0.0.0.0/0"]您的隧道定义,如下所示(在 Terraform 的默认示例中

resource "google_compute_vpn_tunnel" "tunnel1" {
  name          = "tunnel1"
  peer_ip       = "15.0.0.120"
  shared_secret = "a secret message"
  local_traffic_selector= ["0.0.0.0/0"]
  ...
Run Code Online (Sandbox Code Playgroud)

是的,当然,创建的 VPN 隧道的设置与Policy BasedGUI 中相同,但本地网络为 0.0.0.0/0,因此技术上等同于Route Basedconfig。

关于静态 IP,这是 Terraform 的标准(且无聊)行为。您必须使用 Terraform 创建静态 IP,以便将状态保存在 TSTATE 文件中,然后能够重用它。尝试这个:

  • main.tf仅在文件中保留外部 IP 创建
resource "google_compute_address" "vpn_static_ip" {
  name   = "my-vpn-ip"
}
Run Code Online (Sandbox Code Playgroud)
  • 应用此配置
  • 现在添加其余配置
  • 再次应用配置更新

如您所见,Terraform 从之前的状态检索 IP 并重用它,而无需创建新的 IP。

google_compute_address.vpn_static_ip: Refreshing state... [id=******PROJECT_ID*****/us-central1/my-vpn-ip]
Run Code Online (Sandbox Code Playgroud)