phw*_*hwt 6 javascript azure node.js terraform azure-functions
我正在将 HTTP 触发器函数部署到 Azure Function,但是当我尝试访问其中的条目时,process.env它会返回undefined. 它可以在本地模拟器中运行,但在部署到 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 上运行时,它会输出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 门户的“配置”选项卡中
另外,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状态。(部分资源已被替换)
dist在重新部署之前删除了文件夹以确保只有新文件)process.env.KEY使用和访问环境process.env["KEY"]我不确定我做错了什么,或者我应该下一步尝试,请指教,谢谢!
我尝试仅使用 VSCode 将其部署到单独的资源组(资源不是由 Terraform 创建),并且它有效!这绝对是我的 Terraform 配置的问题(因此添加标签terraform)。因此,与此同时,我将尝试将我的 Terraform 配置与 VSCode 扩展自动创建的配置进行比较。
经过近 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 门户中配置它
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |