Azure TimerTrigger 具有不同配置的多个实例
Azure TimerTrigger Multiple instances with different configuration
使用 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": "*********"
}
}
目标:
我想 运行 相同功能的两个实例,但使用两个不同的配置,即用户+密码。
问题:
我认为 Configuration/App 设置可能不足以满足此要求。我找不到使用多个不同参数两次 运行 函数的方法。
问题:我有哪些选择可以实现我的目标?我的一个想法是将 User/PW 放入 functions.json,但我不知道如何从应用程序功能中访问该信息。
你有两个选择:
读取一个自定义json(不一定读取function.json的值),可以在函数app中添加一个自定义json,然后读取根据 json 文件的层次结构你想要的值,然后使用你在触发器中读取的值。
使用部署槽。 (这是官方的方法,我觉得完全适合你现在的需求)
在这个新创建的插槽中,您可以在配置设置中使用完全不同的环境变量。
这是文档:
https://docs.microsoft.com/en-us/azure/azure-functions/functions-deployment-slots
我可能会通过一个包含 JSON 数组的设置来做到这一点,即
"Credentials": "[{'username':'***','password':'***'},{'username':'******','password':'******'}]"
然后,假设您想同时处理它们,创建一个函数来解析数组并遍历每个用户名和密码。
如果您需要 运行 它们在不同的时间表上,创建一个共享 Python 函数 DoTheThing(credentialIndex)
实际完成工作,然后创建多个 Azure Functions 只需调用 DoTheThing(0)
, DoTheThing(1)
, ...
(安全说明:与手头的问题没有直接关系,但秘密最好保存在密钥库等秘密存储中,而不是直接保存在设置中)
EDIT/SOLUTION:
我最终在我的环境变量中有以下键:
"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)
使用 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": "*********"
}
}
目标: 我想 运行 相同功能的两个实例,但使用两个不同的配置,即用户+密码。
问题: 我认为 Configuration/App 设置可能不足以满足此要求。我找不到使用多个不同参数两次 运行 函数的方法。
问题:我有哪些选择可以实现我的目标?我的一个想法是将 User/PW 放入 functions.json,但我不知道如何从应用程序功能中访问该信息。
你有两个选择:
读取一个自定义json(不一定读取function.json的值),可以在函数app中添加一个自定义json,然后读取根据 json 文件的层次结构你想要的值,然后使用你在触发器中读取的值。
使用部署槽。 (这是官方的方法,我觉得完全适合你现在的需求)
在这个新创建的插槽中,您可以在配置设置中使用完全不同的环境变量。
这是文档:
https://docs.microsoft.com/en-us/azure/azure-functions/functions-deployment-slots
我可能会通过一个包含 JSON 数组的设置来做到这一点,即
"Credentials": "[{'username':'***','password':'***'},{'username':'******','password':'******'}]"
然后,假设您想同时处理它们,创建一个函数来解析数组并遍历每个用户名和密码。
如果您需要 运行 它们在不同的时间表上,创建一个共享 Python 函数 DoTheThing(credentialIndex)
实际完成工作,然后创建多个 Azure Functions 只需调用 DoTheThing(0)
, DoTheThing(1)
, ...
(安全说明:与手头的问题没有直接关系,但秘密最好保存在密钥库等秘密存储中,而不是直接保存在设置中)
EDIT/SOLUTION: 我最终在我的环境变量中有以下键:
"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)