Azure TimerTrigger具有不同配置的多个实例

时间:2020-06-08 18:13:26

标签: python-3.x parameters environment-variables azure-functions azure-appservice

使用VS Code +“ Azure Function”扩展名,我使用以下设置生成了默认的python 3.7 timedTrigger函数:

// functions.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 0 */6 * * *"
    }
  ]
}

我还设置了两个环境变量“ USER”和“ PASSWORD”,这些变量在应用程序服务的“配置”中设置。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": ****************,
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "USER": "********",
    "PASSWORD": "*********"
  }
}

目标: 我想运行两个具有相同功能的实例,但是要使用两个不同的配置,即Users + Passwords。

问题: 我认为配置/应用程序设置可能不足以实现此目的。我找不到使用多个不同参数两次运行函数的方法。

问题:我必须实现哪些选择?我的一个想法是将User / PW放到functions.json中,但我不知道如何从app函数中访问该信息。

3 个答案:

答案 0 :(得分:1)

您有两个选择:

  1. 读取自定义json(不必读取function.json的值),可以在函数app中添加自定义json,然后根据json文件的层次结构读取所需的值,然后使用您在触发器中读取的值。

  2. 使用部署槽。 (这是官方方法,我认为这完全适合您当前的需求)

enter image description here

在这个新创建的插槽中,您可以在“配置设置”中使用完全不同的环境变量。

这是文档:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-deployment-slots

答案 1 :(得分:0)

我可能会通过拥有一个包含JSON数组的单一设置来实现的,即

"Credentials": "[{'username':'***','password':'***'},{'username':'******','password':'******'}]"

然后,假设您想同时处理它们,则创建一个函数来解析数组并遍历每个用户名和密码。

如果需要按照不同的时间表运行它们,请创建一个共享的Python函数DoTheThing(credentialIndex)来实际完成工作,然后创建多个Azure函数,这些函数只需调用DoTheThing(0)DoTheThing(1)等。

(安全说明:与当前问题不直接相关,但最好将秘密保存在Key Vault等秘密存储中,而不是直接保存在设置中)

答案 2 :(得分:0)

编辑/解决方案: 我最终在环境变量中输入了以下键:

"USERS": "[\"UserA\", \"UserB\"]"
"UserA_USER": "Username1"
"UserA_PW": "Password1"
"UserB_USER": "Username2"
"UserB_PW": "Password2"

然后我遍历USERS数组并为每个用户检索密钥,如下所示:

import os
import json

users = json.loads(os.environ["USERS"])
for u in users:
   user = os.environ[u + "_USER"]
   pw = os.environ[u + "_PW"]
   doStuff(user, pw)