3

我想要完成的事情:

我希望 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" {

如果我确实指定了它,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 网关。

4

1 回答 1

1

根据VPN 路由策略的文档Route Based=Policy based如果本地选择器在0.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"]
  ...

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

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

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

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

google_compute_address.vpn_static_ip: Refreshing state... [id=******PROJECT_ID*****/us-central1/my-vpn-ip]
于 2019-08-11T20:50:36.820 回答