python - 当我在 __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)
任何帮助将不胜感激。
解决方案
我猜这个错误信息说明了一切:
error=NetworkTimeout('XXXX:27017: 超时')
您正在连接到无法从函数应用程序连接到的东西。它可能无法访问,因为它位于专用网络上,或者 Function App 未添加到资源的白名单或端口不正确。
无论如何:确保您从代码连接到的资源可从 Azure 函数应用程序访问。
推荐阅读
- php - Unable to change the WordPress tinymce editor font
- python - The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() with index function
- javascript - Firebase Firestore - committing array objects as separate documents
- python - 散景自定义布局
- google-tag-manager - Does Google Tag Manager interpret a variable with string value 'false' as a boolean false?
- reporting-services - 矩阵子行组的百分比
- java - Cannot run wordcount example in flink
- html - 笑脸:放松:表情符号不在 html 中显示☺
- r - Mean/sd: Figure out the mean and standard deviation for each group. And then the one closer to one of the groups is assigned that
- python - Read multiline JSON using apache beam / google cloud dataflow