Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku wdrożysz aplikację w języku Python, która używa pliku binarnego ffmpeg w zainstalowanym udziale usługi Azure Files do przetwarzania obrazów w usłudze Azure Functions. Po przekazaniu obrazu do kontenera funkcja jest wywoływana, uruchamia aplikację ffmpeg z zamontowanego systemu w celu przekonwertowania obrazu i zapisuje wynik z powrotem do magazynu. Hostując duże pliki binarne, takie jak ffmpeg, na zamontowanym udziale zamiast w pakiecie wdrożeniowym, można utrzymywać wdrożenia w małym rozmiarze, a zimne starty odbywają się szybko.
W tym samouczku nauczysz się następujących rzeczy:
- Wdrażanie aplikacji funkcji Flex Consumption z zainstalowanym udziałem usługi Azure Files przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure
- Prześlij przykładowy obraz, aby wyzwolić przetwarzanie oparte na blobach
- Sprawdź, czy funkcja ffmpeg z montowanego systemu zapisała przekonwertowany obraz.
Uwaga / Notatka
Przykłady kodu dla tego artykułu są dostępne w repozytorium GitHub Azure Functions Flex Consumption with Azure Files OS Mount Samples.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz bezpłatne konto.
- Interfejs wiersza polecenia dla deweloperów platformy Azure (azd) w wersji 1.9.0 lub nowszej
- Git
Przykłady CLI w tym samouczku używają składni Bash i są testowane w Azure Cloud Shell (Bash) oraz terminalach Linux/macOS.
Inicjowanie przykładowego projektu
Przykładowy kod tego samouczka znajduje się w repozytorium Azure Functions Flex Consumption with Azure Files OS Mount Samples na GitHub. Folder ffmpeg-image-processing zawiera kod aplikacji function app, szablon Bicep provisionujący wymagane zasoby dla Azure oraz skrypt po-deploymencie, który przesyła plik binarny ffmpeg.
Otwórz terminal i przejdź do katalogu, w którym chcesz sklonować repozytorium.
Sklonuj repozytorium:
git clone https://github.com/Azure-Samples/Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples.gitPrzejdź do folderu projektu:
cd Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples/ffmpeg-image-processingZainicjuj
azdśrodowisko. Po wyświetleniu monitu wprowadź nazwę środowiska, taką jakffmpeg-processing:azd init
Przeglądanie kodu
Trzy kluczowe elementy, które sprawiają, że praca przetwarzania oparta na instalacji systemu operacyjnego to infrastruktura, która tworzy instalację, skrypt przekazujący plik binarny i kod funkcji, który go wywołuje.
Moduł mounts.bicep konfiguruje instalację protokołu SMB usługi Azure Files w aplikacji funkcji. Wartość mountPath określa ścieżkę lokalną, w której pliki są wyświetlane w czasie wykonywania. Klucz dostępu do konta storage jest przekazywany jako parametr, a platforma rozpoznaje go w trakcie wykonywania za pomocą odwołania do Key Vault.
@description('Function app name')
param functionAppName string
@description('Storage account name')
param storageAccountName string
@description('Storage account access key or app setting reference for Azure Files SMB mount')
param accessKey string
@description('Array of mount configurations')
param mounts array
// Function app reference
resource functionApp 'Microsoft.Web/sites@2023-12-01' existing = {
name: functionAppName
}
// Azure Files OS mount configuration
// Deploys azureStorageAccounts site config with all mounts in one shot
resource mountConfig 'Microsoft.Web/sites/config@2023-12-01' = {
parent: functionApp
name: 'azurestorageaccounts'
properties: reduce(mounts, {}, (cur, mount) => union(cur, {
'${mount.name}': {
type: 'AzureFiles'
shareName: mount.shareName
mountPath: mount.mountPath
accountName: storageAccountName
accessKey: accessKey
}
}))
}
output mountPaths array = [for mount in mounts: mount.mountPath]
Ponieważ montowanie SMB usługi Azure Files nie obsługuje jeszcze uwierzytelniania tożsamości zarządzanej, potrzebny jest klucz konta przechowywania. Najlepszym rozwiązaniem jest przechowywanie tego klucza w usłudze Azure Key Vault i używanie odwołania do usługi Key Vault w ustawieniu aplikacji. Konfiguracja instalacji odwołuje się do tego ustawienia aplikacji przy użyciu metody @AppSettingRef(), więc klucz nigdy nie pojawia się w szablonach Bicep. Moduł keyvault.bicep tworzy sejf, przechowuje klucz i przyznaje role RBAC użytkownikom.
@description('Key Vault name')
param name string
@description('Location')
param location string
@description('Tags')
param tags object = {}
@description('Storage account name')
param storageAccountName string
@description('Principal ID of the function app identity (receives Key Vault Secrets User role)')
param functionAppPrincipalId string
@description('Principal ID of the deploying user (receives Key Vault Secrets Officer role)')
param deployerPrincipalId string = ''
// Storage account reference
resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
name: storageAccountName
}
// Key Vault with RBAC authorization
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: name
location: location
tags: tags
properties: {
sku: {
family: 'A'
name: 'standard'
}
tenantId: tenant().tenantId
enableRbacAuthorization: true
enabledForTemplateDeployment: true
enableSoftDelete: true
softDeleteRetentionInDays: 7
}
}
// Store storage account key as a secret (Azure Files mounts require shared key)
resource storageKeySecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
parent: keyVault
name: 'storageAccountKey'
properties: {
value: storage.listKeys().keys[0].value
contentType: 'Storage account access key for Azure Files SMB mount'
}
}
// Built-in Key Vault RBAC role IDs
var roles = {
KeyVaultSecretsOfficer: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7')
KeyVaultSecretsUser: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4633458b-17de-408a-b874-0445c86b69e6')
}
// Grant the function app identity read access to secrets
resource functionAppSecretsUser 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(keyVault.id, functionAppPrincipalId, roles.KeyVaultSecretsUser)
scope: keyVault
properties: {
roleDefinitionId: roles.KeyVaultSecretsUser
principalId: functionAppPrincipalId
principalType: 'ServicePrincipal'
}
}
// Grant the deployer manage access to secrets
resource deployerSecretsOfficer 'Microsoft.Authorization/roleAssignments@2022-04-01' = if (!empty(deployerPrincipalId)) {
name: guid(keyVault.id, deployerPrincipalId, roles.KeyVaultSecretsOfficer)
scope: keyVault
properties: {
roleDefinitionId: roles.KeyVaultSecretsOfficer
principalId: deployerPrincipalId
principalType: 'User'
}
}
output name string = keyVault.name
output uri string = keyVault.properties.vaultUri
output storageKeySecretUri string = storageKeySecret.properties.secretUri
Plik main.bicep wywołuje moduły instalacji i usługi Key Vault:
// Key Vault for secure storage of Azure Files access key
module keyVault './app/keyvault.bicep' = {
name: 'keyVault'
scope: rg
params: {
name: !empty(keyVaultName) ? keyVaultName : '${abbrs.keyVaultVaults}${resourceToken}'
location: location
tags: tags
storageAccountName: storage.outputs.name
functionAppPrincipalId: processorIdentity.outputs.principalId
deployerPrincipalId: principalId
}
}
// Azure Files mount configuration (access key resolved via Key Vault reference)
module azureFilesMount './app/mounts.bicep' = {
name: 'azureFilesMount'
scope: rg
params: {
functionAppName: functionApp.outputs.name
storageAccountName: storage.outputs.name
accessKey: '@AppSettingRef(MOUNT_SECRET_REFERENCE)'
mounts: [
{
name: 'tools'
shareName: 'tools'
mountPath: '/mounts/tools/'
}
]
}
dependsOn: [
functionAppRoleAssignments
]
}
Wdrażanie przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure
Ten przykład jest szablonem interfejsu wiersza polecenia dla deweloperów platformy Azure (azd). Jedna komenda azd up aprowizuje infrastrukturę, wdraża kod funkcji, przesyła plik binarny ffmpeg do usługi Azure Files i tworzy subskrypcję Event Grid dla wyzwalaczy obiektów blob.
Zaloguj się do Azure. Skrypt po wdrożeniu używa poleceń interfejsu wiersza polecenia platformy Azure, dlatego należy uwierzytelnić się przy użyciu obu narzędzi:
azd auth login az loginAprowizuj i wdróż wszystko:
azd upPo wyświetleniu monitu wybierz subskrypcję platformy Azure i lokalizację do użycia. Następnie polecenie:
- Tworzy grupę zasobów, konto pamięci masowej, usługę Key Vault, aplikację funkcji Flex Consumption, wystąpienie usługi Application Insights oraz tożsamość zarządzaną.
- Wdraża kod funkcji języka Python.
- Pobiera i przesyła plik binarny ffmpeg do zasobu Azure Files.
- Tworzy subskrypcję w usłudze Event Grid, aby przesyłanie obiektów blob wyzwalało funkcję.
- Sprawdza stan zdrowia.
Uwaga / Notatka
Ponieważ instalacja SMB usługi Azure Files nie obsługuje jeszcze uwierzytelniania tożsamości zarządzanej, wymagany jest klucz konta magazynu. Najlepszym rozwiązaniem jest przechowywanie tego klucza w usłudze Azure Key Vault i użycie odwołania do usługi Key Vault , dzięki czemu klucz nigdy nie jest ujawniany w ustawieniach aplikacji. Takie podejście zapewnia scentralizowane zarządzanie tajemnicami, audyt i wsparcie dla rotacji kluczy.
Wdrożenie trwa kilka minut. Po zakończeniu zostanie wyświetlone podsumowanie utworzonych zasobów.
Zapisz nazwy zasobów jako zmienne 'shell' dla pozostałych kroków:
RESOURCE_GROUP=$(azd env get-value AZURE_RESOURCE_GROUP) STORAGE_ACCOUNT=$(azd env get-value AZURE_STORAGE_ACCOUNT_NAME) FUNCTION_APP_NAME=$(azd env get-value AZURE_FUNCTION_APP_NAME) INPUT_CONTAINER=$(azd env get-value AZURE_STORAGE_INPUT_CONTAINER) OUTPUT_CONTAINER=$(azd env get-value AZURE_STORAGE_OUTPUT_CONTAINER)
Przetwarzanie obrazu
Przekaż przykładowy obraz dołączony do repozytorium do kontenera wejściowego. Subskrypcja usługi Event Grid utworzona podczas wdrażania automatycznie wyzwala funkcję po załadowaniu obiektu blob.
az storage blob upload \ --container-name $INPUT_CONTAINER \ --name sample_image.png \ --file sample_image.png \ --account-name $STORAGE_ACCOUNT \ --auth-mode loginWskazówka
Jeśli wyzwalacz nie zostanie wyzwolony natychmiast, zaczekaj 10–15 sekund, a następnie sprawdź dzienniki wykonywania funkcji w witrynie Azure Portal.
Sprawdź, czy funkcja przetworzyła obraz, wyświetlając listę blobów w kontenerze wyjściowym.
az storage blob list \ --container-name $OUTPUT_CONTAINER \ --account-name $STORAGE_ACCOUNT \ --auth-mode login \ -o tablePowinieneś zobaczyć
sample_image.jpgw kontenerze wyjściowym.Pobierz przekonwertowany obraz:
az storage blob download \ --container-name $OUTPUT_CONTAINER \ --name sample_image.png \ --file ./output_image.png \ --account-name $STORAGE_ACCOUNT \ --auth-mode login
Uwaga / Notatka
Pierwsze wykonanie może być nieco wolniejsze (zimny start). Kolejne wywołania są szybsze, ponieważ kontener funkcji pozostaje ciepły i buforowany jest ffmpeg. Aby zminimalizować zimny start, rozważ włączenie zawsze gotowych wystąpień.
Uprzątnij zasoby
Aby uniknąć bieżących opłat, usuń wszystkie zasoby utworzone w tym samouczku:
azd down --purge
Ostrzeżenie
To polecenie usuwa grupę zasobów i wszystkie zasoby, w tym aplikację funkcji Azure, konto magazynu oraz instancję Application Insights.