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 状态。 (替换了一些资源)
我试过了
- 从门户重述功能应用程序
- 删除所有函数然后重新部署它们(我在重新部署之前删除了
dist
文件夹以确保只有新文件)
- 强制重新部署 App Service Plan 和 Function App(通过在 Terraform 中更改其名称),然后重新部署相同的功能。
- 将应用程序服务计划 OS 更改为 Windows。 (相同的结果)
- 同时使用
process.env.KEY
和 process.env["KEY"]
访问环境
我不确定我做错了什么或者我应该下一步尝试,请指教,谢谢!
更新
我尝试仅使用 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 门户中配置它
我正在将 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 状态。 (替换了一些资源)
我试过了
- 从门户重述功能应用程序
- 删除所有函数然后重新部署它们(我在重新部署之前删除了
dist
文件夹以确保只有新文件) - 强制重新部署 App Service Plan 和 Function App(通过在 Terraform 中更改其名称),然后重新部署相同的功能。
- 将应用程序服务计划 OS 更改为 Windows。 (相同的结果)
- 同时使用
process.env.KEY
和process.env["KEY"]
访问环境
我不确定我做错了什么或者我应该下一步尝试,请指教,谢谢!
更新
我尝试仅使用 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 门户中配置它