process.env 中的用户定义键在 JavaScript Azure Functions 中未定义

User-defined keys in process.env is undefined in JavaScript Azure Functions

我正在将 HTTP 触发器函数部署到 Azure Function,但是当我尝试访问 process.env 中的条目时,它 returns undefined。它在本地模拟器中确实有效,但在部署在 Azure 上时无效。


在本地和 Azure 上测试 运行 函数。

我已经用一个非常简单的 HTTP 函数对其进行了测试。

import { AzureFunction, Context, HttpRequest } from "@azure/functions";

const httpTrigger: AzureFunction = async function (
  context: Context,
  req: HttpRequest
): Promise<void> {
  context.log(process.env.GCP_SERVICE_ACCOUNT_EMAIL);

  context.res = {
    body: process.env.GCP_SERVICE_ACCOUNT_EMAIL,
  };
};

export default httpTrigger;

运行宁本地

当运行 locally 输出local.settings.json

中设置的值
[2021-09-11T13:41:27.737Z] Executing 'Functions.HttpTrigger' (Reason='This function was programmatically called via the host APIs.', Id=b9a303aa-5d14-403c-b841-4851f00beb65)
[2021-09-11T13:41:27.768Z] service_account@local.settings.json
[2021-09-11T13:41:27.848Z] Executed 'Functions.HttpTrigger' (Succeeded, Id=b9a303aa-5d14-403c-b841-4851f00beb65, Duration=126ms)

运行 在 Azure

但是当 运行 在 Azure 上时,它输出 undefined(来自 Azure 门户中的监视器 > 单个功能的日志)

2021-09-11T13:26:40Z   [Information]   HTTP trigger function processed a request.
2021-09-11T13:26:40Z   [Information]   undefined

(我从门户网站通过 URL 运行 它,响应是 500

记录整个 process.env(在 Azure 上)

我很好奇它是否会影响其他环境,所以我正在尝试注销整个 process.env

context.log(process.env)

如您所见,不存在任何一个自定义环境。 (我省略了一些值)

2021-09-11T13:26:40Z   [Information]   HTTP trigger function processed a request.
2021-09-11T13:26:40Z   [Information]   { ServiceName: 'service',
  PWD: '/',
  Fabric_NetworkingMode: 'Other',
  Fabric_Id: '',
  ASPNETCORE_URLS: 'http://localhost:9091',
  AzureWebJobsScriptRoot: '/home/site/wwwroot',
  Fabric_ServiceName: 'service',
  CONTAINER_NAME: '',
  Fabric_Epoch: '',
  SUDO_UID: '0',
  Fabric_NodeIPOrFQDN: '',
  HOST_VERSION: '3.1.4.0',
  MESH_INIT_URI: '',
  DOTNET_USE_POLLING_FILE_WATCHER: 'true',
  SHLVL: '0',
  Fabric_ApplicationName: '',
  Fabric_CodePackageName: '',
  Fabric_ReplicaId: '',
  SUDO_COMMAND:
   '/azure-functions-host/Microsoft.Azure.WebJobs.Script.WebHost',
  Location: '',
  WEBSITE_HOME_STAMPNAME: '',
  ASPNETCORE_VERSION: '3.0.0',
  ResourceGroupName: '',
  TERM: 'xterm',
  languageWorkers__python__defaultRuntimeVersion: '3.6',
  HOME: '/home',
  LANG: 'C.UTF-8',
  Fabric_ServiceDnsName: '',
  LocalSitePackagesPath: '',
  CodePackageName: '',
  CONTAINER_IMAGE_URL: '',
  SubscriptionId:
   '',
  SUDO_GID: '0',
  WEBSITE_PLACEHOLDER_MODE: '1',
  CONTAINER_ENCRYPTION_KEY: '',
  ResourceName: '',
  ResourceType: '',
  WEBSITE_CLOUD_NAME: '',
  WEBSITE_STAMP_DEPLOYMENT_ID: '',
  USER: 'app',
  DOTNET_RUNNING_IN_CONTAINER: 'true',
  JAVA_HOME: '/usr/lib/jvm/zre-8-azure-amd64',
  SUDO_USER: 'root',
  SHELL: '/bin/bash',
  Fabric_ReplicaName: '0',
  HOSTNAME: '',
  PATH: '',
  CONTAINER_START_CONTEXT_SAS_URI: '',
  LOGNAME: 'app',
  _: '/usr/bin/setsid',
  FUNCTIONS_WORKER_DIRECTORY: '/azure-functions-host/workers/node' }

验证应用程序设置是否正确

您可以在 Function App 门户的配置 选项卡中看到该条目

同样在 https://[function-app-name].scm.azurewebsites.net/api/settings 中,您可以看到密钥存在(我省略了值,因为它很敏感)

{
  "deployment_branch": "master",
  "SCM_TRACE_LEVEL": "Verbose",
  "SCM_COMMAND_IDLE_TIMEOUT": "60",
  "SCM_LOGSTREAM_TIMEOUT": "7200",
  "SCM_BUILD_ARGS": "",
  "SCM_USE_LIBGIT2SHARP_REPOSITORY": "0",
  "APPINSIGHTS_INSTRUMENTATIONKEY": "",
  "AzureWebJobsDashboard": "",
  "AzureWebJobsStorage": "",
  "FUNCTIONS_EXTENSION_VERSION": "",
  "GCP_SERVICE_ACCOUNT_EMAIL": "",
  "GCP_SERVICE_ACCOUNT_PRIVATE_KEY": "",
  "LINE_NOTIFY_TOKEN": "",
  "WEBSITE_RUN_FROM_PACKAGE": "",
  "AzureWebJobs.TimerTrigger.Disabled": "",
  "ScmType": "",
  "WEBSITE_SITE_NAME": "",
  "WEBSITE_AUTH_ENABLED": "",
  "WEBSITE_SLOT_NAME": "",
  "SCM_RUN_FROM_PACKAGE": "",
  "REMOTEDEBUGGINGVERSION": "",
  "FUNCTIONS_RUNTIME_SCALE_MONITORING_ENABLED": "",
  "WEBSITE_AUTH_LOGOUT_PATH": "",
  "WEBSITE_AUTH_AUTO_AAD": "e"
}

部署方式

我将 Terraform 与 maximivanov/deploy-azure-functions-with-terraform [GitHub] 中的配置一起使用,并在 app_settings.[= 中添加合并环境变量35=]

variable "function_config" {
  type = map(string)
}

resource "azurerm_function_app" "function_app" {
  # Other arguments is the same as in the repo

  app_settings = merge({
    "APPINSIGHTS_INSTRUMENTATIONKEY" = azurerm_application_insights.appInsights.instrumentation_key
    "WEBSITE_RUN_FROM_PACKAGE"       = ""
  }, var.function_config)
}

function_config = {
  LINE_NOTIFY_TOKEN               = ""
  GCP_SERVICE_ACCOUNT_PRIVATE_KEY = ""
  GCP_SERVICE_ACCOUNT_EMAIL       = ""
}

您在 Portal 和 Kudu 中看到的以上所有环境值均由 Terraform 设置。

附加信息

起初,我通过 VSCode 扩展创建了所有资源。但后来使用上述配置导入到 Terraform 状态。 (替换了一些资源)


我试过了

我不确定我做错了什么或者我应该下一步尝试,请指教,谢谢!


更新

我尝试仅使用 VSCode(资源不是由 Terraform 创建的)将它部署到单独的资源组并且它有效!这绝对是我的 Terraform 配置的问题(因此添加了 terraform 标签)。因此,与此同时,我将尝试将我的 Terraform 配置与 VSCode 扩展自动创建的配置进行比较。

在尝试修复将近 5 小时后。我发现是功能应用程序中缺少配置。

FUNCTIONS_WORKER_RUNTIME 需要设置为 node(这是在直接从 Visual Studio 代码扩展部署资源时自动完成的)

如果您使用的是 Terraform

resource "azurerm_function_app" "function" {
  # Other arguments

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "node"
    "SOME_OTHER_SETTINGS"      = "..."
  }
}

如果没有在 Azure 门户中配置它