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

如何通过Terraform在Azure Web PubSub中启用Socket.IO?

问题:Terraform创建Azure Web PubSub for Socket.IO失败

我正尝试通过Terraform创建支持Socket.IO的Azure Web PubSub服务,但始终无法正常启用Socket.IO功能。当前配置仅能创建原生Web PubSub服务,而非「Web PubSub for Socket.IO」,配置代码如下:

resource "azurerm_web_pubsub" "websocket-webpubsub" {
  name                = "cca-${var.EnvironmentShort}"
  location            = azurerm_resource_group.wps-rg.location
  resource_group_name = azurerm_resource_group.wps-rg.name
  sku                = "Free_F1"
  capacity           = 1

  identity {
    type = "SystemAssigned"
  }

  live_trace {
    enabled                   = true
    messaging_logs_enabled    = true
    connectivity_logs_enabled = true
  }

  public_network_access_enabled = true

  tags = local.common_tags
}

resource "azurerm_web_pubsub_hub" "socketio" {
  name          = "socketio"
  web_pubsub_id = azurerm_web_pubsub.websocket-webpubsub.id
  event_handler {
    url_template       = "https://${azurerm_linux_web_app.websocket-app.default_hostname}/api/socket"
    user_event_pattern = "*"
    system_events      = ["connect", "connected", "disconnected"]
  }
}

我已尝试以下操作:

  • 使用「EnableSocketio」特性标记
  • 创建Socket.IO专用hub
  • 配置事件处理程序与上游设置
  • 使用AZAPI部署资源,但出现错误,示例错误日志:
Error: Invalid body
with module.websocket-test.azapi_resource.websocket-webpubsub
on ../../modules/websocket/main.tf line 102, in resource "azapi_resource" "websocket-webpubsub":
resource "azapi_resource" "websocket-webpubsub" {
The argument "body" is invalid: unmarshaling failed: value: "{\"properties\":{\"features\":[{\"flag\":\"SocketIO\",\"value\":\"Enabled\"}],\"publicNetworkAccess\":\"Enabled\",\"tls\":{\"clientCertEnabled\":false}},\"sku\":{\"capacity\":1,\"name\":\"Free_F1\",\"tier\":\"Free\"}}", err: json: cannot unmarshal string into Go value of type map[string]interface {}

但部署后仍仅创建原生Web PubSub API服务。相关Terraform与Azure文档缺少Socket.IO相关内容,请问当前方法是否正确?是否需额外配置,或有无需通过Azure门户的替代方案?


解决方案

当前原生azurerm_web_pubsub资源暂不支持直接配置Socket.IO特性,必须使用azapi_resource来部署,你遇到的AZAPI错误核心原因是body参数传入了JSON字符串而非Terraform映射格式。

正确的AZAPI配置方式

使用azapi_resource时,body需要用Terraform的map结构定义,而非JSON字符串,示例配置如下:

resource "azapi_resource" "websocket-webpubsub" {
  type      = "Microsoft.SignalRService/webPubSub@2023-02-01"
  name      = "cca-${var.EnvironmentShort}"
  location  = azurerm_resource_group.wps-rg.location
  parent_id = azurerm_resource_group.wps-rg.id
  sku_name  = "Free_F1"
  sku_tier  = "Free"
  capacity  = 1

  body = {
    properties = {
      features = [
        {
          flag  = "SocketIO"
          value = "Enabled"
        }
      ]
      publicNetworkAccess = "Enabled"
      tls = {
        clientCertEnabled = false
      }
    }
    identity = {
      type = "SystemAssigned"
    }
  }

  tags = local.common_tags
}

# 配套的Socket.IO Hub配置
resource "azurerm_web_pubsub_hub" "socketio" {
  name          = "socketio"
  web_pubsub_id = azapi_resource.websocket-webpubsub.id
  event_handler {
    url_template       = "https://${azurerm_linux_web_app.websocket-app.default_hostname}/api/socket"
    user_event_pattern = "*"
    system_events      = ["connect", "connected", "disconnected"]
  }
}

关键注意事项

  1. API版本选择:必须使用2023-02-01及以上版本的Microsoft.SignalRService/webPubSub API,旧版本不支持Socket.IO特性。
  2. Hub命名要求:Socket.IO服务必须使用名为socketio的Hub,这是Azure的强制要求,不能自定义其他名称。
  3. SKU限制:免费层(Free_F1)支持Socket.IO功能,后续若需更高性能,可切换到Standard_S1等付费SKU。
  4. 事件处理程序配置:确保上游服务的URL可正常访问,Socket.IO的连接、断开等系统事件需要正确路由到你的后端服务。

验证部署结果

部署完成后,可通过Azure CLI命令验证Socket.IO特性是否启用:

az webpubsub show --name <your-service-name> --resource-group <your-rg-name> --query "properties.features[?flag=='SocketIO'].value"

如果返回["Enabled"],说明配置成功。


内容的提问来源于stack exchange,提问作者Rahula Palu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:02:04