Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
- Aktif bir aboneliğe sahip bir Azure hesabı. Ücretsiz bir hesap oluşturun.
- Azure Geliştirici CLI (azd) sürüm 1.9.0 veya üzeri
- Git
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.
Bir terminal açın ve depoyu kopyalamak istediğiniz dizine gidin.
Depoyu kopyalayın:
git clone https://github.com/Azure-Samples/Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples.gitProje klasörüne gidin:
cd Azure-Functions-Flex-Consumption-with-Azure-Files-OS-Mount-Samples/ffmpeg-image-processingazdortamını başlatın. İstendiğinde,ffmpeg-processinggibi ö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.
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 loginHer ş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.
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
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 loginTip
Tetikleyici hemen tetiklenmiyorsa 10-15 saniye bekleyin ve ardından azure portalında işlevin yürütme günlüklerini denetleyin.
Çı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.jpggörmelisiniz.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.