【发布时间】:2021-09-12 03:21:42
【问题描述】:
我正在将 HTTP 触发器函数部署到 Azure 函数,但是当我尝试访问 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] 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 门户中的 Monitor > Logs of individual function)
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 中添加了合并环境变量。
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 中看到的所有 env 值均由 Terraform 设置。
附加信息
起初,我通过 VSCode 扩展创建了所有资源。但后来使用上述配置导入到 Terraform 状态。 (部分资源被替换)
我试过了
- 从门户重述 Function App
- 删除所有函数,然后重新部署它们(我在重新部署之前删除了
dist文件夹,以确保只有新文件) - 强制应用服务计划和函数应用重新部署(通过在 Terraform 中更改其名称),然后重新部署相同的函数。
- 将应用服务计划操作系统更改为 Windows。 (结果相同)
- 使用
process.env.KEY和process.env["KEY"]访问环境
我不确定我做错了什么或者我应该尝试下一个,请指教,谢谢!
更新
我尝试仅使用 VSCode 将其部署到单独的资源组(资源不是由 Terraform 创建的)并且它有效!这绝对是我的 Terraform 配置的问题(因此添加了 terraform 标签)。因此,与此同时,我将尝试将我的 Terraform 配置与 VSCode 扩展自动创建的配置进行比较。
【问题讨论】:
-
从 VSCode 生成的函数应用中导出一个 ARM 模板,并将其与您的 Terraform 配置进行比较,看看有什么不同。或者你也可以从 terraformed 函数应用中导出一个 ARM 模板并比较这两个模板,然后逆向工程回到 terraform
-
@pkatsourakis 谢谢,我只是使用类似于您建议的方法解决了这个问题。将资源导入 Terraform 状态并将其与我的设置与 Terraform 计划进行比较。而且我注意到配置有所不同!
标签: javascript node.js azure azure-functions terraform