🌊

[Terraform] Azure Functions -> 503 Service Unavailable (Azure)

2023/02/25に公開

サマリ

Terraform で Azure Functions を構築してアクセスすると 503 Service Unavailable が発生しました。
なんだか少し可愛らしいエラー画面ですね。

503エラー

そんな可愛らしさとは裏腹に、原因追及は非常に困難でした。
さて、原因は何だったでしょうか。

答えは.NET のバージョンが指定されていないからでした。

なぜ、これでプロビジョニングできたか

これが謎。

Azure ポータルからリソースを作成しようとするとこのようなことは発生しませんでした。
しかし、Terraform でazurerm_linux_function_appを使用し、dotnet_versionを指定しないでプロビジョニングすると、503 エラーが発生しました。

旧来のazurerm_function_appでは、プロビジョニング時にエラーが発生します。
しかし、4.0 から推奨されたazurerm_linux_function_appでは、プロビジョニングは成功します。
プロビジョニングには成功して、実行時に 503 エラーのみを出力するため、原因追及が困難でした。

ChatGPT に聞いてみても、回答してくれませんでした。
これは ChatGPT が使用しているデータモデルが古いため、azurerm_linux_function_appの動作については理解していないからでしょう。


運よくdotnet_versionを指定したことろ、プロビジョニングが成功し、503 エラーが解消されました。

コード例

resource "azurerm_linux_function_app" "function_app" {
  name                       = var.function_app_name
  location                   = azurerm_resource_group.resource_group.location
  resource_group_name        = azurerm_resource_group.resource_group.name
  service_plan_id            = azurerm_service_plan.service_plan.id
  storage_account_name       = azurerm_storage_account.storage_account.name
  storage_account_access_key = azurerm_storage_account.storage_account.primary_access_key

  site_config {
    application_stack {
      dotnet_version = "6.0" // 🐙これがないと503エラーが発生する!
    }
  }

  app_settings = {
    "MY_ENV" = "my-env"
  }

  connection_string {
    name      = "MY_CONNECTION_STRING"
    type      = "MySql"
    value     = "Server=${azurerm_mariadb_server.db_server.name}.mariadb.database.azure.com;Database=${azurerm_mariadb_database.db_database.name};Uid=${var.mariadb_admin_username}@${azurerm_mariadb_server.db_server.name};Pwd=${var.mariadb_admin_password}"
  }

  virtual_network_subnet_id = azurerm_subnet.subnet.id
}

Discussion