Kılavuz: Bağlı bir Azure Dosyalar paylaşımında FFmpeg kullanarak görüntüleri işleyin

Bu öğreticide, Azure İşlevleri'ndeki görüntüleri işlemek için bağlı bir Azure Dosyalar paylaşımında ffmpeg ikili dosyası kullanan bir Python uygulaması dağıtacaksınız. Konteyner'e bir görüntü yüklediğinizde, işlev tetiklenir, görüntüyü dönüştürmek için bağlamalı diskteki ffmpeg'i çağırır ve sonucu tekrar depolama alanına kaydeder. Dağıtım paketiniz yerine büyük ikili dosyaları, örneğin ffmpeg'i, bağlı bir paylaşımda barındırarak, dağıtımları küçük tutar ve soğuk başlatmaların hızlı olmasını sağlarsınız.

Bu eğitimde, siz:

  • Azure Developer CLI'yi kullanarak bir Azure Dosyalar paylaşımına bağlı Flex Consumption işlev uygulaması dağıtma
  • Blob tabanlı işlemeyi tetiklemek için örnek bir görüntü yükleyin
  • Mount edilen birimden ffmpeg adlı işlevin dönüştürülen görüntüyü kaydettiğini doğrulayın.

Uyarı

Bu makalenin kod örnekleri, Azure Functions Flex Consumption with Azure Files OS Mount Samples GitHub deposunda mevcuttur.

Önkoşullar

Bu öğreticideki CLI örnekleri Bash söz dizimini kullanır ve Azure Cloud Shell (Bash) ve Linux/macOS terminallerinde test edilmiştir.

Örnek projeyi başlatma

Bu öğretici için örnek kod Azure Dosyalar OS Bağlama Örnekleri ile Azure İşlevleri Esnek Tüketimi GitHub deposundadır. Bu klasör, fonksiyon uygulama kodu, gerekli Azure kaynaklarını sağlayan bir Bicep şablonu ve ffmpeg ikili dosyasını yükleyen bir dağıtım sonrası komut dosyasını içerir.

  1. Bir terminal açın ve depoyu kopyalamak istediğiniz dizine gidin.

  2. Depoyu kopyalayın:

    git clone https://github.com/Azure-Samples/Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples.git
    
  3. Proje klasörüne gidin:

    cd Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples/ffmpeg-image-processing
    
  4. azd ortamını başlatın. İstendiğinde, ffmpeg-processing gibi örneğin bir ortam adı girin:

    azd init
    

Kodu gözden geçirin

OS bağlama tabanlı işlemin çalışmasını sağlayan üç önemli parça, bağlamayı oluşturan altyapı, ikiliyi üstüne yükleyen betik ve onu çağıran işlev kodudur.

Modül, mounts.bicep işlev uygulamasında bir Azure Files SMB bağlamasını yapılandırır. değeri, mountPath dosyaların çalışma zamanında görüntülendiği yerel yolu belirler. Depolama hesabı erişim anahtarını bir parametre olarak geçersiniz ve platform bunu çalışma zamanında bir Key Vault başvurusu ile çözümler.

@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]

Azure Dosyalar SMB bağlamaları henüz yönetilen kimlik doğrulamasını desteklemediğinden bir depolama hesabı anahtarına ihtiyacınız vardır. En iyi uygulama olarak, bu anahtarı Azure Key Vault'ta depolayın ve bir uygulama ayarında Key Vault referansı kullanın. Montaj yapılandırması, @AppSettingRef() kullanarak bu uygulama ayarına başvurur, bu nedenle anahtar hiçbir zaman Bicep şablonlarınızda görünmez. Modül keyvault.bicep kasayı oluşturur, anahtarı depolar ve RBAC rollerini verir.

@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

main.bicep dosyası, bağlama ve Key Vault modüllerini çağırır.


// 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
  ]
}

Azure Geliştirici CLI'sı kullanarak dağıtma

Bu örnek bir Azure Geliştirici CLI (azd) şablonudur. Tek azd up bir komut altyapı sağlar, işlev kodunu dağıtır, ffmpeg ikili dosyasını Azure Dosyalar'a yükler ve blob tetikleyicileri için Event Grid aboneliğini oluşturur.

  1. Azure'da oturum açın. Dağıtım sonrası betiği Azure CLI komutlarını kullandığından her iki aracı kullanarak kimlik doğrulaması yapmanız gerekir:

    azd auth login
    az login
    
  2. Her şeyi sağlama ve dağıtma:

    azd up
    

    İstendiğinde, kullanılacak Azure aboneliğini ve konumunu seçin. Komut daha sonra şudur:

    • Kaynak grubu, depolama hesabı, Key Vault, Flex Consumption işlev uygulaması, Application Insights örneği ve yönetilen kimlik oluşturur.
    • Python işlev kodunu dağıtır.
    • ffmpeg ikili dosyasını indirir ve Azure Dosyalar paylaşımına yükler.
    • Blob yüklemelerinin işlevinizi tetiklemesi için bir Event Grid aboneliği oluşturur.
    • Sağlık kontrolü gerçekleştirir.

    Uyarı

    Azure Dosyalar SMB bağlamaları henüz yönetilen kimlik doğrulamasını desteklemediğinden bir depolama hesabı anahtarı gereklidir. En iyi uygulama olarak, dağıtım bu anahtarı Azure Key Vault'ta depolar ve anahtar uygulama ayarlarında hiçbir zaman gösterilmemesi için bir Key Vault başvurusu kullanır. Bu yaklaşım, merkezi gizli yönetimi, denetim ve anahtar yenileme desteği sağlar.

    Dağıtım birkaç dakika sürer. Tamamlandığında, oluşturulan kaynakların özetini görürsünüz.

  3. Kalan adımlar için kaynak adlarını kabuk değişkenleri olarak kaydedin:

    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)
    

Görüntüyü işleme

  1. Depoda bulunan örnek görüntüyü giriş kapsayıcısına yükleyin. Dağıtım sırasında oluşturulan Event Grid aboneliği, blob karşıya yüklendiğinde işlevinizi otomatik olarak tetikler.

    az storage blob upload \
      --container-name $INPUT_CONTAINER \
      --name sample_image.png \
      --file sample_image.png \
      --account-name $STORAGE_ACCOUNT \
      --auth-mode login
    

    Tip

    Tetikleyici hemen tetiklenmiyorsa 10-15 saniye bekleyin ve ardından azure portalında işlevin yürütme günlüklerini denetleyin.

  2. Çıktı kapsayıcısında blobları listeleyerek işlevin görüntüyü işlediğini doğrulayın:

    az storage blob list \
      --container-name $OUTPUT_CONTAINER \
      --account-name $STORAGE_ACCOUNT \
      --auth-mode login \
      -o table
    

    Çıkış kapsayıcısında sample_image.jpg görmelisiniz.

  3. Dönüştürülen görüntüyü indirin:

    az storage blob download \
      --container-name $OUTPUT_CONTAINER \
      --name sample_image.png \
      --file ./output_image.png \
      --account-name $STORAGE_ACCOUNT \
      --auth-mode login
    

Uyarı

İlk yürütme biraz daha yavaş olabilir (soğuk başlangıç). sonraki çağrılar daha hızlıdır çünkü işlev kapsayıcısı sıcak kalır ve ffmpeg önbelleğe alınır. Soğuk başlangıçları en aza indirmek için her zaman hazır örnekleri etkinleştirmeyi göz önünde bulundurun.

Kaynakları temizle

Devam eden ücretlerden kaçınmak için bu öğretici tarafından oluşturulan tüm kaynakları silin:

azd down --purge

Uyarı

Bu komut işlev uygulaması, depolama hesabı ve Application Insights örneği dahil olmak üzere kaynak grubunu ve içindeki tüm kaynakları siler.