Điểm:1

GCP Terraform: Không thể đặt mạng con được quảng cáo qua BGP trên bộ định tuyến đám mây

lá cờ ua

Tôi đang cố gắng tạo một bộ định tuyến đám mây, với hai dải mạng được quảng cáo từ nó, tuy nhiên tôi đang gặp phải một số lỗi rất mơ hồ từ địa hình và tôi không thể xác định được lỗi của mình.

tài nguyên "google_compute_router" "router1" {
  tên = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  dự án = var.project_name
  mạng = var.mạng1
  khu vực = var.khu vực1
  bgp {
    asn = var.asn
    quảng cáo_mode = "TÙY CHỈNH"
    động "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      Nội dung {
        phạm vi = quảng cáo_ip_ranges_prod1.value["cidr"]
        mô tả = quảng cáo_ip_ranges_prod1.value["desc"]
      }
    }
  }
}

Và mã mô-đun thực tế:

mô-đun "vpn-ha-gateway" {
  nguồn = "-----"
  project_name = var.project_name
  khách hàng = var.customer
  bí danh = var.alias
  vùng1 = var.vùng1
  đếm = (var.vpn_type == "ha-vpn"? 1 : 0) ## Bản dựng nếu vpn_type là ha-vpn
  mạng1 = module.prod1-vpc.self_link
  customer_redundancy = var.customer_redundancy
  customer_ha_vpn_peers = var.customer_ha_vpn_peers
  shared_secret = var.shared_secret
  asn = var.asn
  cust_asn = var.cust_asn
  quảng cáo_ip_ranges_prod1 = var.advertised_ip_ranges_prod1
}

Chúng tôi xác định Advertisement_ip_ranges_prod1 dưới dạng bản đồ vì chúng tôi không biết sẽ có bao nhiêu mô-đun:

biến "advertised_ip_ranges_prod1" {
  loại = danh sách (bản đồ (chuỗi))
  description = "được quảng cáo bởi BGP trên prod1"
  mặc định = [
    {
        cidr = "1.2.3.4/28" ## Phạm vi quảng cáo Prod1
        desc = "phạm vi thứ cấp được quảng cáo qua BGP"
    },
    {
        cidr = "5.6.7.8/28" # Kiểm tra phạm vi được quảng cáo
        desc = "Phạm vi thử nghiệm được quảng cáo qua BGP"
    },
  ]
}

Và trong khi tôi có các mô-đun khác được xây dựng theo cách tương tự (với for_each) hoạt động chính xác, mô-đun này vẫn tiếp tục đưa ra các lỗi mơ hồ sau:

Lỗi: Tham chiếu đến tài nguyên chưa được khai báo

  trên .terraform\modules\vpn-ha\main.tf dòng 36, trong tài nguyên "google_compute_router" "router1":
  36: phạm vi = quảng cáo_ip_ranges_prod1.value["cidr"]

Tài nguyên được quản lý "advertised_ip_ranges_prod1" "giá trị" chưa được khai báo
trong module.vpn-ha-gateway.


Lỗi: Tham chiếu đến tài nguyên chưa được khai báo

  trên .terraform\modules\vpn-ha-gateway\main.tf dòng 37, trong tài nguyên "google_compute_router" "router1":
  37: mô tả = quảng cáo_ip_ranges_prod1.value["desc"]

Tài nguyên được quản lý "advertised_ip_ranges_prod1" "giá trị" chưa được khai báo
trong module.vpn-ha-gateway.```

Điểm:1
lá cờ bw

Vì vậy, vấn đề (tôi nghĩ) là cách bạn tham chiếu lần lặp lại hiện tại của phần tử động từ bên trong cho mỗi "chặn". Nói chung, tên của "biến" mà bạn sử dụng để tham chiếu giá trị trình lặp hiện tại trong cho mỗi khối thực sự là tên của chính thẻ động. Do đó, tôi nghĩ bạn cần thay thế cái này:

tài nguyên "google_compute_router" "router1" {
  tên = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  dự án = var.project_name
  mạng = var.mạng1
  khu vực = var.khu vực1
  bgp {
    asn = var.asn
    quảng cáo_mode = "TÙY CHỈNH"
    động "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      Nội dung {
        phạm vi = quảng cáo_ip_ranges_prod1.value["cidr"]
        mô tả = quảng cáo_ip_ranges_prod1.value["desc"]
      }
    }
  }
}

Với cái này:

tài nguyên "google_compute_router" "router1" {
  tên = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  dự án = var.project_name
  mạng = var.mạng1
  khu vực = var.khu vực1
  bgp {
    asn = var.asn
    quảng cáo_mode = "TÙY CHỈNH"
    động "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      Nội dung {
        phạm vi = quảng cáo_ip_ranges.value["cidr"]
        mô tả = quảng cáo_ip_ranges.value["desc"]
      }
    }
  }
}

ví dụ. s/advertised_ip_ranges_prod1/advertised_ip_ranges/

Để tham khảo, xem ví dụ đầu tiên trên tài liệu của họ về điều này, như sau:

tài nguyên "aws_elastic_beanstalk_environment" "tfenvtest" {
  name = "tf-test-name"
  ứng dụng = "${aws_elastic_beanstalk_application.tftest.name}"
  solution_stack_name = "64bit Amazon Linux 2018.03 v2.11.4 chạy Go 1.12.6"

  "cài đặt" động {
    for_each = var.settings
    Nội dung {
      không gian tên = setting.value["không gian tên"]
      tên = setting.value["tên"]
      giá trị = setting.value["value"]
    }
  }
}

Lưu ý rằng họ sử dụng giá trị cài đặt, mặc dù tên của biến là cài đặt. Về cơ bản, bạn đang gặp phải sự khác biệt giống hệt nhau, khá khó hiểu.

djsmiley2kStaysInside avatar
lá cờ ua
Câu trả lời tuyệt vời, cảm ơn bạn. Chính những thứ nhỏ nhặt như thế này trong terraform mới thực sự khiến tôi vấp ngã!.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.