Облако — чтение из локального сетевого хранилища файлов (например, с помощью функции Azure)

Я хочу использовать код Python, развернутый в облаке Azure (например, в функции Azure), для чтения местоположения файлов с общего/локального сетевого диска (локально). Сетевой диск требует аутентификации на основе пользователя (т. е. разные пользователи имеют доступ/разрешения к разным областям).

С локальной сетью установлено соединение по экспресс-маршруту, и я также подтвердил, посмотрев на брандмауэр, что ничто не блокирует облачный доступ к общим дискам.

Мой вопрос: как лучше всего прочитать эти файлы из локальной сети (локальной) в функцию Azure с помощью Python? Например. какие пакеты следует использовать и как также вводить учетные данные пользователя.

Я не могу получить доступ с помощью smbprotocol и не вижу файлов (например, с помощью пакета os) и считаю, что это связано с аутентификацией.

Пробовали ли вы какой-либо подход? @Майк Таубер

Jahnavi 09.07.2024 09:14

Да: 1) протокол smb 2) поиск папок по всему, что видит функция.

Mike Tauber 09.07.2024 09:41

Как вы упомянули, протокол smbprotocol не работает должным образом, можете ли вы попробовать использовать библиотеку pyodbc для аутентификации пользователей. @Майк Таубер

Jahnavi 09.07.2024 09:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кажется, это проблема XY. Почему вы хотите вывести список onprem-файлов из функции Azure?

Я не уверен, что это вообще возможно. Но реальный вопрос заключается в том, действительно ли вы хотите открыть доступ ко всей локальной корпоративной общей папке? Даже используя экспресс-маршрут?

Функции Azure — это бессерверное развертывание Cloud Natif, которое позволяет безопасно и естественным образом подключаться к хранилищу BLOB-объектов Azure.

Мои предложения:

  1. Используйте общий файловый ресурс Azure, который будет подключен к вашей функции Azure И к вашим локальным службам.
  2. Или разверните локальный API с доступом к Samba, который предоставляет маршрут для получения местоположения файла. Затем ваша функция Azure может вызвать API для доступа к этой информации.

Некоторый связанный ответ:

Ответ принят как подходящий

Вы можете выполнить эту задачу с помощью Python, и теперь, когда мы знаем, что соединение требует аутентификации, возможно, нам нужно узнать больше о соединении по экспресс-маршруту, функция Azure (python) может потребовать соединителей на стороне сервера и клиента, однако, если нам нужно Чтобы сохранить текущую безопасность, всегда полезно сохранить одну и ту же облачную инфраструктуру, мы можем реализовать тип сетевого подключения клиентского оборудования (CPE) (2 месяца назад эта функция все еще была в предварительной версии):

Клиент или локальный питон:

pip install smbprotocol #windows or #python3 -m pip install smbprotocol

Linux потребует поддержки Kerberos: pip install smbprotocol[kerberos]

После того, как клиент или локальный Python уже подтвердил доступ к сетевому диску, вы можете управлять им как обычным локальным файлом для чтения, а затем мы должны перейти на сторону сервера (функция Azure), вам необходимо создать функцию Azure, которая будет разрешено разместить файл:

Это будет комбинация: Создание функции Azure для получения ФАЙЛА с функцией POST и сохранение его в Azure Blob или аналогичном устройстве или обработка его желаемым способом (https://learn.microsoft.com/en- us/azure/azure-functions/functions-reference-python?tabs=asgi%2Capplication-level&pivots=python-mode-decorators#sdk-type-bindings-examples)

Функция, которую я бы использовал для больших двоичных объектов на стороне клиента:

def s_on_db(self,container_db,folder_db,file_db_local_complete_path,file_to_file_to_db):
    try:
        connection_string = "BlobEndpoint=https://mystorageaccount2024.blob.core.windows.net/;QueueEndpoint=h..."
        blob_service_client = BlobServiceClient.from_connection_string(connection_string)
        container_client = blob_service_client.get_container_client(container_db)
        blob_client = container_client.get_blob_client(folder_db+"/"+file_to_file_to_db)
        start=time.time()
        #upload data
        block_list=[]
        chunk_size=4*1024*1024
        with  open(file_db_local_complete_path,'rb') as  f:
          while  True:
                read_data = f.read(chunk_size)
                if  not  read_data:
                    break  # done
                blk_id = str(uuid.uuid4())
                blob_client.stage_block(block_id=blk_id,data=read_data)
                block_list.append(BlobBlock(block_id=blk_id))

        blob_client.commit_block_list(block_list)
        end=time.time()
    except Exception as e:
        print(e)
        pass

Функция загружает файл по частям, в зависимости от пропускной способности и скорости загрузки в Интернет вы можете изменить его:

Полный код (проверю позже, потому что мне нужно настроить всю среду в Azure и локально):

from smbprotocol.open import Open, CreateDisposition, FilePipePrinterAccessMask, FileAttributes, ShareAccess, ImpersonationLevel
from smbprotocol.session import Session
from smbprotocol.connection import Connection
import psutil
the_current_user=psutil.Process().username()

driveinnetwork = 'NetCOmpanyDrive'
username = the_current_user #this can be the_current_user, this may be a vulnerability, recommended to be used for IT Admin only
password = 'password' #if each user is managed with EntraID, we will need MSAL instead of the actual password, so we do not expose the real one, or the IT Admin can enable the script as a hidden service
shared_folder = 'shared_folder_drive'
file_path = '/path/to/localfile.pdf'

#or os.system(f"net use {driveinnetwork} /user:{username} {password}") #but this may be a security issue

#client side connector
connection = Connection(uuid.uuid4(), driveinnetwork, 445)
connection.connect()
session = Session(connection, username, password)
session.connect()

allids = session.tree_connect(shared_folder)

# Access a file
with Open(allids, file_path, desired_access=FilePipePrinterAccessMask.GENERIC_READ, create_disposition=CreateDisposition.FILE_OPEN, file_attributes=FileAttributes.FILE_ATTRIBUTE_NORMAL, share_access=ShareAccess.FILE_SHARE_READ, impersonation_level=ImpersonationLevel.Impersonation, oplock_level=0) as file:
    #read
    data=file.read() #can read all or by chunks for memory usage

#Add Azure POST file to Azure Function, more mechanisms may be needed here to know when remote tries to read local and vice-versa
    
def s_on_db(container_db,folder_db,file_db_local_complete_path,file_to_file_to_db):
    try:
        connection_string = "BlobEndpoint=https://mystorageaccount2024.blob.core.windows.net/;QueueEndpoint=h..."
        blob_service_client = BlobServiceClient.from_connection_string(connection_string)
        container_client = blob_service_client.get_container_client(container_db)
        blob_client = container_client.get_blob_client(folder_db+"/"+file_to_file_to_db)
        start=time.time()
        #upload data
        block_list=[]
        chunk_size=4*1024*1024
        with  open(file_db_local_complete_path,'rb') as  f:
          while  True:
                read_data = f.read(chunk_size)
                if  not  read_data:
                    break  # done
                blk_id = str(uuid.uuid4())
                blob_client.stage_block(block_id=blk_id,data=read_data)
                block_list.append(BlobBlock(block_id=blk_id))

        blob_client.commit_block_list(block_list)
        end=time.time()
    except Exception as e:
        print(e)
        pass


#data will be sent to the cloud using the function s_on_db(container_db,folder_db,file_db_local_complete_path,file_to_file_to_db)

#close connection
session.tree_disconnect(tree_id)
session.logoff()
connection.disconnect()

Вариант CPE может быть проще и сохраняет схему аутентификации Microsoft EntraID, требует рабочей или учебной учетной записи и некоторых лицензий O365 (EntraID P1 или P2).

Другие вопросы по теме

Развертывание Azure DevOps SQL DacPac не работает с подключением службы
Azure Devops Pipeline, покажите ссылку на отчет Sonar на сводной странице запуска конвейера
Как добавить владельца в каталог управления правами Azure в PowerShell или с помощью API Graph?
Как напрямую подключить значение секретов, хранящееся в хранилище ключей Azure, к переменным среды службы приложений Azure
Как получить оценки Azure Advisor из обозревателя графов ресурсов Azure?
Как подготовить данные для пакетного вывода в Azure ML?
Ошибка авторизации при отправке большого двоичного объекта с управляемой идентификацией
Развертывание отфильтрованных метрик на информационной панели Azure с помощью Bicep
Приложение-функция Azure — нет настройки непрерывного развертывания для плана хостинга «Гибкое потребление»?
Невозможно подключиться из фабрики данных Azure к гибкому серверу Postgres с помощью частной конечной точки