如何使用 Terraform azurerm_app_service 指定 .net 核心版本

Posted

技术标签:

【中文标题】如何使用 Terraform azurerm_app_service 指定 .net 核心版本【英文标题】:How to specify .net core version with Terraform azurerm_app_service 【发布时间】:2019-10-27 14:46:35 【问题描述】:

开箱即用,我认为azurerm_app_service 提供程序确实允许我们通过使用dotnet_framework_version 字段来指定.Net 框架版本。

dotnet_framework_version -(可选).net 的版本 此应用服务中使用的框架的 CLR。可能的值为 v2.0 (它将使用 .net 的最新版本的 .net 框架 CLR v2 - 当前为 .net 3.5)和 v4.0(对应于最新的 .net CLR v4 的版本 - 在撰写本文时是 .net 4.7.1)。有关根据您所针对的 .net 框架使用哪个 .net CLR 版本的更多信息 - 请参阅此表。默认值 到 v4.0。

https://www.terraform.io/docs/providers/azurerm/r/app_service.html#dotnet_framework_version

文档说可能的值为 v2.0 或 v4.0。

但是,如果我的目标是 .NET Core,比如 v2.2,那该怎么办?我应该在这里做什么?

Azure 门户允许从下拉菜单中选择 .NET Core。 (见下面的截图)

我不确定 Terraform azurerm_app_service 是否也有办法做到这一点。

【问题讨论】:

如果它像 IIS 一样工作,那么我认为您不需要(也不希望)指定此属性,因为它不会使用它。我认为当您不指定它时,它会像 IIS 中的“无托管代码”一样。他们应该在文档中向这个属性添加额外的信息。只需在 Runtime Stack 框中选择 .NET Core 2.2。参见docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/…上的#6 我认为您不必担心这一点。默认情况下,我相信这些应用服务实例总是会安装 .NET Core,所以这取决于你的应用将使用哪个版本。 你是怎么解决这个问题的? 我不同意“我认为你不必担心这个”的评论。在查看仪表板中的常规设置时,查看 Stack = ".NET" 和 .NET Framework version = "V4.*" 会给运行时环境带来不准确的印象。我也想在我的 Terraform 脚本中指定它。 【参考方案1】:

您需要在 app_service 块的 site_config 块中指定以下 2 个设置。例如

resource "azurerm_app_service" "app_service" 
  name                = local.graphql_server_long_name
  location            = var.azure_region
  resource_group_name = azurerm_resource_group.rg.name
  app_service_plan_id = azurerm_app_service_plan.graphql_server.id
  site_config 
    linux_fx_version = "DOTNETCORE|5.0"
    dotnet_framework_version = "v5.0"
  

它们是linux_fx_versiondotnet_framework_version

您需要运行至少 2.38.0 版本的 azurerm 提供程序。您可以通过在包含您的 terraform 文件的目录中运行以下命令来检查这一点: terraform version

这将显示 terraform cli 和所有使用的提供程序。

【讨论】:

这是不正确的 - 你不能同时指定【参考方案2】:

您可以尝试使用 Azure CLI 查询 AppService/WebApp 的可用运行时。

https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest#az-webapp-list-runtimes

或者

您可以将应用服务配置为使用带有 .NET Core 的应用容器。这将允许您通过 Dockerfile 指定 .NET Core 版本。缺点是您需要某种注册表(Azure Container Registry)。

【讨论】:

【参考方案3】:

在应用服务中托管 .NET 核心应用程序有 2 个可用选项:

    Windows 应用服务计划。 Linux 应用服务计划(默认选项,在 Azure 门户上创建应用服务时)。

如果您使用的是 Windows 应用服务计划,则需要指定 dotnet_framework_version,正如您所提到的,只有 2 个可用选项 - v2.0 和 v4.0。

相反,您可以使用 Linux 应用服务计划并在linux_fx_version 字段中指定 .net 版本(dotnet_framework_version 应为空)。 有点这样的:

resource "azurerm_app_service" "stackoverlow_service" 
  name = "stackoverlow-test-net-version"
  location = "centralus"
  resource_group_name = "resource_group_name"
  app_service_plan_id = "app_service_plan_id"

  site_config 
    linux_fx_version = "DOTNETCORE|2.2"
    min_tls_version = "1.2"
    always_on = true
    scm_type = "None"
    managed_pipeline_mode = "Integrated"
    websockets_enabled = false
    use_32_bit_worker_process = true
  

应用服务是一个非常复杂的产品,有许多配置选项,Azure/terraform 文档并不能很好地涵盖所有方面。 要生成所需的配置,您可以在 Azure 中创建应用服务并将资源导入 terraform:

    在 terraform 中创建最少的正确应用服务资源。 在 Azure 门户中创建具有所需配置的应用服务。 使用terraform import 命令导入资源:terraform import azurerm_app_service.stackoverlow_service /subscriptions/....。 运行 terraform plan 以查看确切差异或检查 terraform 状态文件。

【讨论】:

以上是关于如何使用 Terraform azurerm_app_service 指定 .net 核心版本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 公开 gcp 云功能

如何安装多个或两个版本的 Terraform?

如何使用 Terraform 配置 AWS EKS 自动扩缩器?

Terraform-如何避免使用单一状态文件进行破坏和创建

如何发现现有的 Terraform 版本

如何使用 terraform 生成 yml 配置文件