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

phw*_*hwt 6 javascript azure node.js terraform azure-functions

我正在将 HTTP 触发器函数部署到 Azure Function,但是当我尝试访问其中的条目时,process.env它会返回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;
Run Code Online (Sandbox Code Playgroud)

本地运行

当本地运行时,它会输出值设置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)
Run Code Online (Sandbox Code Playgroud)

在 Azure 上运行

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

2021-09-11T13:26:40Z   [Information]   HTTP trigger function processed a request.
2021-09-11T13:26:40Z   [Information]   undefined
Run Code Online (Sandbox Code Playgroud)

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

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

我很好奇它会影响其他环境所以我试图注销整个process.env

context.log(process.env)
Run Code Online (Sandbox Code Playgroud)

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

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' }
Run Code Online (Sandbox Code Playgroud)

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

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

Azure 门户

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

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;
Run Code Online (Sandbox Code Playgroud)

部署方式

我使用 Terraform 进行配置,如maximivanov/deploy-azure-functions-with-terraform [GitHub]中所示,并在app_settings.

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)
}

Run Code Online (Sandbox Code Playgroud)
function_config = {
  LINE_NOTIFY_TOKEN               = ""
  GCP_SERVICE_ACCOUNT_PRIVATE_KEY = ""
  GCP_SERVICE_ACCOUNT_EMAIL       = ""
}
Run Code Online (Sandbox Code Playgroud)

您在 Portal 和 Kudu 中看到的上述所有 env 值均由 Terraform 设置。

附加信息

首先,我通过 VSCode 扩展创建了所有资源。但后来用上面的配置导入到Terraform状态。(部分资源已被替换)


我努力了

  • 从门户重新启动 Function App
  • 删除所有函数,然后重新部署它们(我dist在重新部署之前删除了文件夹以确保只有新文件)
  • 强制重新部署应用程序服务计划和功能应用程序(通过在 Terraform 中更改其名称),然后重新部署相同的功能。
  • 将应用服务计划操作系统更改为 Windows。(结果相同)
  • process.env.KEY使用和访问环境process.env["KEY"]

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


更新

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

phw*_*hwt 3

经过近 5 个小时的尝试修复。我发现这是功能应用程序中缺少的配置。

FUNCTIONS_WORKER_RUNTIME需要设置为node(直接从 Visual Studio Code Extension 部署资源时,这是自动完成的)

如果您使用 Terraform

resource "azurerm_function_app" "function" {
  # Other arguments

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "node"
    "SOME_OTHER_SETTINGS"      = "..."
  }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述