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, paralel metin dosyası analizini yönetmek için Dayanıklı İşlevler kullanan bir Python Azure İşlevleri uygulaması dağıtacaksınız. İşlev uygulamanız bir Azure Dosyalar paylaşımı bağlar, birden çok metin dosyasını paralel olarak analiz eder (fan-out), sonuçları toplar (fan-in) ve arayana döndürür. Bu yaklaşım, depolama bağlamalarının önemli bir avantajını gösterir: istek başına ağ yükü olmadan birden çok işlev örneğinde paylaşılan dosya erişimi.
Bu eğitimde, siz:
- Dayanıklı İşlevler uygulamasını bağlı bir Azure Dosyalar paylaşımıyla Esnek Tüketim planında dağıtmak için Azure Geliştirici CLI'sini kullanma
- Örnek metin dosyalarını paralel olarak işlemek için bir orkestrasyon tetikle
- Toplanan analiz sonuçlarını doğrulama
Note
Bu makalenin kod örnekleri, Azure İşlevleri Flex Consumption with Azure Dosyalar OS Mount Samples GitHub deposunda mevcuttur.
Prerequisites
- 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 öğreticinin örnek kodunu Azure Dosyalar OS Bağlama Örnekleri ile Azure İşlevleri Esnek Tüketim GitHub deposunda bulabilirsiniz.
durable-text-analysis klasörü, işlev uygulaması kodunu, gerekli Azure kaynaklarını sağlayan bir Bicep şablonunu ve örnek metin dosyalarını karşıya yükleyen dağıtım sonrası betiği 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/durable-text-analysisazdortamını başlatın. İstendiğinde,durable-textgibi örneğin bir ortam adı girin:azd init
Kodu gözden geçirin
Bu örnek çalışmayı mümkün kılan üç ana unsur, bağlamayı gerçekleştiren altyapı, örnek dosyaları yükleyen betik ve analizi yöneten işlev kodudur.
Çalışma zamanında düzenleme şu akışı izler:
-
/api/start-analysisiçin HTTP POST, Dayanıklı İşlevler orkestrasyonunu başlatır. - Orkestratör, bağlamadaki tüm
list_text_filesdosyalarını bulmak için.txtetkinliğini çağırır. - Orchestrator, her dosyayı paralel olarak işlemek için
analyse_text_fileçağırarak görevleri dağıtır. - Tüm paralel görevler tamamlandıktan sonra düzenleyici, dosya başına ölçümleri tek bir özette birleştirmeyi çağırır
aggregate_results. - Toplanan sonuç, düzenleme çıkışı olarak döndürülür.
Modül, mounts.bicep işlev uygulamasında bir Azure Dosyalar 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: 'data'
shareName: 'data'
mountPath: '/mounts/data/'
}
]
}
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 ve örnek metin dosyalarını Azure Dosyalar paylaşımına yükler.
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:
- Bir kaynak grubu, depolama hesabı, Key Vault, Dayanıklı İşlevler yapılandırmasıyla birlikte Flex Consumption işlev uygulaması, Application Insights örneği ve yönetilen kimlik oluşturur.
- Python işlev kodunu dağıtır
- Örnek metin dosyalarını Azure Dosyalar paylaşımına yükler
- Sistem durumu denetimi çalıştırır
Note
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, 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) FUNCTION_APP_NAME=$(azd env get-value AZURE_FUNCTION_APP_NAME) FUNCTION_APP_URL=$(azd env get-value AZURE_FUNCTION_APP_URL)
Orkestrasyonu tetikle
İşlev ana bilgisayar anahtarını alın:
HOST_KEY=$(az functionapp keys list \ --resource-group $RESOURCE_GROUP \ --name $FUNCTION_APP_NAME \ --query "functionKeys.default" \ -o tsv)Orkestrasyonu başlatın. Opsiyonel olarak
{"mount_path": "/mounts/data/"}ile varsayılan montaj yolunu geçersiz kılmak için bir JSON gövdesi geçirebilirsiniz.curl -s -X POST "${FUNCTION_APP_URL}/api/start-analysis?code=${HOST_KEY}" | jq .Yanıt, durumu denetlemek, olayları göndermek veya düzenlemeyi sonlandırmak için kullanabileceğiniz bir örnek kimliği ve yönetim URI'leri içerir:
{ "id": "abc123def456", "statusQueryGetUri": "https://<your-app>.azurewebsites.net/...", "sendEventPostUri": "https://...", "terminatePostUri": "https://..." }
Sonuçları doğrulama
Tetikleyici yanıtından
statusQueryGetUri'ü kullanarak orkestrasyon durumunu denetleyin.STATUS_URL="<statusQueryGetUri-from-trigger-response>" curl -s "${STATUS_URL}" | jq .Orkestrasyon çalışırken,
runtimeStatushalindedirRunning. Tamamlandığında yanıt şöyle görünür:{ "instanceId": "abc123def456", "runtimeStatus": "Completed", "output": { "total_files": 3, "total_words": 45, "total_lines": 12, "total_chars": 303, "overall_avg_word_length": 4.82, "overall_top_characters": [["e", 42], ["t", 38], ["a", 35]], "per_file": [ { "file_path": "/mounts/data/sample1.txt", "word_count": 15, "line_count": 4, "char_count": 98, "avg_word_length": 5.1, "top_characters": [["e", 14], ["t", 12]] }, { "file_path": "/mounts/data/sample2.txt", "word_count": 18, "line_count": 5, "char_count": 120, "avg_word_length": 4.6, "top_characters": [["a", 16], ["e", 15]] }, { "file_path": "/mounts/data/sample3.txt", "word_count": 12, "line_count": 3, "char_count": 85, "avg_word_length": 4.9, "top_characters": [["e", 13], ["t", 11]] } ] } }Uygulama ayrıca durum yanıtını basitleştirilmiş şekilde döndüren kullanışlı bir uç noktayı
/api/status/{instance_id}'da sunar.
Tavsiye
İşlev uygulamanız, depolama bağlaması aracılığıyla üç dosyaya da paralel olarak erişir. Uygulamanın istek başına ağ çağrısına ihtiyacı yoktur. İşlev, standart dosya giriş/çıkış işlemlerini kullanarak bunları doğrudan bağlı paylaşımdan okur. Bu yaklaşım, Dayanıklı İşlevler ile birlikte kullanılması durumunda depolama montajlarının gücünü gösterir.
Kaynakları temizle
Devam eden ücretlerden kaçınmak için bu öğretici tarafından oluşturulan tüm kaynakları silin:
azd down --purge
Warning
Bu komut işlev uygulaması, depolama hesabı ve Application Insights örneği dahil olmak üzere kaynak grubunu ve içindeki tüm kaynakları siler.