Python Azure时间触发函数部署后不显示且执行失败求助
问题描述
我使用Python 3.11.9在Visual Studio Code中编写了一个时间触发型Azure Function,本地通过F5启动运行正常。但通过VS Code部署至Azure Portal时,尽管部署输出和Azure标签页均显示“部署成功”,Azure门户的Function App概览页面却看不到该时间触发函数,仅能在函数目录下看到应用文件。我尝试了三种部署方式:Azure标签页的本地工作区部署、Azure标签页的资源部署、终端命令部署,均未解决该问题。
已修复:函数显示问题
添加Ikhtesam回答中的额外依赖后,函数已能正常显示在Azure门户中,但新的执行问题出现:
函数按配置每5分钟尝试运行一次,但每次执行均失败。调用追踪显示为权限问题,日志提示访问Key Vault被拒绝。我使用DefaultAzureCredential和SecretClient获取Key Vault中的密钥,Key Vault采用RBAC权限模型,且Function App的服务主体已被分配相关角色,但仍出现访问被拒绝的情况。
相关代码文件
function_app.py
import logging import azure.functions as func import requests import json from simple_salesforce import Salesforce import pandas as pd import csv from flatten_json import flatten #for extending csv file for 1 day at a time holidays import datetime as dt from datetime import timedelta from urllib.parse import urlparse, urljoin #used to save to specific folder import os from dotenv import load_dotenv from shareplum import Site from shareplum import Office365 from shareplum.site import Version from io import BytesIO from io import StringIO import pandas as pd from office365.runtime.auth.authentication_context import AuthenticationContext from io import BytesIO from office365.runtime.auth.client_credential import ClientCredential from office365.sharepoint.client_context import ClientContext #sharepoint # import necessary modules from shareplum import Site import pandas as pd from shareplum import Office365 from shareplum import Site from shareplum.site import Version import pandas as pd import numpy as np from sklearn.datasets import load_iris from IPython.display import display from tabulate import tabulate from pandas import json_normalize from office365.sharepoint.files.file import File import pandas as pd import io import errno from datetime import datetime, timedelta from pathlib import Path from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient from azure.core.exceptions import ResourceNotFoundError from azure.storage.blob import BlobServiceClient from azure.identity import DefaultAzureCredential from azure.keyvault.keys import KeyClient app = func.FunctionApp() @app.schedule(schedule="0 */5 * * * *", arg_name="myTimer", run_on_startup=True, use_monitor=False) def timer_trigger(myTimer: func.TimerRequest) -> None: if myTimer.past_due: logging.info('The timer is past due!') logging.info('Python timer trigger function executed.') #full script below this, inline with function so it runs when the function runs
requirements.txt
flatten-json==0.1.14 ipython==8.12.3 numpy==1.26.4 Office365-REST-Python-Client==2.5.7 pandas==2.2.0 python-dotenv==1.0.1 requests==2.31.0 scikit-learn==1.4.2 SharePlum==0.5.1 simple-salesforce==1.12.5 tabulate==0.9.0
local.settings.json
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "FUNCTIONS_WORKER_RUNTIME": "python", "AzureWebJobsFeatureFlags": "EnableWorkerIndexing" } }
获取Key Vault密钥的代码片段
keyVaultName = "<key-vault-name>" KVUri = f"https://{keyVaultName}.vault.azure.net" credential = DefaultAzureCredential() client = SecretClient(vault_url=KVUri, credential=credential) username = client.get_secret("username").value password = client.get_secret("password").value security_token = client.get_secret("security-token").value domain = client.get_secret("domain").value
内容的提问来源于stack exchange,提问作者Aidan Goldie
相关产品推荐
相关产品推荐

