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



我想完成什么:

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

背景:

在 GCP 中设置 VPN 隧道时,有三个路由选项 边界网关协议 基于路线 基于策略

在 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 网关。

根据 VPN 路由策略的文档,如果本地选择器处于0.0.0.0/0,则Route Based=Policy based

基于路由的 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 隧道在 GUI 中设置为Policy Based,但本地网络为 0.0.0.0/0,因此在技术上等同于Route Based配置。

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

  • 仅将外部 IP 创建的内容保留在main.tf文件中
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]
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"]
remote_traffic_selector=["0.0.0.0/0"] 

remote_traffic_selector字段添加为 0.0.0.0/0 并独立创建指向隧道的路由,它将创建基于路由的 VPN。

最新更新