This reference architecture shows a serverless web application. The application serves static content from Azure Blob Storage and implements an API using Azure Functions. The API reads data from Cosmos DB and returns the results to the web app.
The term serverless has two distinct but related meanings:
Backend as a service (BaaS). 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). In this model, a "function" is a piece of code deployed to the cloud and runs inside a hosting environment that completely abstracts the servers running the code.
Both definitions share the idea that developers and DevOps personnel don't need to deploy, configure, or manage servers. This reference architecture focuses on FaaS using Azure Functions, although serving web content from Azure Blob Storage could be an example of BaaS.
Some important characteristics of FaaS are:
1. Compute resources are allocated dynamically as needed by the platform.
2. Consumption-based pricing: You are charged only for the compute resources used to execute your code.
3. The compute resources scale on demand based on traffic without the developer needing to do any configuration.
Functions are executed when an external trigger occurs, such as an HTTP request or a message arriving on a queue. This makes an event-driven architecture style natural for serverless architectures. To coordinate work between components in the architecture, consider using message brokers or pub/sub-patterns. For help with choosing between messaging technologies in Azure
Components
The architecture consists of the following components:
Blob Storage. 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. All dynamic interaction happens through JavaScript code, which makes calls to the back-end APIs. There is no server-side code to render the web page. Static website hosting supports index documents and custom 404 error pages.
CDN. Use Azure Content Delivery Network (CDN) to cache content for lower latency and faster delivery of content, as well as providing an HTTPS endpoint.
Function Apps. Azure Functions is a serverless computing option. It uses an event-driven model, where a piece of code (a "function") is invoked by a trigger. In this architecture, the function is invoked when a client makes an HTTP request. The request is always routed through an API gateway, described below.
API Management. Azure API Management provides an API gateway that sits in front of the HTTP function. You can use API Management to publish and manage APIs used by client applications. Using a gateway helps to decouple the front-end application from the back-end APIs. 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 can also be used to implement cross-cutting concerns such as:
Enforcing usage quotas and rate limits
Validating OAuth tokens for authentication
Enabling cross-origin requests (CORS)
Caching responses
Monitoring and logging requests
If you don't need all of the functionality provided by API Management, another option is to use Functions Proxies. This feature of Azure Functions lets you define a single API surface for multiple function apps by creating routes to back-end functions. Function proxies can also perform limited transformations on the HTTP request and response. However, they don't provide the same rich policy-based capabilities of API Management.
Cosmos DB. Azure Cosmos DB is a multi-model database service. 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)
Users sign into the web application by using their Azure AD credentials. Azure AD returns an access token for the API, which the web application uses to authenticate API requests (see Authentication).
Azure Monitor. Azure Monitor collects performance metrics about the Azure services deployed in the solution. By visualizing these in a dashboard, you can get visibility into the health of the solution. It also collected application logs.
Azure Pipelines. Azure Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.
GitHub Actions. Workflow is an automated process (CI/CD) that you set up in your GitHub repository. You can build, test, package, release, or deploy any project on GitHub with a workflow.
Recommendations
Function App plans
Azure Functions supports two hosting models. With the consumption plan, compute power is automatically allocated when your code is running. With the App Service plan, a set of VMs are allocated for your code. The App Service plan defines the number of VMs and the VM size.
Note that the App Service plan is not strictly serverless, according to the definition given above. The programming model is the same, however — the same function code can run in both a consumption plan and an App Service plan.
Here are some factors to consider when choosing which type of plan to use:
Cold start
With the consumption plan, a function that hasn't been invoked recently will incur additional latency the next time it runs. This additional latency is due to allocating and preparing the runtime environment. It is usually on the order of seconds but depends on several factors, including the number of dependencies that need to be loaded. For more information, see Understanding Serverless Cold Start. Cold start is usually more of a concern for interactive workloads (HTTP triggers) than asynchronous message-driven workloads (queue or event hubs triggers) because users directly observe the additional latency.
Timeout period
In the consumption plan, a function execution times out after a configurable period of time (to a maximum of 10 minutes)
Virtual network isolation
Using an App Service plan allows functions to run inside an App Service Environment, a dedicated and isolated hosting environment.
Pricing model
The consumption plan is billed by the number of executions and resource consumption (memory × execution time). The App Service plan is billed hourly based on the VM instance SKU. Often, the consumption plan can be cheaper than an App Service plan because you pay only for the computing resources that you use. This is especially true if your traffic experiences peaks and troughs. However, if an application experiences constant high-volume throughput, an App Service plan may cost less than the consumption plan.
Scaling
A big advantage of the consumption model is that it scales dynamically as needed, based on the incoming traffic. While this scaling occurs quickly, there is still a ramp-up period. 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 that case, consider an App Service plan.
Function App boundaries
A function app hosts the execution of one or more functions. You can use a function app to group several functions together as a logical unit. Within a function app, the functions share the same application settings, hosting plan, and deployment lifecycle. Each function app has its own hostname.
Use function apps to group functions that share the same lifecycle and settings. Functions that don't share the same lifecycle should be hosted in different function apps.
Function bindings
Use Function bindings when possible. Bindings provides a declarative way to connect your code to data and integrate it with other Azure services. An input binding populates an input parameter from an external data source. An output binding sends the function's return value to a data sink, such as a queue or database.
Considerations
Scalability
Functions. For the consumption plan, the HTTP trigger scales based on the traffic. There is a limit to the number of concurrent function instances, but each instance can process more than one request at a time. 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.
Cosmos DB. The throughput capacity for Cosmos DB is measured in Request Units (RU). A 1-RU throughput corresponds to the throughput needed to GET a 1KB document. 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.
API Management. API Management can scale out and support rule-based autoscaling. The scaling process takes at least 20 minutes. If your traffic is bursty, you should provide the maximum burst traffic you expect. However, autoscaling is useful for handling hourly or daily variations in traffic.
Disaster recovery
The deployment shown here resides in a single Azure region. For a more resilient approach to disaster recovery, take advantage of the geo-distribution features in the various services:
API Management supports multi-region deployment, which can distribute a single API Management instance across any number of Azure regions.
Use Traffic Manager to route HTTP requests to the primary region. If the Function App running in that region becomes unavailable, the Traffic Manager can fail over to a secondary region.
Cosmos DB supports multiple write regions, which enables you to write to any region that you add to your Cosmos DB account. You can still fail over the primary write region if you don't enable multi-write. 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.
Enforce HTTPS
For maximum security, require HTTPS throughout the request pipeline:
CDN. Azure CDN supports HTTPS on the *.azureedge.net subdomain by default. To enable HTTPS in the CDN for custom domain names, see Tutorial: Configure HTTPS on an Azure CDN custom domain.
Static website hosting. Enable the "Secure transfer required" option on the Storage account. When this option is enabled, the storage account only allows requests from secure HTTPS connections.
API Management. Configure the APIs to use HTTPS protocol only. You can configure this in the Azure portal or through a Resource Manager template.
Azure Functions. Enable the "HTTPS Only" setting.
Cost optimization
Azure Functions
Azure Functions supports two hosting models.
Consumption plan.
Compute power is automatically allocated when your code is running.
App Service plan.
A set of VMs are allocated for your code. This plan defines the number of VMs and the VM size.
In this architecture, a function is invoked when a client makes an HTTP request. Because a constant high-volume throughput is not expected in this use case, a consumption plan is recommended because you pay only for the compute resources you use.
Azure Cosmos DB
Azure Cosmos DB bills for provisioned throughput and consumed storage by the hour. Provisioned throughput is expressed in Request Units per second (RU/s), which can be used for typical database operations, such as inserts and reads. The price is based on the capacity in RU/s that you reserve.
Storage is billed for each GB used for your stored data and index.
Content Delivery Network
The billing rate may differ depending on the billing region and the location of the source server delivering the content to the end user. The client's physical location is not in the billing region. Any HTTP or HTTPS request that hits the CDN is a billable event, which includes all response types: success, failure, or other. Different responses may generate different traffic amounts.
Comments