使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform

Posted

技术标签:

【中文标题】使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform【英文标题】:Create private network with Terraform with starting script - Google Cloud Platform 【发布时间】:2019-11-09 02:25:37 【问题描述】:

最近使用 GCP 开始使用 Terraform,我想完成一个练习:

使用单个子网创建新的 VPC 网络。 创建允许外部 RDP 流量到堡垒主机系统的防火墙规则。 部署两个连接到 VPC 网络和默认网络的 Windows 服务器。 创建一个指向启动脚本的虚拟机。 配置防火墙规则以允许 HTTP 访问虚拟机。

这是我的解决方案:

    创建一个名为securenetwork 的新VPC 网络,然后在securenetwork 中创建一个新的VPC 子网。配置网络和子网后,配置防火墙规则,允许从 Internet 到堡垒主机的入站 RDP 流量(TCP 端口 3389)。
# Create the securenetwork network
resource "google_compute_network" "securenetwork" 
  name                    = "securenetwork"
  auto_create_subnetworks = false


# Create securesubnet-us subnetwork
resource "google_compute_subnetwork" "securesubnet-eu" 
  name          = "securesubnet-eu"
  region        = "europe-west1"
  network       = "$google_compute_network.securenetwork.self_link"
  ip_cidr_range = "10.130.0.0/20"


# Create a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on securenetwork
resource "google_compute_firewall" "securenetwork-allow-http-ssh-rdp-icmp" 
  name    = "securenetwork-allow-http-ssh-rdp-icmp"
  network = "$google_compute_network.securenetwork.self_link"

  allow 
    protocol = "tcp"
    ports    = ["3389"]
  

  allow 
    protocol = "icmp"
  


# Create the vm-securehost instance
module "vm-securehost" 
  source              = "./instance/securehost"
  instance_name       = "vm-securehost"
  instance_zone       = "europe-west1-d"
  instance_subnetwork = "$google_compute_subnetwork.securesubnet-eu.self_link"
  instance_network = "$google_compute_network.securenetwork.self_link"


# Create the vm-bastionhost instance
module "vm-bastionhost" 
  source              = "./instance/bastionhost"
  instance_name       = "vm-bastionhost"
  instance_zone       = "europe-west1-d"
  instance_subnetwork = "$google_compute_subnetwork.securesubnet-eu.self_link"
  instance_network = "$google_compute_network.securenetwork.self_link"

    部署 Windows 实例

    一个名为 vm-securehost 的 Windows 2016 服务器实例,具有两个网络接口。将第一个网络接口配置为与新 VPC 子网的仅内部连接,并将第二个网络接口配置为与默认 VPC 网络的仅内部连接。这是安全服务器。
variable "instance_name" 
variable "instance_zone" 

variable "instance_type" 
  default = "n1-standard-1"


variable "instance_subnetwork" 
variable "instance_network" 

resource "google_compute_instance" "vm_instance" 
  name         = "$var.instance_name"
  zone         = "$var.instance_zone"
  machine_type = "$var.instance_type"

  boot_disk 
    initialize_params 
      image = "windows-cloud/windows-2016"
    
  

  network_interface 
    subnetwork = "$var.instance_subnetwork"
    access_config 
      # Allocate a one-to-one NAT IP to the instance
    
  

另一个名为 vm-bastionhost 的 Windows 2016 服务器实例具有两个网络接口。将第一个网络接口配置为使用临时公共(外部 NAT)地址连接到新的 VPC 子网,并将第二个网络接口配置为与默认 VPC 网络的仅内部连接。这是跳转框或堡垒主机。
variable "instance_name" 
variable "instance_zone" 

variable "instance_type" 
  default = "n1-standard-1"


variable "instance_subnetwork" 
variable "instance_network" 

resource "google_compute_address" "default" 
  name = "default"
  region = "europe-west1"


resource "google_compute_instance" "vm_instance" 
  name         = "$var.instance_name"
  zone         = "$var.instance_zone"
  machine_type = "$var.instance_type"

  boot_disk 
    initialize_params 
      image = "windows-cloud/windows-2016"
    
  

  network_interface 
    subnetwork = "$var.instance_subnetwork"
    network = "$var.instance_network"
    access_config 
      # Allocate a one-to-one NAT IP to the instance
      nat_ip = "$google_compute_address.default.address"
    
  

我的问题:

如何配置没有公共 IP 地址的名为 vm-securehost 的 Windows 计算实例? 如何配置名为 vm-securehost 的 Windows 计算实例在启动时运行 Microsoft IIS Web 服务器软件? 感谢您对解决方案的任何评论

【问题讨论】:

【参考方案1】:

要创建一个没有任何外部 IP 地址的虚拟机,请省略 terraform 脚本中的“访问配置”参数,因为它负责创建外部 IP 地址。

要在启动时在您的 vm 上运行 Microsoft IIS Web 服务器软件,请在您的 vm 创建块中添加以下参数(不包括引号) - 'metadata_startup_script = import-module servermanager && add-windowsfeature web-server -includeallsubfeature'

有关该问题的详细信息,请参阅以下链接 -

https://cloud.google.com/compute/docs/tutorials/basic-webserver-iis

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance#metadata_startup_script

【讨论】:

以上是关于使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 在 OVH 上创建私有子网?

如何使用 terraform 中的循环概念在虚拟网络内创建子网和 nsg 内的安全规则

处理 Terraform 模板文件和 Bash 脚本的解析错误

Terraform GCP 启动脚本本地文件而不是内联文件

使用 terraform 脚本的 pubsub 主题和订阅之间的依赖关系

创建谷歌云存储桶并使用相同的 terraform 脚本将 terraform 状态保存到其中?