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

标签 javascript node.js azure azure-functions terraform

我正在将 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;

本地运行

本地运行时,它会输出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] <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d2a1b7a0a4bbb1b78db3b1b1bda7bca692bebdb1b3befca1b7a6a6bbbcb5a1fcb8a1bdbc" rel="noreferrer noopener nofollow">[email protected]</a>
[2021-09-11T13:41:27.848Z] Executed 'Functions.HttpTrigger' (Succeeded, Id=b9a303aa-5d14-403c-b841-4851f00beb65, Duration=126ms)

在 Azure 上运行

但是当在 Azure 上运行时,它输出未定义(来自 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 门户的配置选项卡中

Azure Portal

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

{
  "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 中添加了合并环境变量。

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状态。 (部分资源被替换)

<小时/>

我已经尝试过

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

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

<小时/>

更新

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

最佳答案

尝试修复问题近 5 个小时后。我发现这是 Function App 中缺少的配置。

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"      = "..."
  }
}

如果未在 Azure 门户中进行配置

enter image description here

关于javascript - process.env 中的用户定义键在 JavaScript Azure Functions 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69143758/

相关文章:

javascript - 使用静态字段为 React 组件创建流类型

javascript - 在浏览器中更改 URL 参数时进行 Angular 页面刷新

javascript - Predix UI Seed 应用程序 - 从 url 中删除哈希

sql - Microsoft Access 和 SQL Azure 性能问题

azure - 从 Grafana 中的值中删除单位 (Mb/s)

对象值的 Javascript Sum 数组

javascript - 两个场景三个js : CubeGeometry and PointsGeometry - only one appears

node.js - Verdaccio 从互联网访问

javascript - 如何使用 localhost 在浏览器中运行 Web 应用程序?

azure - 如何在 Azure 数据工厂中的接收器表上插入之前验证多个表