Serverlose Webanwendung in AzureServerless web application on Azure

Diese Referenzarchitektur zeigt eine serverlose Webanwendung.This reference architecture shows a serverless web application. Die Anwendung stellt statische Inhalte aus Azure Blob Storage bereit und implementiert eine API mit Azure Functions.The application serves static content from Azure Blob Storage, and implements an API using Azure Functions. Die API liest Daten aus Cosmos DB und gibt die Ergebnisse für die Web-App zurück.The API reads data from Cosmos DB and returns the results to the web app.

GitHub-Logo Eine Referenzimplementierung dieser Architektur ist auf GitHub verfügbar.GitHub logo A reference implementation for this architecture is available on GitHub.

Referenzarchitektur für eine serverlose Webanwendung

Der Begriff „serverlos“ hat zwei separate Bedeutungen, die aber miteinander zusammenhängen:The term serverless has two distinct but related meanings:

  • Back-End-as-a-Service (BaaS).Backend as a service (BaaS). Back-End-Clouddienste, z. B. Datenbanken und Speicher, stellen APIs bereit, mit denen Clientanwendungen eine direkte Verbindung mit diesen Diensten herstellen können.Back-end cloud services, such as databases and storage, provide APIs that enable client applications to connect directly to these services.
  • Functions-as-a-Service (FaaS).Functions as a service (FaaS). Bei diesem Modell ist eine „Funktion“ ein Codeabschnitt, der in der Cloud bereitgestellt und in einer Hostumgebung ausgeführt wird, in der die Server für die Ausführung des Codes vollständig abstrahiert werden.In this model, a "function" is a piece of code that is deployed to the cloud and runs inside a hosting environment that completely abstracts the servers that run the code.

Für beide Definitionen steckt die Idee dahinter, dass Entwickler und DevOps-Benutzer keine Server bereitstellen, konfigurieren oder verwalten müssen.Both definitions have in common the idea that developers and DevOps personnel don't need to deploy, configure, or manage servers. Bei dieser Referenzarchitektur liegt der Schwerpunkt auf FaaS mit Azure Functions. Die Bereitstellung von Webinhalten aus Azure Blob Storage ist ein Beispiel für BaaS.This reference architecture focuses on FaaS using Azure Functions, although serving web content from Azure Blob Storage could be an example of BaaS. Hier sind einige wichtige Merkmale von FaaS angegeben:Some important characteristics of FaaS are:

  1. Computeressourcen werden je nach den Anforderungen der Plattform dynamisch zugeordnet.Compute resources are allocated dynamically as needed by the platform.
  2. Nutzungsbasierte Preise: Ihnen werden nur die Computeressourcen berechnet, die zum Ausführen des Codes verwendet werden.Consumption-based pricing: You are charged only for the compute resources used to execute your code.
  3. Die Computeressourcen werden bedarfsabhängig anhand des Datenverkehrs skaliert, ohne dass der Entwickler eine Konfiguration durchführen muss.The compute resources scale on demand based on traffic, without the developer needing to do any configuration.

Die Funktionen werden ausgeführt, wenn ein externer Auslöser vorliegt, z.B. eine HTTP-Anforderung oder der Empfang einer Nachricht in einer Warteschlange.Functions are executed when an external trigger occurs, such as an HTTP request or a message arriving on a queue. Daher ist ein ereignisgesteuerter Architekturstil die natürliche Wahl für serverlose Architekturen.This makes an event-driven architecture style natural for serverless architectures. Für die Koordinierung der Arbeit zwischen den Komponenten der Architektur können Sie erwägen, Nachrichtenbroker oder Pub/Sub-Muster zu nutzen.To coordinate work between components in the architecture, consider using message brokers or pub/sub patterns. Hilfe zur Auswahl der richtigen Messagingtechnologie in Azure finden Sie unter Auswählen zwischen Azure-Diensten für die Nachrichtenübermittlung.For help with choosing between messaging technologies in Azure, see Choose between Azure services that deliver messages.

ArchitectureArchitecture

Die Architektur umfasst die folgenden Komponenten:The architecture consists of the following components:

Blobspeicher.Blob Storage. Statische Webinhalte, z. B. HTML-, CSS- und JavaScript-Dateien, werden in Azure Blob Storage gespeichert und für Clients bereitgestellt, indem das Hosten von statischen Websites verwendet wird.Static web content, such as HTML, CSS, and JavaScript files, are stored in Azure Blob Storage and served to clients by using static website hosting. Alle dynamischen Interaktionen erfolgen über JavaScript-Code, der Back-End-APIs aufruft.All dynamic interaction happens through JavaScript code making calls to the back-end APIs. Es ist kein serverseitiger Code zum Rendern der Webseite vorhanden.There is no server-side code to render the web page. Für das Hosten statischer Websites werden Indexdokumente und benutzerdefinierte 404-Fehlerseiten unterstützt.Static website hosting supports index documents and custom 404 error pages.

CDN.CDN. Verwenden Sie Azure Content Delivery Network (CDN) zum Zwischenspeichern von Inhalten, um eine geringere Latenz und schnellere Bereitstellung eines HTTPS-Endpunkts zu erzielen.Use Azure Content Delivery Network (CDN) to cache content for lower latency and faster delivery of content, as well as providing an HTTPS endpoint.

Funktions-Apps.Function Apps. Azure Functions ist eine serverlose Computeoption.Azure Functions is a serverless compute option. Es wird ein ereignisgesteuertes Modell verwendet, bei dem ein Codeabschnitt (eine „Funktion“) durch einen Trigger aufgerufen wird.It uses an event-driven model, where a piece of code (a "function") is invoked by a trigger. In dieser Architektur wird die Funktion aufgerufen, wenn ein Client eine HTTP-Anforderung sendet.In this architecture, the function is invoked when a client makes an HTTP request. Die Anforderung wird immer über ein API-Gateway geleitet, wie unten beschrieben.The request is always routed through an API gateway, described below.

API Management.API Management. Bei API Management wird ein API-Gateway bereitgestellt, das vor der HTTP-Funktion angeordnet ist.API Management provides an API gateway that sits in front of the HTTP function. Sie können API Management nutzen, um von Clientanwendungen verwendete APIs zu veröffentlichen und zu verwalten.You can use API Management to publish and manage APIs used by client applications. Mit der Verwendung eines Gateways wird die Entkopplung der Front-End-Anwendung von den Back-End-APIs unterstützt.Using a gateway helps to decouple the front-end application from the back-end APIs. Beispielsweise kann API Management URLs umschreiben, Anforderungen vor dem Erreichen des Back-Ends transformieren, Anforderungs- oder Antwortheader festlegen usw.For example, API Management can rewrite URLs, transform requests before they reach the back end, set request or response headers, and so forth.

API Management kann auch verwendet werden, um übergreifende Aspekte zu implementieren, z.B.:API Management can also be used to implement cross-cutting concerns such as:

  • Erzwingen von Nutzungskontingenten und RatenbegrenzungenEnforcing usage quotas and rate limits
  • Überprüfen von OAuth-Token für die AuthentifizierungValidating OAuth tokens for authentication
  • Aktivieren von ursprungsübergreifenden Anforderungen (Cross-Origin Requests, CORS)Enabling cross-origin requests (CORS)
  • Zwischenspeichern von AntwortenCaching responses
  • Überwachen und Protokollieren von AnforderungenMonitoring and logging requests

Falls Sie nicht die gesamte Funktionalität benötigen, die von API Management bereitgestellt wird, ist die Nutzung von Funktionsproxys eine Alternative.If you don't need all of the functionality provided by API Management, another option is to use Functions Proxies. Mit diesem Feature von Azure Functions können Sie eine einzelne API-Oberfläche für mehrere Funktions-Apps definieren, indem Sie Routen zu Back-End-Funktionen erstellen.This feature of Azure Functions lets you define a single API surface for multiple function apps, by creating routes to back-end functions. Außerdem können mit Funktionsproxys eingeschränkte Transformationen für die HTTP-Anforderung und -Antwort durchgeführt werden.Function proxies can also perform limited transformations on the HTTP request and response. Sie ermöglichen aber nicht die gleichen umfassenden richtlinienbasierten Funktionen wie API Management.However, they don't provide the same rich policy-based capabilities of API Management.

Cosmos DB:Cosmos DB. Cosmos DB ist ein Datenbankdienst mit mehreren Modellen.Cosmos DB is a multi-model database service. Für dieses Szenario ruft die Funktionsanwendung Dokumente aus Cosmos DB als Antwort auf HTTP GET-Anforderungen vom Client ab.For this scenario, the function application fetches documents from Cosmos DB in response to HTTP GET requests from the client.

Azure Active Directory (Azure AD).Azure Active Directory (Azure AD). Benutzer melden sich mit ihren Azure AD-Anmeldeinformationen an der Webanwendung an.Users sign into the web application by using their Azure AD credentials. Azure AD gibt ein Zugriffstoken für die API zurück, das von der Webanwendung genutzt wird, um API-Anforderungen zu authentifizieren (siehe Authentifizierung).Azure AD returns an access token for the API, which the web application uses to authenticate API requests (see Authentication).

Azure Monitor:Azure Monitor. Monitor erfasst Leistungsmetriken zu den in der Lösung bereitgestellten Azure-Diensten.Monitor collects performance metrics about the Azure services deployed in the solution. Durch die Visualisierung dieser Metriken in einem Dashboard können Sie einen Einblick in die Integrität der Lösung gewinnen.By visualizing these in a dashboard, you can get visibility into the health of the solution. Außerdem werden Anwendungsprotokolle erfasst.It also collected application logs.

Azure Pipelines.Azure Pipelines. Pipelines ist ein CI-/CD-Dienst (Continuous Integration/Continuous Delivery), mit dem die Anwendung erstellt, getestet und bereitgestellt wird.Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.

EmpfehlungenRecommendations

Funktions-App-PläneFunction App plans

Azure Functions unterstützt zwei Hostingmodelle.Azure Functions supports two hosting models. Beim Verbrauchstarif wird automatisch Computeleistung zugeordnet, wenn Ihr Code ausgeführt wird.With the consumption plan, compute power is automatically allocated when your code is running. Beim App Service-Plan wird eine Gruppe von VMs für Ihren Code zugeordnet.With the App Service plan, a set of VMs are allocated for your code. Mit dem App Service-Plan wird die Anzahl von VMs und die VM-Größe definiert.The App Service plan defines the number of VMs and the VM size.

Beachten Sie, dass der App Service-Plan nicht serverlos im strengeren Sinne gemäß der obigen Definition ist.Note that the App Service plan is not strictly serverless, according to the definition given above. Das Programmiermodell ist aber identisch: Sowohl unter einem Verbrauchstarif als auch unter einem App Service-Plan kann der gleiche Funktionscode ausgeführt werden.The programming model is the same, however — the same function code can run in both a consumption plan and an App Service plan.

Hierbei müssen einige Faktoren berücksichtigt werden, wenn ausgewählt wird, welche Art von Plan verwendet werden soll:Here are some factors to consider when choosing which type of plan to use:

  • Kaltstart.Cold start. Beim Verbrauchstarif führt eine Funktion, die nicht kürzlich aufgerufen wurde, bei der nächsten Ausführung zu zusätzlicher Latenz.With the consumption plan, a function that hasn't been invoked recently will incur some additional latency the next time it runs. Der Grund für diese zusätzliche Latenz ist die Zuordnung und Vorbereitung der Laufzeitumgebung.This additional latency is due to allocating and preparing the runtime environment. Dies bewegt sich normalerweise im Sekundenbereich, ist aber von mehreren Faktoren abhängig, z.B. der Anzahl von Abhängigkeiten, die geladen werden müssen.It is usually on the order of seconds but depends on several factors, including the number of dependencies that need to be loaded. Weitere Informationen finden Sie unter Understanding Serverless Cold Start (Grundlegendes zum serverlosen Kaltstart).For more information, see Understanding Serverless Cold Start. Der Kaltstart ist normalerweise eher ein Problem bei interaktiven Workloads (HTTP-Trigger) als bei asynchronen nachrichtengesteuerten Workloads (Warteschlangen- oder Event Hubs-Trigger), da die zusätzliche Latenz von den Benutzern direkt erkannt wird.Cold start is usually more of a concern for interactive workloads (HTTP triggers) than asynchronous message-driven workloads (queue or event hubs triggers), because the additional latency is directly observed by users.
  • Zeitlimit.Timeout period. Beim Verbrauchstarif tritt für eine Funktionsausführung nach einem konfigurierbaren Zeitraum ein Timeout auf (maximal zehn Minuten).In the consumption plan, a function execution times out after a configurable period of time (to a maximum of 10 minutes)
  • Isolation virtueller Netzwerke.Virtual network isolation. Bei der Nutzung eines App Service-Plans können Funktionen in einer App Service-Umgebung ausgeführt werden, bei der es sich um eine dedizierte und isolierte Hostingumgebung handelt.Using an App Service plan allows functions to run inside of an App Service Environment, which is a dedicated and isolated hosting environment.
  • Preismodell.Pricing model. Die Abrechnung für den Verbrauchstarif erfolgt anhand der Anzahl von Ausführungen und des Ressourcenverbrauchs (Arbeitsspeicher × Ausführungszeit).The consumption plan is billed by the number of executions and resource consumption (memory × execution time). Beim App Service-Plan erfolgt die Abrechnung stündlich basierend auf der VM-Instanz-SKU.The App Service plan is billed hourly based on VM instance SKU. Der Verbrauchstarif kann häufig kostengünstiger als ein App Service-Plan sein, da Sie nur für die genutzten Computeressourcen zahlen.Often, the consumption plan can be cheaper than an App Service plan, because you pay only for the compute resources that you use. Dies gilt besonders, wenn Ihr Datenverkehr Spitzen und Täler aufweist.This is especially true if your traffic experiences peaks and troughs. Falls eine Anwendung aber über einen konstant hohen Datendurchsatz verfügt, sind die Kosten für einen App Service-Plan unter Umständen aber geringer als beim Verbrauchstarif.However, if an application experiences constant high-volume throughput, an App Service plan may cost less than the consumption plan.
  • Skalierung.Scaling. Ein großer Vorteil des Verbrauchsmodells ist, dass basierend auf dem eingehenden Datenverkehr bedarfsabhängig dynamisch skaliert wird.A big advantage of the consumption model is that it scales dynamically as needed, based on the incoming traffic. Diese Skalierung kann zwar schnell durchgeführt werden, aber es ist eine Vorlaufzeit erforderlich.While this scaling occurs quickly, there is still a ramp-up period. Für einige Workloads kann es ratsam sein, absichtlich zu viele VMs bereitzustellen, damit Datenverkehrsspitzen ohne Vorlaufzeit verarbeitet werden können.For some workloads, you might want to deliberately overprovision the VMs, so that you can handle bursts of traffic with zero ramp-up time. In diesem Fall sollten Sie erwägen, einen App Service-Plan zu nutzen.In that case, consider an App Service plan.

Grenzen von Funktions-AppsFunction App boundaries

Eine Funktions-App hostet die Ausführung von einer oder mehreren Funktionen.A function app hosts the execution of one or more functions. Sie können eine Funktions-App nutzen, um mehrere Funktionen als logische Einheit zu gruppieren.You can use a function app to group several functions together as a logical unit. Innerhalb einer Funktions-App sind für die Funktionen die Anwendungseinstellungen, der Hostingplan und der Entwicklungslebenszyklus jeweils gleich.Within a function app, the functions share the same application settings, hosting plan, and deployment lifecycle. Jede Funktions-App verfügt über einen eigenen Hostnamen.Each function app has its own hostname.

Verwenden Sie Funktions-Apps zum Gruppieren von Funktionen, die den gleichen Lebenszyklus und die gleichen Einstellungen aufweisen.Use function apps to group functions that share the same lifecycle and settings. Funktionen, die nicht über den gleichen Lebenszyklus verfügen, sollten in anderen Funktions-Apps gehostet werden.Functions that don't share the same lifecycle should be hosted in different function apps.

Erwägen Sie, einen Ansatz mit Microservices zu nutzen, bei dem jede Funktions-App einen Microservice darstellt, der unter Umständen aus mehreren verwandten Funktionen besteht.Consider taking a microservices approach, where each function app represents one microservice, possibly consisting of several related functions. In einer Architektur mit Microservices sollten Dienste eine lose Kopplung und eine hohe funktionale Kohäsion aufweisen.In a microservices architecture, services should have loose coupling and high functional cohesion. Lose gekoppelt bedeutet, dass Sie einen Dienst ändern können, ohne gleichzeitig andere Dienste aktualisieren zu müssen.Loosely coupled means you can change one service without requiring other services to be updated at the same time. Mit Kohäsion ist gemeint, dass ein Dienst einem einzelnen, klar definierten Zweck dient.Cohesive means a service has a single, well-defined purpose. Weitere Informationen zu diesen Aspekten finden Sie unter Entwerfen von Microservices: Domänenanalyse.For more discussion of these ideas, see Designing microservices: Domain analysis.

FunktionsbindungenFunction bindings

Nutzen Sie Funktionsbindungen, wann immer dies möglich ist.Use Functions bindings when possible. Bindungen stellen eine deklarative Möglichkeit dar, Ihren Code mit Daten zu verbinden und in andere Azure-Dienste zu integrieren.Bindings provide a declarative way to connect your code to data and integrate with other Azure services. Mit einer Eingabebindung wird ein Eingabeparameter aus einer externen Datenquelle aufgefüllt.An input binding populates an input parameter from an external data source. Eine Ausgabebindung sendet den Rückgabewert der Funktion an eine Datensenke, z.B. eine Warteschlange oder Datenbank.An output binding sends the function's return value to a data sink, such as a queue or database.

Für die Funktion GetStatus in der Referenzimplementierung wird die Cosmos DB-Eingabebindung verwendet.For example, the GetStatus function in the reference implementation uses the Cosmos DB input binding. Diese Bindung ist so konfiguriert, dass nach einem Dokument in Cosmos DB gesucht wird. Hierzu werden Abfrageparameter verwendet, die aus der Abfragezeichenfolge in der HTTP-Anforderung stammen.This binding is configured to look up a document in Cosmos DB, using query parameters that are taken from the query string in the HTTP request. Wenn das Dokument gefunden wird, wird es als Parameter an die Funktion übergeben.If the document is found, it is passed to the function as a parameter.

[FunctionName("GetStatusFunction")]
public static Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    [CosmosDB(
        databaseName: "%COSMOSDB_DATABASE_NAME%",
        collectionName: "%COSMOSDB_DATABASE_COL%",
        ConnectionStringSetting = "COSMOSDB_CONNECTION_STRING",
        Id = "{Query.deviceId}",
        PartitionKey = "{Query.deviceId}")] dynamic deviceStatus,
    ILogger log)
{
    ...
}

Aufgrund der Nutzung von Bindungen müssen Sie keinen Code schreiben, der direkt mit dem Dienst kommuniziert. Hierdurch wird der Funktionscode vereinfacht, und außerdem werden die Details der Datenquelle bzw. -senke abstrahiert.By using bindings, you don't need to write code that talks directly to the service, which makes the function code simpler and also abstracts the details of the data source or sink. In einigen Fällen benötigen Sie aber unter Umständen eine komplexere Logik als die von der Bindung bereitgestellte Logik.In some cases, however, you may need more complex logic than the binding provides. Verwenden Sie in diesem Fall direkt die Azure-Client-SDKs.In that case, use the Azure client SDKs directly.

Überlegungen zur SkalierbarkeitScalability considerations

Funktionen.Functions. Für den Verbrauchstarif wird der HTTP-Trigger basierend auf dem Datenverkehr skaliert.For the consumption plan, the HTTP trigger scales based on the traffic. Es gilt ein Limit für die Anzahl von gleichzeitigen Funktionsinstanzen, aber jede Instanz kann mehr als eine Anforderung gleichzeitig verarbeiten.There is a limit to the number of concurrent function instances, but each instance can process more than one request at a time. Für einen App Service-Plan wird der HTTP-Trigger gemäß der Anzahl von VM-Instanzen skaliert. Dies kann ein fester Wert sein, oder es kann eine automatische Skalierung basierend auf einem Satz mit entsprechenden Regeln durchgeführt werden.For an App Service plan, the HTTP trigger scales according to the number of VM instances, which can be a fixed value or can autoscale based on a set of autoscaling rules. Informationen hierzu finden Sie unter Skalierung und Hosting von Azure Functions.For information, see Azure Functions scale and hosting.

Cosmos DB:Cosmos DB. Die Durchsatzkapazität für Cosmos DB wird in Anforderungseinheiten (RU) gemessen.Throughput capacity for Cosmos DB is measured in Request Units (RU). Ein Durchsatz von einer Anforderungseinheit (1 RU) entspricht dem Durchsatz für das Abrufen eines 1-KB-Dokuments per GET-Anforderung.A 1-RU throughput corresponds to the throughput need to GET a 1KB document. Um einen Cosmos DB-Container auf eine Kapazität von mehr als 10.000 RU zu skalieren, müssen Sie beim Erstellen des Containers einen Partitionsschlüssel angeben und diesen in jedes von Ihnen erstellte Dokument einfügen.In order to scale a Cosmos DB container past 10,000 RU, you must specify a partition key when you create the container and include the partition key in every document that you create. Weitere Informationen zu Partitionsschlüsseln finden Sie unter Partitionieren und Skalieren in Azure Cosmos DB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

API Management.API Management. API Management ermöglicht das horizontale Hochskalieren und unterstützt die regelbasierte automatische Skalierung.API Management can scale out and supports rule-based autoscaling. Der Skalierungsvorgang dauert mindestens 20 Minuten.The scaling process takes at least 20 minutes. Wenn Ihr Datenverkehr Spitzen („Bursts“) aufweist, sollten Sie entsprechende Ressourcen bereitstellen, um den erwarteten maximalen Burstdatenverkehr abzudecken.If your traffic is bursty, you should provision for the maximum burst traffic that you expect. Die automatische Skalierung ist aber für die Verarbeitung von stündlichen oder täglichen Schwankungen beim Datenverkehr nützlich.However, autoscaling is useful for handling hourly or daily variations in traffic. Weitere Informationen finden Sie unter Automatisches Skalieren einer Azure API Management-Instanz.For more information, see Automatically scale an Azure API Management instance.

Überlegungen zur NotfallwiederherstellungDisaster recovery considerations

Die hier dargestellte Bereitstellung befindet sich in nur einer Azure-Region.The deployment shown here resides in a single Azure region. Nutzen Sie die Features für die geografische Verteilung in den verschiedenen Diensten, um einen stabileren Ansatz für die Notfallwiederherstellung zu erzielen:For a more resilient approach to disaster-recovery, take advantage of the geo-distribution features in the various services:

  • API Management unterstützt eine Bereitstellung für mehrere Regionen. Dies kann genutzt werden, um einen einzelnen API Management-Dienst in einer beliebigen Anzahl von Azure-Regionen zur Verfügung zu stellen.API Management supports multi-region deployment, which can be used to distribute a single API Management instance across any number of Azure regions. Weitere Informationen finden Sie unter Bereitstellen einer Azure API Management-Dienstinstanz für mehrere Azure-Regionen.For more information, see How to deploy an Azure API Management service instance to multiple Azure regions.

  • Verwenden Sie Traffic Manager, um HTTP-Anforderungen an die primäre Region zu leiten.Use Traffic Manager to route HTTP requests to the primary region. Wenn die Funktions-App, die in dieser Region ausgeführt wird, nicht verfügbar ist, kann Traffic Manager ein Failover in eine sekundäre Region ausführen.If the Function App running in that region becomes unavailable, Traffic Manager can fail over to a secondary region.

  • Cosmos DB unterstützt mehrere Masterregionen, sodass Schreibvorgänge in alle Regionen möglich sind, die Sie Ihrem Cosmos DB-Konto hinzufügen.Cosmos DB supports multiple master regions, which enables writes to any region that you add to your Cosmos DB account. Wenn Sie die Funktion für mehrere Master (Multimaster) nicht aktivieren, können Sie trotzdem ein Failover in die primäre Schreibregion ausführen.If you don't enable multi-master, you can still fail over the primary write region. Die Cosmos DB-Client-SDKs und die Azure-Funktionsbindungen verarbeiten das Failover automatisch, sodass Sie keine Einstellungen für die Anwendungskonfiguration aktualisieren müssen.The Cosmos DB client SDKs and the Azure Function bindings automatically handle the failover, so you don't need to update any application configuration settings.

SicherheitshinweiseSecurity considerations

AuthenticationAuthentication

Für die GetStatus-API in der Referenzimplementierung wird Azure AD zum Authentifizieren von Anforderungen verwendet.The GetStatus API in the reference implementation uses Azure AD to authenticate requests. Azure AD unterstützt das OpenID Connect-Protokoll, bei dem es sich um ein Authentifizierungsprotokoll handelt, das auf dem OAuth 2-Protokoll basiert.Azure AD supports the OpenID Connect protocol, which is an authentication protocol built on top of the OAuth 2 protocol.

In dieser Architektur ist die Clientanwendung eine Single-Page-Anwendung (SPA), die im Browser ausgeführt wird.In this architecture, the client application is a single-page application (SPA) that runs in the browser. Da bei dieser Art von Clientanwendung der geheime Clientschlüssel oder der Autorisierungscode nicht ausgeblendet werden können, ist die implizite Genehmigung hierfür der geeignete Ablauf.This type of client application cannot keep a client secret or an authorization code hidden, so the implicit grant flow is appropriate. (Siehe Which OAuth 2.0 flow should I use? (Welchen OAuth 2.0-Ablauf soll ich verwenden?).)(See Which OAuth 2.0 flow should I use?). Hier ist der allgemeine Ablauf angegeben:Here's the overall flow:

  1. Der Benutzer klickt in der Webanwendung auf den Link „Anmelden“.The user clicks the "Sign in" link in the web application.
  2. Der Browser wird auf die Azure AD-Anmeldeseite umgeleitet.The browser is redirected the Azure AD sign in page.
  3. Der Benutzer meldet sich an.The user signs in.
  4. Azure AD führt die Umleitung zurück zur Clientanwendung durch, einschließlich eines Zugriffstokens im URL-Fragment.Azure AD redirects back to the client application, including an access token in the URL fragment.
  5. Wenn die Webanwendung die API aufruft, fügt sie das Zugriffstoken in den Authentifizierungsheader ein.When the web application calls the API, it includes the access token in the Authentication header. Die Anwendungs-ID wird im Zugriffstoken als „Audience“-Anspruch („aud“) gesendet.The application ID is sent as the audience ('aud') claim in the access token.
  6. Die Back-End-API überprüft das Zugriffstoken.The back-end API validates the access token.

Konfigurieren Sie die Authentifizierung wie folgt:To configure authentication:

  • Registrieren Sie eine Anwendung in Ihrem Azure AD-Mandanten.Register an application in your Azure AD tenant. Es wird eine Anwendungs-ID generiert, die vom Client in die Anmelde-URL eingefügt wird.This generates an application ID, which the client includes with the login URL.

  • Aktivieren Sie die Azure AD-Authentifizierung in der Funktions-App.Enable Azure AD authentication inside the Function App. Weitere Informationen finden Sie unter Authentifizierung und Autorisierung in Azure App Service.For more information, see Authentication and authorization in Azure App Service.

  • Fügen Sie API Management die Richtlinie „validate-jwt“ hinzu, um die Anforderung durch Überprüfung des Zugriffstokens vorab zu autorisieren.Add the validate-jwt policy to API Management to pre-authorize the request by validating the access token.

Weitere Informationen finden Sie in der GitHub-Infodatei.For more details, see the GitHub readme.

Es wird empfohlen, für die Clientanwendung und die Back-End-API separate App-Registrierungen in Azure AD zu erstellen.It's recommended to create separate app registrations in Azure AD for the client application and the back-end API. Erteilen Sie der Clientanwendung Berechtigungen zum Aufrufen der API.Grant the client application permission to call the API. Bei diesem Ansatz können Sie ganz flexibel mehrere APIs und Clients definieren und die einzelnen Berechtigungen dafür steuern.This approach gives you the flexibility to define multiple APIs and clients and control the permissions for each.

Verwenden Sie innerhalb einer API Bereiche, damit Anwendungen präzise steuern können, welche Berechtigungen sie bei einem Benutzer voraussetzen.Within an API, use scopes to give applications fine-grained control over what permissions they request from a user. So kann eine API beispielsweise über die Bereiche Read und Write verfügen und eine bestimmte Client-App den Benutzer lediglich zur Autorisierung von Berechtigungen des Typs Read auffordern.For example, an API might have Read and Write scopes, and a particular client app might ask the user to authorize Read permissions only.

AuthorizationAuthorization

In vielen Anwendungen muss die Back-End-API überprüfen, ob ein Benutzer über die Berechtigung zum Durchführen einer bestimmten Aktion verfügt.In many applications, the back-end API must check whether a user has permission to perform a given action. Es wird empfohlen, die anspruchsbasierte Autorisierung zu verwenden. Hierbei werden Informationen zum Benutzer vom Identitätsanbieter (hier: Azure AD) übermittelt und zum Treffen von Autorisierungsentscheidungen genutzt.It's recommended to use claims-based authorization, where information about the user is conveyed by the identity provider (in this case, Azure AD) and used to make authorization decisions. Wenn Sie beispielsweise eine Anwendung in Azure AD registrieren, können Sie einen Satz mit Anwendungsrollen definieren.For example, when you register an application in Azure AD, you can define a set of application roles. Wenn sich ein Benutzer an der Anwendung anmeldet, enthält Azure AD einen roles-Anspruch für jede Rolle, die dem Benutzer gewährt wurde – einschließlich der Rollen, die über die Gruppenmitgliedschaft vererbt werden.When a user signs into the application, Azure AD includes a roles claim for each role that the user has been granted, including roles that are inherited through group membership.

Das ID-Token, das von Azure AD an den Client zurückgegeben wird, enthält einige Ansprüche des Benutzers.The ID token that Azure AD returns to the client contains some of the user's claims. In der Funktions-App sind diese Ansprüche im X-MS-CLIENT-PRINCIPAL-Header der Anforderung verfügbar.Within the function app, these claims are available in the X-MS-CLIENT-PRINCIPAL header of the request. Allerdings ist es einfacher, diese Informationen aus den Bindungsdaten zu lesen.However, it's simpler to read this information from binding data. Verwenden Sie für andere Ansprüche Microsoft Graph, um Azure AD abzufragen.For other claims, use Microsoft Graph to query Azure AD. (Der Benutzer muss seine Einwilligung zu dieser Aktion erteilen, wenn er sich anmeldet.)(The user must consent to this action when signing in.)

Weitere Informationen finden Sie unter Arbeiten mit Clientidentitäten.For more information, see Working with client identities.

CORSCORS

In dieser Referenzarchitektur weisen die Webanwendung und die API nicht denselben Ursprung auf.In this reference architecture, the web application and the API do not share the same origin. Dies bedeutet, dass es sich um eine ursprungsübergreifende Anforderung handelt, wenn die Anwendung die API aufruft.That means when the application calls the API, it is a cross-origin request. Die Browsersicherheit verhindert, dass eine Webseite AJAX-Anforderungen an eine andere Domäne richtet.Browser security prevents a web page from making AJAX requests to another domain. Diese Einschränkung wird als Richtlinie des gleichen Ursprungs bezeichnet und verhindert, dass eine schädliche Website sensible Daten von einer anderen Website liest.This restriction is called the same-origin policy and prevents a malicious site from reading sensitive data from another site. Sie können eine ursprungsübergreifende Anforderung aktivieren, indem Sie dem API Management-Gateway eine Richtlinie vom Typ CORS (Cross-Origin Resource Sharing, Ressourcenfreigabe zwischen verschiedenen Ursprüngen) hinzufügen:To enable a cross-origin request, add a Cross-Origin Resource Sharing (CORS) policy to the API Management gateway:

<cors allow-credentials="true">
    <allowed-origins>
        <origin>[Website URL]</origin>
    </allowed-origins>
    <allowed-methods>
        <method>GET</method>
    </allowed-methods>
    <allowed-headers>
        <header>*</header>
    </allowed-headers>
</cors>

In diesem Beispiel ist das Attribut allow-credentials auf true festgelegt.In this example, the allow-credentials attribute is true. Hiermit wird für den Browser das Senden von Anmeldeinformationen (einschließlich Cookies) mit der Anforderung autorisiert.This authorizes the browser to send credentials (including cookies) with the request. Andernfalls sendet der Browser standardmäßig keine Anmeldeinformationen mit einer ursprungsübergreifenden Anforderung.Otherwise, by default the browser does not send credentials with a cross-origin request.

Hinweis

Gehen Sie beim Festlegen von allow-credentials auf true mit Bedacht vor, da eine Website die Benutzeranmeldeinformationen dann im Namen des Benutzers an Ihre API senden kann, ohne dass der Benutzer darüber informiert ist.Be very careful about setting allow-credentials to true, because it means a website can send the user's credentials to your API on the user's behalf, without the user being aware. Sie müssen den zugelassenen Ursprung als vertrauenswürdig festlegen.You must trust the allowed origin.

Erzwingen von HTTPSEnforce HTTPS

Sie können maximale Sicherheit erzielen, indem Sie HTTPS für die gesamte Anforderungspipeline erzwingen:For maximum security, require HTTPS throughout the request pipeline:

  • CDN.CDN. Azure CDN unterstützt HTTPS standardmäßig für die Unterdomäne *.azureedge.net.Azure CDN supports HTTPS on the *.azureedge.net subdomain by default. Informationen zur Aktivierung von HTTPS im CDN für benutzerdefinierte Domänennamen finden Sie unter Tutorial: Konfigurieren von HTTPS in einer benutzerdefinierten Azure CDN-Domäne.To enable HTTPS in the CDN for custom domain names, see Tutorial: Configure HTTPS on an Azure CDN custom domain.

  • Hosten von statischen Websites.Static website hosting. Aktivieren Sie die Option „Sichere Übertragung erforderlich“ im Speicherkonto.Enable the "Secure transfer required" option on the Storage account. Wenn diese Option aktiviert ist, lässt das Speicherkonto nur Anforderungen von sicheren HTTPS-Verbindungen zu.When this option is enabled, the storage account only allows requests from secure HTTPS connections.

  • API Management.API Management. Konfigurieren Sie die APIs so, das nur das HTTPS-Protokoll verwendet werden kann.Configure the APIs to use HTTPS protocol only. Sie können dies im Azure-Portal oder über eine Resource Manager-Vorlage konfigurieren:You can configure this in the Azure portal or through a Resource Manager template:

    {
        "apiVersion": "2018-01-01",
        "type": "apis",
        "name": "dronedeliveryapi",
        "dependsOn": [
            "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
        ],
        "properties": {
            "displayName": "Drone Delivery API",
            "description": "Drone Delivery API",
            "path": "api",
            "protocols": [ "HTTPS" ]
        },
        ...
    }
    
  • Azure Functions.Azure Functions. Aktivieren Sie die Einstellung „Nur HTTPS“.Enable the "HTTPS Only" setting.

Sperren der Funktions-AppLock down the function app

Alle Aufrufe der Funktion sollten über das API-Gateway verlaufen.All calls to the function should go through the API gateway. Sie können dies wie folgt erreichen:You can achieve this as follows:

  • Konfigurieren Sie die Funktions-App so, dass ein Funktionsschlüssel verwendet werden muss.Configure the function app to require a function key. Das API Management-Gateway enthält den Funktionsschlüssel, wenn es die Funktions-App aufruft.The API Management gateway will include the function key when it calls the function app. So wird verhindert, dass Clients die Funktion direkt aufrufen, indem sie das Gateway umgehen.This prevents clients from calling the function directly, bypassing the gateway.

  • Das API Management-Gateway hat eine statische IP-Adresse.The API Management gateway has a static IP address. Beschränken Sie die Azure-Funktion, damit nur Aufrufe über diese statische IP-Adresse zulässig sind.Restrict the Azure Function to allow only calls from that static IP address. Weitere Informationen finden Sie unter Statische Azure App Service-IP-Einschränkungen.For more information, see Azure App Service Static IP Restrictions. (Dieses Feature ist nur für Dienste mit dem Standard-Tarif verfügbar.)(This feature is available for Standard tier services only.)

Schützen von AnwendungsgeheimnissenProtect application secrets

Speichern Sie Anwendungsgeheimnisse, z.B. Datenbank-Anmeldeinformationen, nicht in Ihrem Code oder in Konfigurationsdateien.Don't store application secrets, such as database credentials, in your code or configuration files. Verwenden Sie stattdessen App-Einstellungen, die in Azure verschlüsselt gespeichert werden.Instead, use App settings, which are stored encrypted in Azure. Weitere Informationen finden Sie unter Sicherheit in Azure App Service und Azure Functions.For more information, see Security in Azure App Service and Azure Functions.

Alternativ hierzu können Sie Anwendungsgeheimnisse in Key Vault speichern.Alternatively, you can store application secrets in Key Vault. Dies ermöglicht Ihnen die Zentralisierung der Speicherung von Geheimnissen, die Steuerung ihrer Verteilung und die Überwachung, wie und wann auf Geheimnisse zugegriffen wird.This allows you to centralize the storage of secrets, control their distribution, and monitor how and when secrets are being accessed. Weitere Informationen finden Sie unter Konfigurieren einer Azure-Webanwendung zum Lesen eines Geheimnisses aus Key Vault.For more information, see Configure an Azure web application to read a secret from Key Vault. Beachten Sie aber, dass Functions-Trigger und -Bindungen ihre Konfigurationseinstellungen aus App-Einstellungen laden.However, note that Functions triggers and bindings load their configuration settings from app settings. Es gibt keine integrierte Möglichkeit, für die Trigger und Bindungen die Verwendung von Key Vault-Geheimnissen zu konfigurieren.There is no built-in way to configure the triggers and bindings to use Key Vault secrets.

Überlegungen zu DevOpsDevOps considerations

Front-End-BereitstellungFront-end deployment

Das Front-End dieser Referenzarchitektur ist eine Einzelseitenanwendung, bei der JavaScript auf die serverlosen Back-End-APIs zugreift und statische Inhalte für ein schnelles Benutzererlebnis sorgen.The front end of this reference architecture is a single page application, with JavaScript accessing the serverless back-end APIs, and static content providing a fast user experience. Im Folgenden finden Sie einige wichtige Überlegungen zu einer solchen Anwendung:The following are some important considerations for such an application:

  • Stellen Sie die Anwendung mit einem CDN, das sich für den globalen Einsatz eignet, einheitlich für Benutzer in einem umfangreichen geografischen Gebiet bereit. Die statischen Inhalte werden in der Cloud gehostet.Deploy the application uniformly to users over a wide geographical area with a global-ready CDN, with the static content hosted on the cloud. Dadurch entfällt die Notwendigkeit eines dedizierten Webservers.This avoids the need for a dedicated web server. Lesen Sie zum Einstieg den Artikel Integrieren eines Azure-Speicherkontos in Azure CDN.Read Integrate an Azure storage account with Azure CDN to get started. Sichern Sie Ihre Anwendung mit HTTPS.Secure your application with HTTPS. Weitere Empfehlungen finden Sie unter Bewährte Methoden für die Verwendung von Content Delivery Networks (CDNs).Read the Best practices for using content delivery networks for additional recommendations.
  • Verwenden Sie einen schnellen und zuverlässigen CI/CD-Dienst wie z. B. Azure Pipelines, um jede Quelländerung sofort zu erstellen und bereitzustellen.Use a fast and reliable CI/CD service such as Azure Pipelines, to automatically build and deploy every source change. Die Quelle muss sich in einem Online-Versionskontrollsystem befinden.The source must reside in an online version control system. Weitere Informationen finden Sie unter Erstellen Ihrer ersten Pipeline.For more details, read Create your first pipeline.
  • Komprimieren Sie Websitedateien, um die Bandbreitennutzung im CDN zu reduzieren und die Leistung zu verbessern.Compress your website files to reduce the bandwidth consumption on the CDN and improve performance. Azure CDN ermöglicht eine Komprimierung im laufenden Betrieb auf den Edgeservern.Azure CDN allows compression on the fly on the edge servers. Alternativ dazu komprimiert die Bereitstellungspipeline in dieser Referenzarchitektur die Dateien, bevor diese im Blobspeicher bereitgestellt werden.Alternatively, the deploy pipeline in this reference architecture compresses the files before deploying them to the Blob storage. Dadurch sinken die Speicheranforderungen, und Sie erhalten mehr Flexibilität bei der Auswahl der Komprimierungstools – unabhängig von Einschränkungen durch das CDN.This reduces the storage requirement, and gives you more freedom to choose the compression tools, regardless of any CDN limitations.
  • Das CDN sollte in der Lage sein, den Cache zu bereinigen, um sicherzustellen, dass alle Benutzer die neuesten Inhalte erhalten.The CDN should be able to purge its cache to ensure all users are served the freshest content. Eine Bereinigung des Caches ist notwendig, wenn die Erstellungs- und Bereitstellungsprozesse nicht atomisch sind, also beispielsweise alte Dateien im gleichen Ursprungsordner durch neu erstellte Dateien ersetzen.A cache purge is required if the build and deploy processes are not atomic, for example, if they replace old files with newly built ones in the same origin folder.
  • Bei einer anderen Cachestrategie – z. B. der Versionsverwaltung mithilfe von Verzeichnissen – ist eine Bereinigung durch das CDN möglicherweise nicht erforderlich.A different cache strategy such as versioning using directories, may not require a purge by the CDN. Die Buildpipeline in dieser Front-End-Anwendung erstellt ein neues Verzeichnis für jede neu erstellte Version.The build pipeline in this front-end application creates a new directory for each newly built version. Diese Version wird als atomische Einheit in den Blobspeicher hochgeladen.This version is uploaded as an atomic unit to the Blob storage. Das Azure CDN zeigt erst nach einer abgeschlossenen Bereitstellung auf diese Version.The Azure CDN points to this new version only after a completed deployment.
  • Erhöhen Sie die TTL für den Cache, indem Sie Ressourcendateien über einen längeren Zeitraum – z. B. mehrere Monate – zwischenspeichern.Increase the cache TTL by caching resource files for a longer duration, spanning months. Um sicherzustellen, dass die zwischengespeicherten Dateien bei einer Änderung aktualisiert werden, versehen Sie die Dateinamen bei der erneuten Erstellung mit einem Fingerabdruck.To make sure the cached files are updated when they do change, fingerprint the filenames when they are rebuilt. Diese Front-End-Anwendung versieht alle Dateien mit einem Fingerabdruck, mit Ausnahme von Dateien für den öffentlichen Zugriff, z. B. index.html.This front-end application fingerprints all files except for public-facing files such as index.html. Da die Datei „index.html“ häufig aktualisiert wird, reflektiert sie die geänderten Dateinamen, die eine Aktualisierung des Caches verursachen.Since the index.html is updated frequently, it reflects the changed filenames causing a cache refresh. Weitere Informationen finden Sie unter Verwalten des Ablaufs von Webinhalten in Azure CDN.See the Manage expiration of web content in Azure CDN for more information.

Back-End-BereitstellungBack-end deployment

Für die Bereitstellung der Funktions-App wird die Verwendung von Paketdateien („Aus Paket ausführen“) empfohlen.To deploy the function app, we recommend using package files ("Run from package"). Bei diesem Ansatz laden Sie eine ZIP-Datei in einen Blob Storage-Container hoch, und die Functions-Runtime bindet die ZIP-Datei als schreibgeschütztes Dateisystem ein.Using this approach, you upload a zip file to a Blob Storage container and the Functions runtime mounts the zip file as a read-only file system. Dieser atomische Vorgang verringert die Wahrscheinlichkeit, dass die Anwendung aufgrund einer fehlerhaften Bereitstellung in einem inkonsistenten Zustand verbleibt.This is an atomic operation, which reduces the chance that a failed deployment will leave the application in an inconsistent state. Er kann darüber hinaus Kaltstartzeiten verbessern (insbesondere für Node.js-Apps), da alle Dateien auf einmal ausgetauscht werden.It can also improve cold start times, especially for Node.js apps, because all of the files are swapped at once.

API-VersionsverwaltungAPI versioning

Eine API ist ein Vertrag zwischen einem Dienst und Clients.An API is a contract between a service and clients. In dieser Architektur wird der API-Vertrag auf API Management-Ebene festgelegt.In this architecture, the API contract is defined at the API Management layer. API Management unterstützt zwei unterschiedliche Versionierungskonzepte, die sich aber gegenseitig ergänzen:API Management supports two distinct but complementary versioning concepts:

  • Versionen bieten API-Consumern die Möglichkeit, eine API-Version basierend auf ihren Anforderungen zu wählen, z.B. v1 oder v2.Versions allow API consumers to choose an API version based on their needs, such as v1 versus v2.

  • Revisionen ermöglichen API-Administratoren das Vornehmen geringfügiger Änderungen in einer API und das Bereitstellen dieser Änderungen zusammen mit einem Änderungsprotokoll, um API-Benutzer über die Änderungen zu informieren.Revisions allow API administrators to make non-breaking changes in an API and deploy those changes, along with a change log to inform API consumers about the changes.

Wenn Sie eine grundlegende Änderung in einer API vornehmen, veröffentlichen Sie eine neue Version in API Management.If you make a breaking change in an API, publish a new version in API Management. Stellen Sie die neue Version parallel zur Originalversion in einer separaten Funktions-App bereit.Deploy the new version side-by-side with the original version, in a separate Function App. So können Sie vorhandene Clients zur neuen API migrieren, ohne die Funktion von Clientanwendungen zu beeinträchtigen.This lets you migrate existing clients to the new API without breaking client applications. Letztendlich können Sie die frühere Version dann als veraltet deklarieren.Eventually, you can deprecate the previous version. API Management unterstützt mehrere Versionsverwaltungsschemas: URL-Pfad, HTTP-Header und Abfragezeichenfolge.API Management supports several versioning schemes: URL path, HTTP header, or query string. Weitere Informationen zur API-Versionsverwaltung im Allgemeinen finden Sie unter Versionsverwaltung einer RESTful-Web-API.For more information about API versioning in general, see Versioning a RESTful web API.

Stellen Sie für Updates, die keine grundlegenden API-Änderungen darstellen, die neue Version in einem Stagingslot in der derselben Funktions-App bereit.For updates that are not breaking API changes, deploy the new version to a staging slot in the same Function App. Überprüfen Sie, ob die Bereitstellung erfolgreich war, und ersetzen Sie dann die bereitgestellte Version durch die Produktionsversion.Verify the deployment succeeded and then swap the staged version with the production version. Veröffentlichen Sie eine Revision in API Management.Publish a revision in API Management.

Bereitstellen der LösungDeploy the solution

Informationen zum Bereitstellen der Referenzimplementierung für diese Architektur finden Sie in der GitHub-Infodatei.To deploy the reference implementation for this architecture, see the GitHub readme.

Nächste SchritteNext steps

Weitere Informationen zur Referenzimplementierung finden Sie unter Exemplarische Vorgehensweise mit Code: Serverlose Anwendung mit Azure Functions.To learn more about the reference implementation, read Code walkthrough: Serverless application with Azure Functions.

Verwandte Leitfäden:Related guidance: