【问题标题】:Setting Connection String as App Setting/Environment Variable in Azure Function在 Azure 函数中将连接字符串设置为应用程序设置/环境变量
【发布时间】:2020-03-20 21:44:38
【问题描述】:

在我的 Azure 函数中,我为数据库连接字符串指定了环境变量/应用程序设置。当我使用 VS Code 和 Python 在 Azure 数据科学虚拟机上本地运行函数时,我可以使用环境变量。

但是,当我将函数部署到 Azure 时,出现错误:KeyValue is None,这意味着它找不到连接字符串的环境变量。查看错误:

Exception while executing function: Functions.matchmodel Result: Failure
Exception: KeyError: 'CONNECTIONSTRINGS:PDMPDBCONNECTIONSTRING'
Stack:   File "/azure-functions 
  host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", line 315, in 
  _handle__invocation_request self.__run_sync_func, invocation_id, fi.func, args)
File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
  result = self.fn(*self.args, **self.kwargs)
File "/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", 
  line 434, in __run_sync_func
  return func(**params)
File "/home/site/wwwroot/matchmodel/__init__.py", line 116, in main
File "/home/site/wwwroot/matchmodel/production/dataload.py", line 28, in query_dev_database
  setting = os.environ["CONNECTIONSTRINGS:PDMPDBCONNECTIONSTRING"]
File "/usr/local/lib/python3.7/os.py", line 679, in __getitem__
  raise KeyError(key) from None'

我尝试了以下解决方案:

  • 添加了“CONNECTIONSTRINGS”以在 Python 脚本中指定环境变量(使其在本地工作) setting = os.environ["CONNECTIONSTRINGS:PDMPDBCONNECTIONSTRING"]

  • 使用logging.info(os.environ) 在控制台中输出我的环境变量。我的连接字符串已列出。

  • 在 Azure Function 门户中添加了连接字符串作为应用程序设置。

  • 在 Azure Function 门户中添加了连接字符串作为连接字符串。

谁有我可以尝试的其他解决方案?

【问题讨论】:

  • 您可以尝试从环境变量的名称中删除CONNECTIONSTRINGS:: 可能会导致问题,我相信主要是在 Linux 应用程序服务计划上。注意在您的代码和 AppService 的应用程序设置中删除它。
  • 我必须添加 CONNECTIONSTRINGS: 才能让它在本地运行。在我添加密钥名称之前,它不会在本地运行。
  • 现在有更新吗?
  • 我能够编辑 local.settings.json 以删除 CONNECTIONSTRINGS:。我嵌套了 JSON 并删除了它。现在它只使用"PDMPDBCONNECTIONSTRING" 在本地运行。仍然试图让它在 Azure 上作为 Function 运行。

标签: python azure environment-variables azure-functions appsettings


【解决方案1】:

实际上你几乎得到了正确的连接字符串,但是你使用了错误的前置字符串。更多详细信息可以参考这个文档:Configure connection strings

使用哪个字符串取决于您选择的类型,就像在我的测试中我使用自定义类型一样。然后我应该使用os.environ['CUSTOMCONNSTR_testconnectionstring'] 来获取值。

从文档中您可以找到以下类型:

  • SQL Server:SQLCONNSTR_
  • MySQL:MYSQLCONNSTR_
  • SQL 数据库:SQLAZURECONNSTR_
  • 自定义:CUSTOMCONNSTR_

【讨论】:

  • 我试过带前缀和不带前缀。当我在没有前缀的情况下部署它时,会自动添加前缀。当我将print(os.environ) 转到控制台时,我可以在那里看到前缀,我可以使用func.HttpResponse(print(os.environ)) 在 Azure Portal App Insights 中查看该前缀。我可以看到正确的环境变量,但连接仍然无法正常工作。
  • 那么你又遇到了一个新问题:无法用连接字符串连接数据库?因为这是不同的问题,假设您应该创建一个新问题。如果这可以帮助你,你可以接受它作为答案。
  • 我认为您不必指定连接字符串的类型。这会根据您在门户中的设置自动获取。
  • 我就一个稍微不同的问题发表了一篇新文章。可以的话请回复! stackoverflow.com/questions/60893887/…
  • 所以你已经用我的方式解决了你的问题,如果这可以帮助你,你可以接受它作为答案。
【解决方案2】:

在 Functions 中,应用程序设置(例如服务连接字符串)在执行期间作为环境变量公开。您可以通过声明 import os 然后使用

来访问这些设置

setting = os.environ["mysetting"]

正如 Alex 所说,尝试从环境变量的名称中删除 CONNECTIONSTRINGS:。在 azure 门户中,只需在应用程序设置中添加 mysetting 作为 keyName。

【讨论】:

  • 我必须添加 CONNECTIONSTRINGS: 才能让它在本地运行。在我添加密钥名称之前,它不会在本地运行。我尝试使用和不使用 CONNECTIONSTRINGS: 部署到 Azure Function;这两个选项都不起作用。
  • 您如何存储连接?您可以将其存储在values 下,就像这样thread
  • 是的,我将连接字符串存储为一个值,并像使用 mysetting 一样为设置命名。还是不行。
  • 我就一个稍微不同的问题发表了一篇新文章。可以的话请回复! stackoverflow.com/questions/60893887/…
【解决方案3】:

我一直在努力解决这个问题并找到了这个解决方案:

import os

setting = os.getenv("mysetting")

【讨论】:

    【解决方案4】:

    我在 George 的帮助下解决了这个问题,并选择了 George 的答案作为正确答案。

    我将代码更改为 os.environ["SQLCONNSTR_PDMPDBCONNECTIONSTRING"],但我一直在使用 Azure 命令行界面 (Azure CLI) 通过以下代码将包从 VS Code 部署到 Azure。此代码使用 local.settings.json 覆盖 Azure 应用设置。

    func azure functionapp publish <MY_FUNCTION_NAME> --publish-local-settings -i --overwrite-settings -y

    我认为这会导致我在 Azure 应用程序设置 (SQL Server) 中指定的数据库类型发生变化,所以当我之前尝试过 os.environ["SQLCONNSTR_PDMPDBCONNECTIONSTRING"] 时它不起作用,因为我正在使用我的local.settings.json,它没有指定数据库类型。

    我终于通过使用名为 Azure Functions 的 VS Code 扩展(Azure Functions:部署到函数应用程序)来部署它。这将保留我在 Azure 应用服务中创建的设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2016-10-08
      • 2014-08-02
      • 1970-01-01
      • 2019-12-14
      • 2012-06-08
      • 2017-11-14
      相关资源
      最近更新 更多