You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中实现重试模式,获取Azure AKS异步创建的NSG资源?

解决方案

方案1:使用ARM部署模板内置的资源等待逻辑(完全声明式,无外部依赖)

本方案完全基于官方azurerm provider实现,不需要自定义provider、本地脚本或额外工具,利用Azure ARM模板的原生能力等待NSG资源就绪,支持自定义超时时间,最长可匹配你遇到的40分钟等待场景,完全符合Terraform声明式配置的理念。
核心思路是将NSG查询逻辑封装为单个ARM模板部署资源,ARM模板的资源引用函数在查询不存在的资源时会自动重试,直到资源就绪或达到超时阈值,最终输出NSG的ID供后续流日志配置使用。
示例代码如下:

# 你已有的AKS集群定义
resource "azurerm_kubernetes_cluster" "example" {
  name                = "example-aks"
  location            = var.location
  resource_group_name = var.rg_name
  # 其余AKS配置省略
}

# 等待NSG就绪的ARM部署资源
resource "azurerm_resource_group_template_deployment" "wait_for_aks_nsg" {
  name                = "wait-for-aks-nsg"
  # 直接绑定AKS自动生成的节点资源组
  resource_group_name = azurerm_kubernetes_cluster.example.node_resource_group
  deployment_mode     = "Incremental"

  template_content = <<EOF
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [],
  "outputs": {
    "aksNsgId": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Network/networkSecurityGroups', first(resourceGroup().resources)), '2022-07-01', 'Full').id]"
    },
    "aksNsgName": {
      "type": "string",
      "value": "[first(resourceGroup().resources).name]"
    }
  }
}
EOF
  # 可根据实际需求调整最长等待时间
  timeouts {
    create = "40m"
    update = "40m"
  }
}

查询到的NSG ID可以通过azurerm_resource_group_template_deployment.wait_for_aks_nsg.outputs.aksNsgId直接获取,供后续Network Watcher流日志配置使用,兼容自定义VNet部署的AKS场景,不需要提前知道NSG的名称。

方案2:单行CLI重试(无独立脚本文件)

如果你的执行环境预装了Azure CLI,也可以用单个null_resource实现等待逻辑,不需要单独维护外部脚本文件,比你当前使用的重复重试代码简洁很多:

resource "null_resource" "wait_for_aks_nsg" {
  depends_on = [azurerm_kubernetes_cluster.example]
  triggers = {
    node_rg = azurerm_kubernetes_cluster.example.node_resource_group
  }
  provisioner "local-exec" {
    command = <<EOT
      until az resource list --resource-group ${self.triggers.node_rg} --resource-type Microsoft.Network/networkSecurityGroups --query "[0].id" -o tsv; do
        echo "NSG未就绪,30秒后重试"
        sleep 30
      done
    EOT
    timeout = "40m"
  }
}

# 后续查询NSG直接依赖上述资源即可
data "azurerm_network_security_group" "aks_nsg" {
  depends_on = [null_resource.wait_for_aks_nsg]
  resource_group_name = azurerm_kubernetes_cluster.example.node_resource_group
  name = regex("[^/]+$", chomp(data.external.get_nsg.result.nsg_id))
}

内容的提问来源于stack exchange,提问作者Al Baymar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:06:05