Score:1

GCP Terraform: ไม่สามารถตั้งค่าเครือข่ายย่อยที่จะโฆษณาผ่าน BGP บนเราเตอร์ระบบคลาวด์

ธง ua

ฉันกำลังพยายามสร้างเราเตอร์ระบบคลาวด์โดยมีช่วงเครือข่ายสองช่วงที่ได้รับการโฆษณา แต่ฉันได้รับข้อผิดพลาดที่คลุมเครือมากจาก Terraform และฉันไม่สามารถระบุได้ว่ามีอะไรผิดปกติ

ทรัพยากร "google_compute_router" "router1" {
  ชื่อ = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  โครงการ = var.project_name
  เครือข่าย = var.network1
  ภูมิภาค = var.region1
  bgp {
    asn = var.asn
    Advertising_mode = "กำหนดเอง"
    ไดนามิก "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      เนื้อหา {
        range = adverted_ip_ranges_prod1.value["cidr"]
        คำอธิบาย = Advertising_ip_ranges_prod1.value["desc"]
      }
    }
  }
}

และรหัสโมดูลจริง:

โมดูล "vpn-ha-เกตเวย์" {
  ที่มา = "-----"
  project_name = var.project_name
  ลูกค้า = var.customer
  นามแฝง = var.นามแฝง
  ภูมิภาค 1 = var.region1
  นับ = (var.vpn_type == "ha-vpn" ? 1 : 0) ## สร้างถ้า vpn_type เป็น ha-vpn
  network1 = 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
  Advertising_ip_ranges_prod1 = var.advertised_ip_ranges_prod1
}

เรากำหนดให้ ads_ip_ranges_prod1 เป็นแผนที่ เนื่องจากเราไม่รู้ว่าแต่ละโมดูลจะมีจำนวนเท่าใด:

ตัวแปร "advertised_ip_ranges_prod1" {
  ประเภท = รายการ (แผนที่ (สตริง))
  คำอธิบาย = "โฆษณาโดย BGP บน prod1"
  ค่าเริ่มต้น = [
    {
        cidr = "1.2.3.4/28" ## Prod1 ช่วงที่โฆษณา
        desc = "ช่วงรองที่โฆษณาผ่าน BGP"
    },
    {
        cidr = "5.6.7.8/28" # ทดสอบช่วงที่โฆษณา
        desc = "ช่วงทดสอบที่โฆษณาผ่าน BGP"
    },
  ]
}

และในขณะที่ฉันมีโมดูลอื่น ๆ ที่สร้างขึ้นด้วยวิธีเดียวกัน (โดยที่ for_each) ทำงานได้อย่างถูกต้อง โมดูลนี้ยังคงทิ้งข้อผิดพลาดที่คลุมเครือเหล่านี้:

ข้อผิดพลาด: การอ้างอิงถึงทรัพยากรที่ไม่ได้ประกาศ

  บน .terraform\modules\vpn-ha\main.tf บรรทัดที่ 36 ในทรัพยากร "google_compute_router" "router1":
  36: range = advertising_ip_ranges_prod1.value["cidr"]

ไม่มีการประกาศทรัพยากรที่มีการจัดการ "advertised_ip_ranges_prod1" "value"
ใน module.vpn-ha-gateway


ข้อผิดพลาด: การอ้างอิงถึงทรัพยากรที่ไม่ได้ประกาศ

  บน .terraform\modules\vpn-ha-gateway\main.tf บรรทัดที่ 37 ในทรัพยากร "google_compute_router" "router1":
  37: คำอธิบาย = advertising_ip_ranges_prod1.value["desc"]

ไม่มีการประกาศทรัพยากรที่มีการจัดการ "advertised_ip_ranges_prod1" "value"
ใน module.vpn-ha-gateway.```

Score:1
ธง bw

ดังนั้นปัญหา (ฉันคิดว่า) คือวิธีที่คุณอ้างอิงการวนซ้ำปัจจุบันขององค์ประกอบไดนามิกจากภายใน แต่ละ "บล็อก". โดยทั่วไป ชื่อของ "ตัวแปร" ที่คุณใช้เพื่ออ้างอิงค่าตัววนซ้ำปัจจุบันใน แต่ละ block เป็นชื่อของแท็กไดนามิกเอง ด้วยเหตุนี้ ฉันคิดว่าคุณต้องเปลี่ยนสิ่งนี้:

ทรัพยากร "google_compute_router" "router1" {
  ชื่อ = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  โครงการ = var.project_name
  เครือข่าย = var.network1
  ภูมิภาค = var.region1
  bgp {
    asn = var.asn
    Advertising_mode = "กำหนดเอง"
    ไดนามิก "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      เนื้อหา {
        range = adverted_ip_ranges_prod1.value["cidr"]
        คำอธิบาย = Advertising_ip_ranges_prod1.value["desc"]
      }
    }
  }
}

ด้วยสิ่งนี้:

ทรัพยากร "google_compute_router" "router1" {
  ชื่อ = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  โครงการ = var.project_name
  เครือข่าย = var.network1
  ภูมิภาค = var.region1
  bgp {
    asn = var.asn
    Advertising_mode = "กำหนดเอง"
    ไดนามิก "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      เนื้อหา {
        ช่วง = adverted_ip_ranges.value ["cidr"]
        คำอธิบาย = adverted_ip_ranges.value["desc"]
      }
    }
  }
}

เช่น. s/advertised_ip_ranges_prod1/advertised_ip_ranges/

สำหรับการอ้างอิง โปรดดูที่ ตัวอย่างแรก ในเอกสารเกี่ยวกับเรื่องนี้ซึ่งมีดังต่อไปนี้:

ทรัพยากร "aws_elastic_beanstalk_environment" "tfenvtest" {
  ชื่อ = "tf-ทดสอบชื่อ"
  แอปพลิเคชัน = "${aws_elastic_beanstalk_application.tftest.name}"
  solution_stack_name = "64 บิต Amazon Linux 2018.03 v2.11.4 ที่รัน Go 1.12.6"

  "การตั้งค่า" แบบไดนามิก {
    for_each = var.settings
    เนื้อหา {
      เนมสเปซ = การตั้งค่า ค่า ["เนมสเปซ"]
      ชื่อ = การตั้งค่า ค่า ["ชื่อ"]
      ค่า = การตั้งค่าค่า ["ค่า"]
    }
  }
}

โปรดทราบว่าพวกเขาใช้ การตั้งค่า ค่าแม้ว่าชื่อของตัวแปรจะเป็น การตั้งค่า. โดยพื้นฐานแล้วคุณกำลังพบกับความแตกต่างที่เหมือนกัน ค่อนข้างสับสน

djsmiley2kStaysInside avatar
ua flag
คำตอบที่ยอดเยี่ยม ขอบคุณ มันเป็นสิ่งเล็ก ๆ น้อย ๆ แบบนี้ในภูมิประเทศที่ทำให้ฉันสะดุด!.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา