首页 > 解决方案 > 当我在 __init_.py 中添加脚本时,Azure 函数计时器触发器失败

问题描述

我编写了一个 python 代码,它从 MongoDB 数据库中获取一个 json 文件并执行一些 ETL 过程。我的问题是,当我自己运行我的脚本时,它工作得非常好,但是,当我将代码放在主init .py 文件中以便它可以使用计时器触发器运行时,它会失败。

我在主init .py 文件中做错了什么还是我错过了什么?

这是我在本地调试时收到的错误:

Executed 'Functions.TestTimerTrigger' (Failed, Id=XXXX, Duration=30285ms)
[2021-01-18T10:41:11.323Z] System.Private.CoreLib: Exception while executing function: Functions.TestTimerTrigger. System.Private.CoreLib: Result: Failure
Exception: ServerSelectionTimeoutError: XXXX:27017: timed out, Timeout: 30s, Topology Description: <TopologyDescription id: 600565a938892b2d0c79ba96, topology_type: Single, servers: [<ServerDescription ('XXXX', 27017) server_type: Unknown, rtt: None, error=NetworkTimeout('XXXX:27017: timed out')>]>

自己运行我的python脚本:

from pymongo import MongoClient
import pandas as pd
from azure.storage.filedatalake import DataLakeServiceClient
from azure.core._match_conditions import MatchConditions
from azure.storage.filedatalake._models import ContentSettings
from pandas import json_normalize
from datetime import datetime, timedelta

mongo_client = MongoClient("XXXX") 
db = mongo_client.x_db #database name
table = db.levels #collection name

document = table.find()
mongo_docs = list(document)
mongo_docs = json_normalize(mongo_docs) 
mongo_docs.to_csv("test.csv", sep = ",", index=False)  

try:  
    global service_client
        
    service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format(
        "https", "XXXX"), credential='XXXX')
    

    file_system_client = service_client.get_file_system_client(file_system="root") name

    directory_client = file_system_client.get_directory_client("testfolder") 

    file_client = directory_client.create_file("test.csv") 
    local_file = open(r"XXX\test.csv",'rb')
    file_contents = local_file.read()

    file_client.upload_data(file_contents, overwrite=True) 

except Exception as e:
    print(e) 

将我的脚本放入主init .py 文件中:

import datetime
import logging
import json
import requests
import azure.functions as func
from pymongo import MongoClient
import pandas as pd
from azure.storage.filedatalake import DataLakeServiceClient
from azure.core._match_conditions import MatchConditions
from azure.storage.filedatalake._models import ContentSettings
from pandas import json_normalize
from datetime import datetime, timedelta

    
def main(mytimer: func.TimerRequest) -> None:
    mongo_client = MongoClient("XXXX") #MongoDB Connection String
    db = mongo_client.x_db #database name
    table = db.levels #collection name

    document = table.find()
    mongo_docs = list(document)
    mongo_docs = json_normalize(mongo_docs) 
    mongo_docs.to_csv("test.csv", sep = ",", index=False)  

    try:  
        global service_client
            
        service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format(
            "https", "XXXX"), credential='XXXX')
        

        file_system_client = service_client.get_file_system_client(file_system="root") 

        directory_client = file_system_client.get_directory_client("testfolder") 

        file_client = directory_client.create_file("test.csv") #name of file being created
        local_file = open(r"XXXX\test.csv",'rb') #file which you want to open

        file_contents = local_file.read()

        file_client.upload_data(file_contents, overwrite=True)

    except Exception as e:
        print(e) 

    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if mytimer.past_due:
        logging.info('The timer is past due!')

    logging.info('Python timer trigger function ran at %s', utc_timestamp)


任何帮助将不胜感激。

标签: pythonvisual-studio-codeazure-functions

解决方案


我猜这个错误信息说明了一切:

error=NetworkTimeout('XXXX:27017: 超时')

您正在连接到无法从函数应用程序连接到的东西。它可能无法访问,因为它位于专用网络上,或者 Function App 未添加到资源的白名单或端口不​​正确。

无论如何:确保您从代码连接到的资源可从 Azure 函数应用程序访问。


推荐阅读