Поделиться через


Выбор стратегии доступа к файлам для Функций Azure

В этой статье сравниваются три способа доступа к файлам из Функций Azure: привязки хранилища, внешние базы данных и подключение хранилища файлов Azure. Вы узнаете о компромиссах между каждым подходом, узнаете, когда монтажи являются правильным выбором, и находите шаблоны для реальных сценариев.

Привязки хранилища и внешние базы данных поддерживаются на всех тарифных планах хостинга. Подключения хранилища поддерживаются только в Linux и не поддерживаются в плане Потребления.

Если вы хотите перейти непосредственно к рабочему коду, см. Учебник: Долговечный анализ текстов с подключенным ресурсом Azure Files для параллельной обработки файлов или Учебник: Обработка изображений с использованием FFmpeg на подключенном ресурсе Azure Files для размещения больших двоичных файлов в подключенной папке.

Замечание

Примеры кода, приведенные в этой статье, доступны в репозитории GitHub Azure Functions Flex Consumption with Azure Files OS Mount Samples.

Параметры доступа к файлам на первый взгляд

Если вам нужно получить доступ к файлам из ваших функций, у вас есть три основных варианта:

Подход Плюсы Минусы лучше всего подходит для Узнать больше
Привязки хранилища Простая, облачная, безопасная Затраты на сеть, итоговая согласованность Перемещение данных в облачные службы (очереди, большие двоичные объекты) Blob, Queue, привязки Table
Внешняя база данных Гибкий, транзакционный Сетевые вызовы, сложность Структурированные данные, сложные запросы Управление подключениями
Подключение хранилища (файлы Azure) Прямой доступ к файлам, семантика POSIX, большие двоичные файлы Медленнее, чем локальный диск, работает только в Linux Большие файлы, общие исполняемые файлы, частый доступ Что такое подключение хранилища?

Не каждый вариант доступен для каждого плана размещения:

План размещения Привязки для хранилища Внешняя база данных Монтирование хранилища (файлы Azure)
Использование Flex
Elastic Premium
Выделенный (Служба приложений)
Потребление (только для Windows)

Остальная часть этой статьи посвящена креплениям: когда они являются правильным выбором и как их безопасно использовать.

Что такое подключение хранилища?

Подключение хранилища — это сетевая файловая папка, которую вы подключаете, как если бы это был локальный каталог. При подключении общей папки файлов Azure в приложении-функции путь появляется в файловой системе контейнера функций:

┌─────────────────────────────────────┐
│  Your function code                 │
│  (reads/writes to /mnt/mydata/)     │
├─────────────────────────────────────┤
│  POSIX file-system layer            │
│  (appears as a local directory)     │
├─────────────────────────────────────┤
│  SMB protocol (over network)        │
├─────────────────────────────────────┤
│  Azure Files share                  │
│  (in your storage account)          │
└─────────────────────────────────────┘

Код использует стандартные API файловой системы (например, open()os.listdir() в Python или эквивалентных вызовах на других языках), не зная, что он взаимодействует по сети. Эта настройка предоставляет семантику POSIX, что означает, что код выглядит как локальный ввод-вывод файла.

Когда не следует использовать монтирования.

Крепления не являются правильным выбором для каждого сценария. Рассмотрим следующие варианты:

Сценарий Рекомендуемая альтернатива
Небольшие временные данные Хранилище очередей Azure
Хранилище BLOB-объектов Azure
Частые небольшие операции чтения и записи Azure Cosmos DB или Кэш Azure для Redis
Потоковая передача в режиме реального времени Центры событий Azure или Центр Интернета вещей Azure
Общий доступ к данным между регионами Репликация хранилища BLOB-объектов

Это важно

Подключения хранилища поддерживаются только в Linux и не поддерживаются в плане Потребления.

Сравнение вариантов хранилищ

Рассмотрим три основных варианта доступа к файлам при обработке 1000 изображений (1 МБ каждый), хранящихся в эталонной папке:

Подход Механизм Сетевые вызовы Относительные затраты лучше всего подходит для
Привязка хранилища BLOB-объектов Скачивание каждого файла 1 000 запросов GET Высокая пропускная способность и задержка Одноразовый или редкий доступ
Подключение хранилища Чтение из общего ресурса Настройка одного монтажа Минимальная пропускная способность Повторяющийся или большой доступ
Внешняя база данных Azure Cosmos DB (облачная база данных) Один запрос Затраты на единицу запросов и задержка в сети Структурированные данные со сложными запросами

Замечание

В следующих примерах кода используется Python, но тот же шаблон применяется к любому языку, который поддерживает API файловой системы, включая C#, Java, JavaScript и PowerShell.

files = container_client.list_blobs(name_starts_with="reference/")
for blob in files:
    stream = container_client.download_blob(blob.name)

Для больших общих файлов с повторным доступом используйте монтирование общих ресурсов. Давайте рассмотрим более подробные сценарии, использующие общие точки монтирования.

Совместное использование сценариев подключения

Эти примеры сценариев также используют подключенные общие папки хранения:

Сценарий Решена проблема Пример
Параллельный анализ файлов Избегайте упаковки больших ссылочных данных или их скачивания для каждого вызова Модели машинного обучения, таблицы подстановки, корпус данных, используемые более чем в 1000 экземплярах.
Общие исполняемые файлы Не включайте большие двоичные файлы в пакет развертывания ffmpeg, ImageMagick или другие инструменты объёмом 500+ МБ
Совместное использование данных между приложениями Совместное использование файлов между производителями и потребительскими приложениями без передачи сообщений Приложение A записывает результаты, Приложение B считывает их из той же точки монтирования.

Выберите каждую вкладку, чтобы просмотреть сведения о конкретном сценарии:

Вариант использования: У вас есть 1000 задач анализа, которые должны читать из одного и того же набора эталонных данных (например, моделей машинного обучения, таблиц подстановки или данных корпусов).

Замечание

Для полного пошагового руководства по этому шаблону см. учебник: Устойчивый текстовый анализ с использованием подключения к общей папке Azure Files.

Проблема: Без креплений у вас есть два неоптимальных варианта:

  • Упакуйте справочные файлы вместе с вашей функцией: такой подход приводит к большому артефакту развертывания, медленным холодным запускам и избыточности хранения.
  • Скачивание из хранилища BLOB-объектов каждый раз: этот подход вызывает задержку в сети при каждом вызове функции и тратит пропускную способность.

Решение на основе монтирования: Все экземпляры считывают данные непосредственно из монтированной общей папки. После инициализации подключения расходы на сеть для каждого запроса и избыточного хранилища отсутствуют.

┌─────────────────────────┐
│  Function Instance 1    │
│  Function Instance 2    ├──→  /mnt/models/  ──→  Azure Files share
│  Function Instance 3    │     (shared mount)
└─────────────────────────┘

Шаблон реализации: (Python)

import os
from pathlib import Path

MOUNT_PATH = "/mnt/models"

def analyze_data(item: str) -> dict:
    """Activity function: reads from shared mount."""
    model_path = Path(MOUNT_PATH) / "model.pkl"
    
    # Direct file I/O — no SDK call, no network overhead
    with open(model_path, "rb") as f:
        model = pickle.load(f)
    
    result = model.predict(item)
    return {"item": item, "score": result}

Основные моменты:

  • Все экземпляры вашего функционального приложения видят одно и то же монтирование.
  • Операции чтения файлов соответствуют POSIX. Вы используете стандартные API файловой системы.
  • Нет необходимости выполнять проверку подлинности при каждом чтении (подключение аутентифицируется один раз при запуске).
  • Изменения, записанные одним экземпляром, сразу же видны другим пользователям.

Рекомендации по безопасности:

  • Ключ учетной записи хранения: подключение хранилища Azure Files на Flex Consumption выполняется с использованием ключа доступа к учетной записи хранения, который настроен в параметрах монтирования приложения-функции. Управляемое удостоверение с Storage File Data SMB Share Contributor RBAC не поддерживается для подключений SMB в Функциях Azure. Сохраняйте безопасность ключа доступа и периодически поворачивайте его.
  • Параметр только для чтения: если рабочая нагрузка не требует записи, ограничьте подключение только для чтения.
  • Квоты: Установите квоты на общий ресурс файлов Azure, чтобы предотвратить неконтролируемое увеличение затрат, если экземпляры записывают большие файлы.

Ограничения монтирования

Эти ограничения хранилища файлов Azure применяются ко всем планам размещения, поддерживающим подключения:

Ограничение Ценность
Размер доли До 100 ТиБ
Размер файла До 4 ТиБ
Throughput ~60 МБ/с (стандартный), ~100+ МБ/с (премиум)
Concurrency Многие (SMB обрабатывает его), но записывает в сериализованном виде

Дополнительные сведения см. в статье о целевых объектах масштабирования файлов Azure.

Эти ограничения зависят от поддерживаемого плана размещения:

Ограничение Потребление Flex Эластик Премиум Выделенный режим (Служба приложений)
Точки подключения для каждого приложения 5 5 5
Протоколы Только SMB SMB, NFS, Большие двоичные объекты Azure (только для чтения) SMB, NFS, Большие двоичные объекты Azure (только для чтения)

Чтобы предотвратить неконтролируемые затраты на хранение, установите квоту на вашем файловом разделе Azure Files.

az storage share-rm update \
  --resource-group $RESOURCE_GROUP \
  --storage-account $STORAGE_ACCOUNT \
  --name myshare \
  --quota 100  # 100 GB limit

Подключение проверки подлинности

Подключения хранилища файлов Azure и пакет SDK Azure используют различные механизмы проверки подлинности:

  • Подключения хранилища (SMB): выполняйте проверку подлинности с помощью ключа доступа к учетной записи хранения в момент подключения. Ключ хранится в конфигурации сайта приложения-функции (azureStorageAccounts). В настоящее время управляемые удостоверения не поддерживаются для подключений SMB в Azure Functions.
  • Пакет SDK Azure (REST API): для программного доступа с помощью пакета SDK службы хранилища Azure используйте управляемое удостоверение, если это возможно.

В этом примере Bicep настраивается подключение хранилища с помощью общего секретного ключа учетной записи хранения:

resource mountConfig 'Microsoft.Web/sites/config@2023-12-01' = {
  parent: functionApp
  name: 'azurestorageaccounts'
  properties: {
    dataMount: {
      type: 'AzureFiles'
      shareName: shareName
      mountPath: '/mounts/data'
      accountName: storageAccountName
      accessKey: storageAccount.listKeys().keys[0].value
    }
  }
}

Это важно

Периодически поворачивайте ключи учетной записи хранения. При смене ключей обновите конфигурацию подключения для каждого приложения-функции, ссылающегося на учетную запись.

Лучшие практики

  • По возможности используйте подключения только для чтения. Если ваша функция считывает только из точки монтирования, настройте её как только для чтения, чтобы предотвратить случайные записи.

  • Мониторинг доступа к файлам. Включите диагностику в учетной записи хранения для отслеживания шаблонов доступа к подключению:

    az monitor metrics list \
      --resource /subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT/fileServices/default \
      --metric Transactions
    
  • Очистка временных файлов. Если ваши функции записывают в точку монтирования, реализуйте очистку, чтобы избежать неконтролируемого роста.

    from pathlib import Path
    import time
    
    MOUNT_PATH = "/mnt/temp"
    MAX_AGE = 24 * 60 * 60  # 24 hours
    
    def cleanup_old_files():
        cutoff = time.time() - MAX_AGE
        for f in Path(MOUNT_PATH).iterdir():
            if f.stat().st_mtime < cutoff:
                f.unlink()
    

Устранение неполадок при подключении хранилища

В следующей таблице перечислены распространенные проблемы с подключением хранилища файлов Azure к приложениям-функциям:

Проблема Резолюция
Бинарный файл или файл не найден в пути монтирования Убедитесь, что файл находится в правильной общей папке Azure Files. Убедитесь, что путь подключения, настроенный в приложении-функции, соответствует пути, на который ссылается код. На портале Azure проверьте Настройки>Конфигурация>Сопоставления путей.
Разрешение запрещено при доступе к подключенным файлам Точки подключения хранилища аутентифицируются с помощью ключа доступа к учетной записи хранилища. Убедитесь, что ключ в конфигурации подключения правильный и не был повернут. При смене ключей обновите конфигурацию подключения для каждого приложения-функции, ссылающегося на учетную запись.
Бинарный файл не имеет прав на выполнение Файлы Azure хранят разрешения POSIX во время загрузки. Повторно загрузите двоичный файл после локального запуска chmod +x или установите разрешения после загрузки.
Подключение добавляет задержку к холодным запускам Инициализация подключения SMB добавляет приблизительно 200–500 мс при первом выполнении. Последующие вызовы повторно используют подключение. Для приложений в условиях низкой задержки рассмотрите функцию всегда готовых экземпляров.