Score:0

Subnet ไม่ได้สร้างด้วย terraform บน azure จะแก้ไขได้อย่างไร

ธง cn

ฉันกำลังพยายามสร้างเครื่อง centos 8 สองเครื่องที่มีพื้นผิวเป็นสีฟ้า

GitHub เทมเพลตของฉัน ลิงค์

เมื่อฉันพยายามสมัคร ฉันได้รับข้อผิดพลาดด้านล่างเกี่ยวกับนโยบาย คุณช่วยแนะนำวิธีแก้ไขปัญหานี้ได้ไหม

> â ข้อผิดพลาด: การสร้างเครือข่ายย่อย: (ชื่อ "subnetforAutomation" / ชื่อเครือข่ายเสมือน "vnetforAutomation" / กลุ่มทรัพยากร "automation_mart"):
> network.SubnetsClient#CreateOrUpdate: การส่งคำขอล้มเหลว:
> StatusCode=0 -- ข้อผิดพลาดดั้งเดิม: Code="RequestDisallowedByPolicy"
> Message="Resource 'subnetforAutomation' ไม่ได้รับอนุญาตตามนโยบาย
> ตัวระบุนโยบาย:
> '[{\"policyAssignment\":{\"name\":\"Deny-Subnet-Without-Nsg\",\"id\":\"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/ ผู้ให้บริการ/Microsoft.Authorization/policyAssignments/Deny-Subnet-Without-Nsg\"},\"policyDefinition\":{\"name\":\"Subnets
> ควรมีกลุ่มความปลอดภัยเครือข่าย
> \",\"id\":\"/providers/Microsoft.Management/managementGroups/QSFT/providers/Microsoft.Authorization/policyDefinitions/Deny-Subnet-Without-Nsg\"}}]'"
> Target="subnetforAutomation"
> MoreInfo=[{"info":{"evaluationDetails":{"evaluatedExpressions":[{"expression":"type","expressionKind":"Field","expressionValue":"Microsoft.Network/virtualNetworks/subnets" ,"โอเปอเรเตอร์":"เท่ากับ","เส้นทาง":"ประเภท","ผลลัพธ์":"จริง","targetValue":"Microsoft.Network/virtualNetworks/subnets"},{"expression":"Microsoft.Network/ virtualNetworks/subnets/networkSecurityGroup.id","expressionKind":"Field","operator":"Exists","path":"properties.networkSecurityGroup.id","result":"True","targetValue":" false"}]},"policyAssignmentDisplayName":"Deny-Subnet-Without-Nsg","policyAssignmentId":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/providers/Microsoft.Authorization/policyAssignments/Deny-Subnet- ไม่มี Nsg","policyAssignmentName":"Deny-Subnet-Without-Nsg","policyAssignmentScope":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones","policyDefinitionDisplayName":"Subnets
> ควรมีกลุ่มความปลอดภัยเครือข่าย
> ","policyDefinitionEffect":"ปฏิเสธ","policyDefinitionId":"/providers/Microsoft.Management/managementGroups/QSFT/providers/Microsoft.Authorization/policyDefinitions/Deny-Subnet-Without-Nsg","policyDefinitionName":"ปฏิเสธ -Subnet-Without-Nsg"},"type":"PolicyViolation"}]
> 
>
> â กับ azurerm_subnet.subnet
> â บน main.tf บรรทัดที่ 24 ในทรัพยากร "azurerm_subnet" "subnet":
> â 24: ทรัพยากร "azurerm_subnet" "ซับเน็ต" {
>

ฉันพยายามรักษาอินไลน์ เครือข่ายย่อยภายใน vnet และตอนนี้ปัญหาก็มาถึงเมื่ออ้างอิงเครือข่ายย่อยจากบล็อกทรัพยากรอินสแตนซ์ VM ที่ขั้นตอนของแผนเอง

 ข้อผิดพลาด: แอตทริบิวต์ที่ไม่รองรับ
â
â บน network.tf บรรทัดที่ 26 ในทรัพยากร "azurerm_network_interface" "example":
â 26: subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
â
â ไม่สามารถเข้าถึงแอตทริบิวต์ในชุดของวัตถุ คุณต้องการเข้าถึงแอตทริบิวต์ในทุกองค์ประกอบในชุดหรือไม่
âµ

//main.tf

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
ทรัพยากร "azurerm_windows_virtual_machine" "ตัวอย่าง" {
  ชื่อ = var.machine_details.name
  ชื่อคอมพิวเตอร์ = var.machine_details.name
  resource_group_name = azurerm_resource_group.rg.name
  ตำแหน่ง = azurerm_resource_group.rg.location
  size = var.machine_details.size
  admin_username = var.machine_details.ชื่อผู้ใช้
  admin_password = var.machine_details.password
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    แคช = "อ่านเขียน"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    ผู้เผยแพร่ = "MicrosoftWindowsServer"
    ข้อเสนอ = "Windows Server"
    sku = "2019-ศูนย์ข้อมูล"
    รุ่น = "ล่าสุด"
  }
}

//network.tf

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
ทรัพยากร "azurerm_virtual_network" "vnet" {
  ชื่อ = "วีเน็ต"
  address_space = ["10.0.0.0/16"]
  ตำแหน่ง = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

ซับเน็ต{
 ชื่อ = "ภายใน"
 address_prefix = "10.0.2.0/24"
 security_group = azurerm_network_security_group.example.id
}

}


## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
ทรัพยากร "azurerm_network_interface" "ตัวอย่าง" {
  ชื่อ = "example-nic"
  ตำแหน่ง = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    ชื่อ = "ภายใน"
    subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
    private_ip_address_allocation = "ไดนามิก"
    public_ip_address_id = azurerm_public_ip.myvm1publicip.id
  }
}

ทรัพยากร "azurerm_public_ip" "myvm1publicip" {
  ชื่อ = var.public_ip.name
  ตำแหน่ง = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method = var.public_ip.allocation_method
  sku = var.public_ip.sku
}

ทรัพยากร "azurerm_network_security_group" "ตัวอย่าง" {
  ชื่อ = var.nsg
  ตำแหน่ง = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  security_rule {
    ชื่อ = "test123"
    ลำดับความสำคัญ = 100
    ทิศทาง = "ขาเข้า"
    การเข้าถึง = "อนุญาต"
    โปรโตคอล = "TCP"
    source_port_range = "*"
    destination_port_range = "*"
    source_address_prefix = "*"
    ปลายทาง_ที่อยู่_คำนำหน้า = "*"
  }
}

//provider.tf

## <https://www.terraform.io/docs/providers/azurerm/index.html>
ผู้ให้บริการ "azurerm" {
  คุณสมบัติ {}
}

//rg.tf

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
ทรัพยากร "azurerm_resource_group" "rg" {
  ชื่อ = "TerraformTesting2"
  สถานที่ = var.location
}

//variables.tf

ตัวแปร "สถานที่" {
  พิมพ์ = สตริง
  คำอธิบาย = "ภูมิภาค Azure ที่ซึ่งทรัพยากรทั้งหมดเหล่านี้จะได้รับการจัดสรร"
  ค่าเริ่มต้น = "eastus2"
}

ตัวแปร "public_ip" {
 

  ค่าเริ่มต้น = {
      ชื่อ = "pip1"
      allocation_method = "ไดนามิก"
      sku = "พื้นฐาน"
    }
  
  
}

ตัวแปร "nsg" {
  พิมพ์ = สตริง
  คำอธิบาย = "Azure NSG"
  ค่าเริ่มต้น = "ตัวอย่าง nsg"
}

ตัวแปร "machine_details" {
  
  ค่าเริ่มต้น = {
      ชื่อ = "ตัวอย่าง vm2"
      size = "Standard_E2s_v3" #"Standard_F2"
      ชื่อผู้ใช้ = "adminnasme"
      รหัสผ่าน = "MyPaword!@3"
    }
  
}
Mat avatar
cn flag
Mat
"เครือข่ายย่อยควรมีกลุ่มความปลอดภัยเครือข่าย"
Sara June avatar
cn flag
ฉันเพิ่มยังคงได้รับปัญหาเดียวกัน
Score:1
ธง ng

สร้างเครือข่ายย่อยไม่สำเร็จเนื่องจากไม่เป็นไปตามนโยบายที่ผู้ดูแลระบบของคุณใช้ สิ่งนี้บ่งชี้ว่าเครือข่ายย่อยต้องมี NSG นำไปใช้ก่อนที่จะสามารถสร้างได้ น่าเสียดายที่วิธีที่ Terraform สร้างทรัพยากรคือคุณต้องสร้างซับเน็ตก่อน แล้วจึงเชื่อมโยง NSG กับมัน นี่คือการเรียก API สองครั้ง และครั้งแรกล้มเหลวเนื่องจากไม่มี NSG ที่เกี่ยวข้อง นโยบายไม่ทราบว่ามีการโทรครั้งที่สองเพื่อเชื่อมโยง NSG กับซับเน็ต

นี่เป็นข้อเสียของวิธีที่ Terraform สร้างบน ARM API ไม่มีวิธีแก้ปัญหาที่ดีนอกจากให้ผู้ดูแลระบบผ่อนคลายนโยบายนี้

แก้ไข:

เลยมองว่า ปัญหานี้ ซึ่งค่อนข้างคล้ายกับที่คุณเห็น ดูเหมือนว่าคุณสามารถแก้ไขปัญหานี้ได้โดยกำหนดเครือข่ายย่อยภายในของคุณ virtual_network ทรัพยากรแทนที่จะเป็นทรัพยากรเครือข่ายย่อยที่แยกจากกัน เมื่อใช้สิ่งนี้ คุณสามารถกำหนดความสัมพันธ์แบบอินไลน์ของ NSG และอาจทำได้ในแคลอรีเดียว:

ทรัพยากร "azurerm_virtual_network" "ตัวอย่าง" {
  ชื่อ = "virtualNetwork1"
  สถานที่ = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space = ["10.0.0.0/16"]
  dns_servers = ["10.0.0.4", "10.0.0.5"]

  ddos_protection_plan {
    id = azurerm_network_ddos_protection_plan.example.id
    เปิดใช้งาน = จริง
  }


  เครือข่ายย่อย {
    ชื่อ = "subnet3"
    address_prefix = "10.0.3.0/24"
    security_group = azurerm_network_security_group.example.id
  }

  แท็ก = {
    สิ่งแวดล้อม = "การผลิต"
  }
}
Sara June avatar
cn flag
ขอบคุณสำหรับคำตอบของ Sam แต่ทีมรักษาความปลอดภัยของเราไม่อนุญาตให้แก้ปัญหานี้ มีวิธีอื่นนอกเหนือจากการข้ามนโยบายนี้หรือไม่
ng flag
ดูการแก้ไข การกำหนดทุกอย่างในบรรทัดของวัตถุเครือข่ายเสมือนที่ฉันคิดว่าอาจใช้งานได้ หากไม่เป็นเช่นนั้น วิธีเดียวที่จะทำได้คือสร้างเทมเพลต ARM และเรียกสิ่งนี้โดยใช้ทรัพยากรเทมเพลต Terraform ARM หรือสคริปต์โดยใช้ตัวเลือก exec ในเครื่อง
Sara June avatar
cn flag
สวัสดี @sam-cogan ฉันได้ลองเก็บซับเน็ตในส่วน vnet แล้ว แต่ได้รับข้อผิดพลาดระหว่างแผนเอง คุณช่วยดูรายละเอียดที่ฉันเพิ่มไว้ด้านบนได้ไหม
Sara June avatar
cn flag
ดูเหมือนว่าจะใช้งานได้ถ้าฉันเข้าถึงเป็น azurerm_virtual_network.vnet.subnet.*.id[0]
Score:0
ธง al

เมื่อพบปัญหาเดียวกัน เราได้กำหนดนโยบายใหม่ด้วยการดำเนินการ 'ตรวจสอบ' แทน 'ปฏิเสธ' หากคุณมีสิทธิ์ที่จะทำเช่นนั้น

โพสต์คำตอบ

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