当前位置: 首页 > 知识库问答 >
问题:

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

李弘光
2023-03-14

我想要完成的是:

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

背景:

在GCP中设置VPN隧道时,有三种基于策略路由BGP路由的选项

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

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

问题:

然而,在Terraform中,资源“google_compute_vpn_tunnel”没有与使用哪种路由类型有关的选项。好吧,也许它是由缺乏“local_traffic_selector”决定的,然后成为一个基于路由的虚拟专用网隧道。但是即使我在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网关

共有1个答案

祝宏放
2023-03-14

根据VPN路由策略的留档,如果本地选择器位于0.0.0.0/0中,则基于=基于策略

基于路由的VPN隧道与使用基于策略的路由的隧道相似,只是仅指定了html" target="_blank">远程IP范围(右侧)。本地IP范围列表假定是任何网络(0.0.0.0/0),因此您只指定远程流量选择器。

顺便说一下,在隧道定义中添加local\u traffic\u 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中被设置为基于策略的,但本地网络设置为0.0.0.0/0,因此在技术上等同于基于路由的配置。

关于静态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]
 类似资料:
  • 我有一个 OKD 3.11 集群启动并运行,并配置了 openshiftrouter。但是现在,我需要使用 openshift haproxy 路由器添加我自己的路由,而无需将路由映射到服务。例如,我需要添加一个将“a.b.com”重定向到 IP 地址“1.2.3.4:443”的路由。此处 1.2.3.4 是另一个集群的 haproxy 路由器的 IP 地址。 我知道我们可以用非openshift

  • 我正在12C上构建的oracle adf应用程序中使用log4j2 JAR。 要求:根据会话创建多个日志文件,并且能够动态更改日志属性。 多谢了。

  • 本文向大家介绍Symfony2创建基于域名的路由相关示例,包括了Symfony2创建基于域名的路由相关示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Symfony2创建基于域名的路由实现方法。分享给大家供大家参考,具体如下: 你可以匹配将要来到的请求以HTTP域名的方式 YAML方式 XML方式 PHP方式 两个路由匹配相同的路径  / ,然而第一个将只有域名为m.example.c

  • 我成功地实现了在terraform中创建敏感资源的流程,在任何时候都不会透露敏感细节是什么,因此在我们的github repo中不会以纯文本存储。我让TF创建一个服务帐户,它与SA密钥相关,然后创建一个引用SA密钥输出的GCP密钥。 我现在想看看是否有任何方法可以对一些预定义的数据库密码执行相同的操作。流量会略有不同: 手动创建GCP secret(在secrets manager中),该密码的值

  • 我有一个小难题来解决这个问题。 我有一个用户和一个管理员角色。 用户应该能够列出除管理员以外的所有用户。管理员可以列出所有用户。 我想到的第一个解决方案是检查控制器级别的角色: 但是我更想做的是在路线层面上,保持控制器更干净,但不知何故它确实起作用了。它只列出用户,即使我作为管理员登录。 有什么建议吗?谢谢!

  • 我的目标是开发一个单一的骆驼路线来映射这些服务器,接受路径中服务器的名称。类似于这样: 我的(简化且不起作用)Blueprint.xml: 问题是,我不知道如何从路径中移除/center、/north或/south,因此头部被传递给目标服务,而目标服务不知道如何处理它。调用: