Freigeben über

Azure Functions Flex Consumption + VNet outbound integration: deployment fails with BlobUploadFailedException to Azure Storage, only when VNet is enabled

Raphael 1 Zuverlässigkeitspunkt
2025-11-19T10:15:32.09+00:00

I am planning on using an Azure Functions Flex Consumption app (document-processing) with VNet outbound integration to access a Storage Account (documentstorage) without public network access (Blob Trigger on that SA), and deployments from Visual Studio Professional as well as my Azure Devops Release Pipeline consistently fail only when VNet integration is enabled. The function app uses a separate storage account (functionsstorage) for AzureWebJobsStorage and DEPLOYMENT_STORAGE_CONNECTION_STRING; this account has public network access enabled from all networks, no private endpoints, key access enabled.

The error messages under xxx.scm.azurewebsites.net/api/deployments/xxx/log:

[
  {
    "log_time": "2025-11-19T08:28:01.9357614Z",
    "id": "xxx",
    "message": "[StorageAccessibleCheck] Error while checking access to storage account using Kudu.Legion.Core.Storage.BlobContainerStorage: BlobUploadFailedException: Failed to upload blob to storage account: Resource temporarily unavailable (functionsstorage.blob.core.windows.net:443)",
    "type": 2
  },
  {
    "log_time": "2025-11-19T08:28:01.9404081Z",
    "id": "xxx",
    "message": "InaccessibleStorageException: Failed to access storage account for deployment: BlobUploadFailedException: Failed to upload blob to storage account: Resource temporarily unavailable (functionsstorage.blob.core.windows.net:443)",
    "type": 2
  }
]

From a VM in the same VNet I can successfully nslookup and Test-NetConnection to functionsstorage.blob.core.windows.net:443. Despite this, the Kudu deployment pipeline fails.

As soon as I disable VNet outbound integration on the Flex app, deployment succeeds with the exact same configuration, which makes me suspect a Flex + VNet integration/platform issue affecting Kudu’s access to the storage account.

VNet/Subnet Config:

  • Subnet IP address availability: 123 available (123 total)
  • Subnet connected sites: document-processing
  • Subnet connected plans: ASP-TestRG-98uz
  • Private Subnet: unchecked
  • NAT, NSG, Route Table: None
  • Service Endpoints: Microsoft.Storage
  • Service Endpoint Policies: None
  • Subnet Delegation: Microsoft.App/environments
  • Private endpoint network policy: Disabled
  • DNS: Custom DNS Servers (10.0.1.5, 10.0.1.6), No private resolver, one vnet link (private dns zone) to privatelink.azurewebsites.net

Note:

If I create a new Function App with Hosting Type App Service (Linux) and configurate the vnet (different delegation, rest is the same), the deployment works fine.

I would be very thankful if you could help me.

Azure-Funktionen
Azure-Funktionen
Ein Azure-Dienst, der eine ereignisgesteuerte serverlose Computeplattform bereitstellt
{count} Stimmen

1 Antwort

Sortieren nach: Am hilfreichsten
  1. Siddhesh Desai 735 Zuverlässigkeitspunkte Externe Microsoft-Mitarbeiter Moderator
    2025-11-20T18:21:16.6333333+00:00

    Hello Raphael,

    So habe ich das Problem gelöst:

    Schritt 1:

    Ich habe eine Funktions-App mit VNet-Integration erstellt. Sowohl mein App-Service als auch meine Funktionswebsite sind wie folgt hinzugefügt:

    NSG, Routingtabelle und NAT-Gateway sind nicht konfiguriert.

    Benutzerbild

    Schritt 2: Mein Speicherkonto für Funktions-Apps hat den öffentlichen Zugriff aktiviert:Benutzerbild

    Schritt 3: Ich habe nun die verwaltete Identität für Funktions-Apps aktiviert und die Speicherkontorollen wie folgt hinzugefügt: Verwaltete Identität für Funktions-Apps aktiviert: -

    Benutzerbild

    Navigieren Sie zum Speicherkonto der Funktions-App > Zugriffskontrolle (IAM) > Rolle <Speicherrolle>. Fügen Sie unter Benutzer, Gruppe, Dienstprinzipal die verwaltete Identität der Funktions-App als Mitglied hinzu. Überprüfen und zuweisen Sie die Änderungen. Wiederholen Sie diesen Vorgang für die beiden anderen Rollen.

    Informationen zum Hinzufügen der Rollen der verwalteten Identität der Funktions-App zum Speicherkonto finden Sie in diesem Microsoft-Dokument: https://learn.microsoft.com/en-us/azure/azure-functions/functions-identity-based-connections-tutorial#grant-the-system-assigned-identity-access-to-the-storage-account

    Rollen:

    • Speicherkonto-Mitwirkender (Storage account contributor)

    • Besitzer von Speicherblobdaten (Storage blob data owner)

    • Mitwirkender von Speicherwarteschlangendaten (Storage queue data contributor)

    Benutzerbild

    Rollenzuweisungsbeispiel:

    Benutzerbild

    Schritt 4: Fügen Sie nun in Ihrer Functions-App die unten stehenden App-Einstellungen hinzu. Es ist nicht erforderlich, weitere App-Einstellungen hinzuzufügen:

    "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
     "value": "InstrumentationKey=xxxxxx1;IngestionEndpoint=https://northeurope-.in.applicationinsights.azure.com/;LiveEndpoint=https://northeurope.livediagnostics.monitor.azure.com/;ApplicationId=xxxxxxxxxxx",
     
    
    "name": "AzureWebJobsStorage__accountName",
    "value": "stfuncflexbd00",
    

    Stellen Sie sicher, dass nach AzureWebJobsStorage__ ein doppelter Unterstrich folgt, und anschließend muss accountName und value der Name Ihres Function Storage-Kontos sein, in dem die verwaltete Identität aktiviert ist.

    Benutzerbild

    Schritt 4: Ich habe in Visual Studio einen Blob-Trigger erstellt und ihn in der oben genannten Flex-Funktions-App bereitgestellt. Die Bereitstellung war erfolgreich (siehe unten).

    BenutzerbildBenutzerbild

    Wenn ich die Funktion nun über die Funktions-App ausführe, wird sie erfolgreich ausgeführt. Siehe unten:

    Benutzerbild

    Benutzerbild

    Alternativ können Sie diesen Blog konsultieren, in dem die Bereitstellung einer in VNET integrierten Flex-Funktions-App mit Terraform beschrieben wird: https://carlos.mendible.com/2024/12/12/deploy-flex-consumption-azure-function-with-vnet-integration-using-terraform/ Die App-Einstellungen und die Speicherkontorolle müssen jedoch wie oben beschrieben nach der Bereitstellung hinzugefügt werden.


Ihre Antwort

Antworten können von Fragestellenden als „Angenommen“ und von Moderierenden als „Empfohlen“ gekennzeichnet werden, wodurch Benutzende wissen, dass diese Antwort das Problem des Fragestellenden gelöst hat.