From 00ace19e6ff0db58fcd5eb74a483256d2baaafdf Mon Sep 17 00:00:00 2001 From: "Dris.S" <53239451+DrisDary@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:29:39 +0100 Subject: [PATCH] Rewrite the Front Door sample around a catalog API and test it in CI The sample deployed five endpoints across five scenarios and was the only sample CI never tested, which hid three things that stopped it working against the emulator: it printed the wrong development alias, passed the Function App's host:port straight to --host-name, and forced an HTTPS redirect the emulator does not serve. Two Function Apps now serve a small catalog API behind one endpoint with two routes, an origin group ordered by priority and a rule set that stamps a response header, rewrites /shop to /catalog and redirects a retired path at the edge. The scripts follow the convention of the other samples (deploy.sh, validate.sh, call-front-door.sh, cleanup.sh), and run-samples.sh now runs the validation: routing, route specificity, origin priority, the three rules, caching with purge, the headers the edge adds to the origin request, an origin error passing through, and the endpoint's enabled state. deploy.sh supports both spellings of `az afd rule create`: the flattened arguments of Azure CLI 2.83 and earlier, and the --conditions/--actions shorthand of the cdn extension used from 2.85 on. run-samples.sh also watches each sample's function/ folder, so a change to a sample's application code re-runs it in changed mode. --- README.md | 2 +- run-samples.sh | 7 +- .../function-app-front-door/python/README.md | 394 ++++++------- .../.python_packages/requirements.txt.md5 | 1 - .../python/function/function_app.py | 98 ++++ .../python/function/hello/__init__.py | 50 -- .../python/function/hello/function.json | 18 - .../python/function/host.json | 7 +- .../python/function/requirements.txt | 1 + .../python/images/basic.png | Bin 41649 -> 0 bytes .../python/images/disabled_state.png | Bin 45538 -> 0 bytes .../python/images/multi.png | Bin 77075 -> 0 bytes .../python/images/rules.png | Bin 48669 -> 0 bytes .../python/images/spec.png | Bin 51075 -> 0 bytes .../python/scripts/.last_deploy_all.env | 10 - .../python/scripts/README.md | 25 + .../python/scripts/call-front-door.sh | 79 +++ .../python/scripts/cleanup.sh | 28 + .../python/scripts/cleanup_all.sh | 56 -- .../python/scripts/deploy.sh | 518 ++++++++++++++++++ .../python/scripts/deploy_all.sh | 409 -------------- .../python/scripts/validate.sh | 355 ++++++++++++ 22 files changed, 1271 insertions(+), 787 deletions(-) delete mode 100644 samples/function-app-front-door/python/function/.python_packages/requirements.txt.md5 create mode 100644 samples/function-app-front-door/python/function/function_app.py delete mode 100644 samples/function-app-front-door/python/function/hello/__init__.py delete mode 100644 samples/function-app-front-door/python/function/hello/function.json delete mode 100644 samples/function-app-front-door/python/images/basic.png delete mode 100644 samples/function-app-front-door/python/images/disabled_state.png delete mode 100644 samples/function-app-front-door/python/images/multi.png delete mode 100644 samples/function-app-front-door/python/images/rules.png delete mode 100644 samples/function-app-front-door/python/images/spec.png delete mode 100644 samples/function-app-front-door/python/scripts/.last_deploy_all.env create mode 100644 samples/function-app-front-door/python/scripts/README.md create mode 100755 samples/function-app-front-door/python/scripts/call-front-door.sh create mode 100755 samples/function-app-front-door/python/scripts/cleanup.sh delete mode 100644 samples/function-app-front-door/python/scripts/cleanup_all.sh create mode 100755 samples/function-app-front-door/python/scripts/deploy.sh delete mode 100644 samples/function-app-front-door/python/scripts/deploy_all.sh create mode 100755 samples/function-app-front-door/python/scripts/validate.sh diff --git a/README.md b/README.md index 71db00d..dbc575b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Each sample is a self-contained project with its own README, Azure CLI scripts a | Sample | Description | |--------|-------------| | [Function App and Storage (.NET)](./samples/function-app-storage-http/dotnet/README.md) | A gaming scoreboard built on Azure Functions (isolated worker): HTTP triggers record player scores in Table Storage, publish messages to Queue Storage and write game-session summaries to Blob Storage, all against the emulated storage account. | -| [Function App and Front Door (Python)](./samples/function-app-front-door/python/README.md) | A minimal Python Function App answering `/{name}`, published behind an Azure Front Door (Standard) profile so requests reach the function through the Front Door endpoint; deployable to real Azure or to the emulator. | +| [Function App and Front Door (Python)](./samples/function-app-front-door/python/README.md) | Two Python Function Apps serving a small *Catalog* API, published through an Azure Front Door (Standard) endpoint: the edge picks an origin by priority, matches the more specific of two routes, caches what the origin allows, and runs a rule set that stamps a response header, rewrites `/shop` to `/catalog` and redirects a retired path without calling the origin at all. | | [Function App and Managed Identities (Python)](./samples/function-app-managed-identity/python/README.md) | A serverless text processor: an Azure Functions app reads text blobs from an `input` container, converts them to uppercase and writes the result to an `output` container, authenticating to the storage account with a managed identity instead of keys. | | [Function App and Service Bus (.NET)](./samples/function-app-service-bus/dotnet/README.md) | An Azure Functions app on an App Service plan that exchanges messages through Service Bus queues: an HTTP trigger sends greetings and a queue trigger consumes them, connecting with either a connection string or a managed identity. | | Web App and CosmosDB for MongoDB API ([Python](./samples/web-app-cosmosdb-mongodb-api/python/README.md), [.NET](./samples/web-app-cosmosdb-mongodb-api/dotnet/README.md)) | The *Vacation Planner* single-page web app on an Azure Web App with regional VNet integration, storing activities in the `activities` collection of an Azure Cosmos DB for MongoDB account reached through a private endpoint. | diff --git a/run-samples.sh b/run-samples.sh index 62c9f25..ee54b33 100755 --- a/run-samples.sh +++ b/run-samples.sh @@ -32,7 +32,7 @@ SAMPLES=( "samples/servicebus/java|bash scripts/deploy.sh" "samples/eventhubs/python|bash scripts/deploy.sh|bash scripts/validate.sh && bash scripts/run-pipeline.sh" "samples/eventhubs-eventgrid/python|bash scripts/deploy.sh|bash scripts/validate.sh && bash scripts/run-pipeline.sh" - "samples/function-app-front-door/python|bash scripts/deploy_all.sh --name-prefix testafd|" + "samples/function-app-front-door/python|bash scripts/deploy.sh|bash scripts/validate.sh && bash scripts/call-front-door.sh" "samples/function-app-managed-identity/python|bash scripts/user-managed-identity.sh|bash scripts/validate.sh && bash scripts/test.sh" "samples/function-app-service-bus/dotnet|bash scripts/deploy.sh|bash scripts/validate.sh && bash scripts/call-http-trigger.sh" "samples/function-app-storage-http/dotnet|bash scripts/deploy.sh|bash scripts/validate.sh && bash scripts/call-http-triggers.sh" @@ -201,7 +201,10 @@ if [[ "${1:-}" == "--list" ]]; then watch=("$path" "$(dirname "$path")/src" "$(dirname "$path")/scripts") name="${path#samples/}" else - watch=("$path/scripts" "$path/src") + # A sample's application code lives in src/ or, for the Function App samples, function/; + # a change there has to re-run the sample as surely as a change to its scripts. Folders that + # do not exist simply never match a changed file. + watch=("$path/scripts" "$path/src" "$path/function") name="${path#samples/}/scripts" fi diff --git a/samples/function-app-front-door/python/README.md b/samples/function-app-front-door/python/README.md index 982dfaf..d01ebf9 100644 --- a/samples/function-app-front-door/python/README.md +++ b/samples/function-app-front-door/python/README.md @@ -1,284 +1,206 @@ -# Azure Function App and Azure Front Door (Azure CLI) - -This sample creates a minimal Python Azure Function App that responds to `/{name}` and configures Azure Front Door (Standard SKU) to route traffic to it. It can target real Azure or LocalStack's Azure emulation via `lstk az` interception. - -## Overview - -- **`scripts/deploy_all.sh`**: One script that provisions all scenarios below in a single resource group: - 1. Basic single-origin routing - 2. Multiple origins with priority/weight selection - 3. Route specificity/precedence - 4. Rules Engine demo (three rules: response header, rewrite, redirect) - 5. Endpoint enabled/disabled state toggle -- **`scripts/cleanup_all.sh`**: Deletes the resource group created by `deploy_all.sh` - -## Architecture at a Glance (Diagrams) -The following diagrams visualize each scenario provisioned by `deploy_all.sh`. They help you see the wiring between AFD endpoints, routes, origin groups/origins, and the Function App(s). - -### Basic Single-Origin - -![Basic single-origin](./images/basic.png) - -**What to notice:** One Endpoint → one Route (`/*`) → one Origin Group → one Origin → Function App. - -### Multi-Origin (Priority/Weight) - -![Multi-origin (priority/weight)](./images/multi.png) - -**What to notice:** Two Origins in a single Origin Group with explicit `priority` and `weight`. A group-level health probe (HEAD `/`, 120s) gates origin eligibility; selection prefers the lowest priority and distributes by weight among equally prioritized healthy origins. - -### Route Specificity - -![Route specificity](./images/spec.png) - -**What to notice:** Two Routes on the same Endpoint and Origin Group: a catch-all (`/*`) and a specific (`/john`). The most specific matching route should be chosen by the data plane. - -### Rules Engine - -![Rules engine](./images/rules.png) - -**What to notice:** A Route with an attached Rule Set (three rules): -- **Rule 1**: ModifyResponseHeader on GET → `X-CDN: MSFT` -- **Rule 2**: UrlRewrite when path begins with `/api` → `/` -- **Rule 3**: UrlRedirect when path begins with `/old` → `/new` (302 Found) - -### Endpoint Enabled/Disabled State - -![Endpoint enabled/disabled state](./images/disabled_state.png) - -**What to notice:** The Endpoint's `enabled-state` can be toggled; when Disabled, requests should return a 4xx (e.g., 403). Re-enabling restores normal behavior. - -### Notes for LocalStack Runs +# Front Door and Function Apps: a catalog API published through an edge + +This sample demonstrates [Azure Front Door Standard](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview) in front of two [Azure Function Apps](https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview). The Function Apps serve a small *Catalog* API and are otherwise identical: each one reports its own name in every response, so which origin answered, which route matched and what path the origin was asked for can all be read straight off the body. + +Clients only ever call the Front Door endpoint. Between the client and the function, the edge picks an origin by priority, decides which of two routes applies, caches what the origin allows it to cache, and runs a [rule set](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-rules-engine) that stamps a response header, rewrites one path prefix into another and answers a retired path with a redirect without calling an origin at all. + +The sample exercises both halves of Front Door on the LocalStack Azure emulator: the control plane (profile, endpoint, origin groups, origins, routes, rule set, rules, purge) and the data plane (routing, origin selection, health probes, caching, the rules engine and the headers the edge adds). + +## Architecture + +The solution is composed of the following Azure resources: + +1. [Azure Resource Group](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli): A logical container scoping all resources in this sample. +2. [Azure Storage Accounts](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview) (two): The Function Apps' runtime storage (`AzureWebJobsStorage`), one each. +3. [Azure App Service Plan](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) (Linux, B1): Shared by both Function Apps. +4. [Azure Function Apps](https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview) (Python v2 model), **primary** and **secondary**: the *Catalog* origin, with four HTTP routes — `GET /api/catalog/{item}` (cacheable, `Cache-Control: public, max-age=300`), `GET /api/whoami` (what the origin received, `no-store`), `GET /api/status` and `GET|HEAD /api/health` (the health probe target). An `ORIGIN_NAME` app setting is the only difference between the two apps. +5. [Azure Front Door Standard](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview) profile: + - One **endpoint**, the address clients call. + - The **catalog origin group**, holding the primary origin at priority 1 and the secondary as a priority-2 standby, with a [health probe](https://learn.microsoft.com/en-us/azure/frontdoor/health-probes) that sends `HEAD /api/health` every 30 seconds. + - The **status origin group**, holding the secondary origin alone. + - The **catalog route** (`/*`), which sends traffic to the catalog origin group with [caching](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-caching) switched on and the rule set attached. + - The **status route** (`/status`), a more specific pattern pointing at the other origin group, with no caching and no rules. + - The **catalogrules** [rule set](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-rules-engine): `stampHeader` (adds `X-Served-By` to every response), `rewriteShop` (`/shop/*` → `/catalog/*` on the way to the origin) and `redirectLegacy` (`/legacy` → `302` to `/status`, answered at the edge). + +```mermaid +%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 70}}}%% +flowchart LR + client((Client)) + + subgraph afd["Front Door Standard profile"] + direction TB + routes["Routes
/* · /status"] + rules["Rule set catalogrules
stampHeader · rewriteShop · redirectLegacy"] + cache["Edge cache
on the /* route"] + routes --> rules --> cache + end + + subgraph origins["Origin groups"] + direction TB + primary["catalog-origin-group
primary (priority 1)
standby (priority 2)"] + secondary["status-origin-group
secondary"] + end + + subgraph apps["Function Apps (Python)"] + direction TB + app1["primary
/api/catalog/{item} · /api/whoami
/api/status · /api/health"] + app2["secondary
same code, ORIGIN_NAME=secondary"] + end + + client -->|"1: GET /catalog/1"| routes + cache -->|"2: on a miss, GET /api/catalog/1
+ X-Forwarded-Host · X-Azure-ClientIP · X-Azure-FDID"| primary + primary --> app1 + secondary --> app2 + cache -->|"3: 200 + X-Served-By + X-Cache"| client + client -. "GET /status: the more specific route" .-> secondary + + style afd fill:#ffffff,stroke:#999999,color:#333333 + style origins fill:#ffffff,stroke:#999999,color:#333333 + style apps fill:#ffffff,stroke:#999999,color:#333333 +``` -- The printed test URLs use `*.afd.localhost.localstack.cloud:4566` for AFD and `*.website.localhost.localstack.cloud:4566` for the Function App, so requests flow through the emulator's edge. +The life of a request: the client calls `GET /catalog/1` on the endpoint → the `/*` route matches, since no more specific pattern does → the rule set runs → the edge looks in its cache, and on a miss picks the healthy origin with the lowest priority number → the route's origin path puts `/api` back on the front of the path and the request goes to the primary Function App as `GET /api/catalog/1` → the response comes back, is stored because its `Cache-Control` allows it, gets `X-Served-By` from the rule set and `X-Cache`/`X-Azure-Ref` from Front Door, and reaches the client. The second identical request never leaves the edge. ## Prerequisites -- Bash (e.g., Git Bash, WSL, or Linux/macOS shell) -- Azure CLI installed and logged in (`az login`) for real Azure -- **Optional**: `lstk` (LocalStack CLI) in PATH to target the emulator via `lstk az` interception -- `zip` utility in PATH (used for zip deploy to Azure) - -## Quick Start - -1. **Start the LocalStack Azure emulator** - ```bash - # Start the LocalStack Azure emulator - IMAGE_NAME=localstack/localstack-azure localstack start -d - localstack wait -t 60 - - # Route all Azure CLI calls to the LocalStack Azure emulator - lstk az start-interception - ``` +- [Docker](https://docs.docker.com/get-docker/) +- [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) +- [lstk CLI](https://docs.localstack.cloud/aws/developer-tools/running-localstack/lstk/) +- [jq](https://jqlang.org/) and `zip` +- A LocalStack account with a valid `LOCALSTACK_AUTH_TOKEN` (see the [Auth Token guide](https://docs.localstack.cloud/getting-started/auth-token/)) -2. **Deploy against real Azure** (eastus by default): - ```bash - bash ./scripts/deploy_all.sh --name-prefix mydemo - ``` +## Setup -3. **Deploy against LocalStack emulator**: - ```bash - bash ./scripts/deploy_all.sh --name-prefix mydemo --use-localstack - ``` +Start LocalStack for Azure and point the Azure CLI at it: -The script prints: -- Resource group name -- AFD endpoint hostnames for each scenario and sample URLs (e.g., `https://.z01.azurefd.net/john`) +```bash +export LOCALSTACK_AUTH_TOKEN= +IMAGE_NAME=localstack/localstack-azure localstack start -d +lstk az start-interception +az login --service-principal -u any-app -p any-pass --tenant any-tenant +az account set --subscription 00000000-0000-0000-0000-000000000000 +``` -## Scenarios Deployed by deploy_all.sh +Every command below is the same against real Azure; sign in with `az login` instead. -### 1. Basic Single-Origin -- One Function App, one AFD endpoint with a catch-all route -- Test URL: printed as `[Basic]` in the output +## Deployment -### 2. Multiple Origins (Priority/Weight) -- Two Function Apps (A primary, B secondary by default), one origin group with priorities/weights -- Call repeatedly to observe distribution; the function response includes `"from "` to visualize selected origin +```bash +bash scripts/deploy.sh +``` -### 3. Route Specificity -- One endpoint with two routes pointing to the same origin group: catch-all (`/*`) and a specific (`/john`) route -- Compare responses for `/john` vs other paths +The script provisions the resource group, the App Service plan, the two storage accounts and the two Function Apps, deploys the same zip package to both, then creates the Front Door profile, endpoint, origin groups, origins, rule set, rules and routes. It finishes by printing the endpoint URL and a handful of `curl` commands to try. -### 4. Rules Engine Demo -Creates a Rule Set with three rules and attaches it to the route: -- **ModifyResponseHeader** on GET: sets header `X-CDN: MSFT` -- **UrlRewrite**: when UrlPath begins with `/api`, rewrites to `/` -- **UrlRedirect**: when UrlPath begins with `/old`, redirects (302 Found) to `/new` +It is safe to re-run: the Azure resources it creates are either checked for first or created with an idempotent `PUT`. -If the `az afd rule-set`/`az afd rule` commands are unavailable, the script skips rule creation gracefully. +## Testing -### 5. Endpoint Enabled/Disabled State -Provisions a dedicated endpoint you can toggle with: ```bash -az afd endpoint update -g --profile-name --endpoint-name --enabled-state Disabled -az afd endpoint update -g --profile-name --endpoint-name --enabled-state Enabled +bash scripts/validate.sh +bash scripts/call-front-door.sh ``` -## Unified Scripts Details +`validate.sh` walks the whole chain and exits non-zero on any failure: -### deploy_all.sh (What It Provisions/Tests) -- Creates one AFD Profile and up to five Endpoints (one per scenario): - - Basic: single origin, catch‑all route - - Multi: two origins in one origin group with priority/weight and a HEAD health probe - - Spec: two routes on one endpoint to demonstrate route specificity (`/*` vs `/john`) - - Rules: a rules engine Rule Set attached to the endpoint’s route (three rules listed above) - - State: an endpoint to toggle Enabled/Disabled -- Creates the necessary Function App(s): one main app for Basic/Spec/Rules/State, and two apps (A/B) for Multi. -- Publishes the function code with zip deploy (`az functionapp deployment source config-zip`) for both Azure and LocalStack. -- Prints convenient test URLs for each scenario -- Writes an environment file for cleanup at: `scripts/.last_deploy_all.env` +| # | Check | What it proves | +|---|-------|----------------| +| 1 | Both Function Apps answer `/api/health`, including on `HEAD` | The origins are up and answer the method the health probe uses | +| 2 | `GET /catalog/1` through the endpoint | The catch-all route, the priority-1 origin, and the route's origin path | +| 3 | `X-Served-By` and `X-Azure-Ref` on the response | The rule set ran; the edge stamped its reference id | +| 4 | `GET /status` | A more specific route wins, and sends the request to a different origin group | +| 5 | `GET /shop/2` | The `UrlRewrite` rule: the origin is asked for `/api/catalog/2` | +| 6 | `GET /legacy` | The `UrlRedirect` rule answers `302` at the edge, without calling an origin | +| 7 | `/catalog/3` twice, then a purge, then a `no-store` path | Caching, `X-Cache`, `Age`, purge, and the origin's power to refuse caching | +| 8 | `GET /whoami` | `X-Forwarded-Host`, `X-Azure-ClientIP` and `X-Azure-FDID` reach the origin | +| 9 | Ten requests to an uncached path | Priority is a strict tier: the standby answers none of them | +| 10 | `GET /catalog/99` | The origin's own `404` passes through the edge untouched | +| 11 | The endpoint disabled, then enabled again | `enabledState` takes the endpoint out of service and back | -### deploy_all.sh (How to Run) +`call-front-door.sh` is the short version: read a catalog item, read it again from the cache, follow the rewrite and the redirect, and print what the origin received. -**Azure (cloud):** -```bash -bash ./scripts/deploy_all.sh --name-prefix mydemo -``` +### Calling the endpoint by hand -**LocalStack (emulator):** ```bash -bash ./scripts/deploy_all.sh --name-prefix mydemo --use-localstack +ENDPOINT_URL=http://local-catalog-test.afd.azure.localhost.localstack.cloud:4566 + +# A cacheable response: the first request is a miss, the second a hit +curl -si $ENDPOINT_URL/catalog/1 | grep -iE "^(HTTP|x-cache|age|x-served-by)" ``` -**Useful flags:** -- `-p, --name-prefix`: base name used for resources (auto-sanitized to lowercase/digits) -- `-l, --location`: Azure region (default: `eastus`) -- `-g, --resource-group`: use a specific RG instead of an auto-generated one -- `--python-version`: Python runtime for Function Apps (default: `3.11`) -- **Scenario toggles** (all enabled by default): `--no-basic`, `--no-multi`, `--no-spec`, `--no-rules`, `--no-state` - -### deploy_all.sh (Outputs to Expect) - -- Resource group name, e.g., `rg--` -- Scenario endpoints (Azure or LocalStack hosts) and example URLs, e.g.: - ``` - [Rules] AFD Local Endpoint: https://ep--rules-.afd.localhost.localstack.cloud:4566/john - ``` -- For LocalStack runs, the function host and AFD local endpoint names will use `*.localhost.localstack.cloud:4566` -- The script also writes `scripts/.last_deploy_all.env` with variables like: - - `RESOURCE_GROUP`, `PROFILE_NAME`, `EP_BASIC`, `EP_MULTI`, `EP_SPEC`, `EP_RULES`, `EP_STATE`, `FUNC_MAIN`, `FUNC_A`, `FUNC_B` - - The Rules Engine rule set name follows the pattern `rs` (alphanumeric), which can be derived from `PROFILE_NAME`: - ```bash - BASE="${PROFILE_NAME#afd-}"; RULE_SET="rs${BASE//-/}" - ``` - -### cleanup_all.sh (What It Does) - -- Deletes the entire resource group created by `deploy_all.sh` using `az group delete --no-wait` -- Supports two ways to specify the resource group: - 1. `--env-file ./scripts/.last_deploy_all.env` (recommended after a fresh deploy) - 2. `-g/--resource-group ` -- Supports `--use-localstack` to intercept the `az` CLI for emulator cleanup - -### cleanup_all.sh (How to Run) - -**Using the env file created by the deploy:** -```bash -bash ./scripts/cleanup_all.sh --env-file ./scripts/.last_deploy_all.env +```text +HTTP/1.1 200 OK +x-served-by: front-door +x-cache: MISS ``` -**Passing RG explicitly:** ```bash -bash ./scripts/cleanup_all.sh --resource-group rg-- +# The rules engine rewrites the path before the origin sees it +curl -s $ENDPOINT_URL/shop/2 | jq '{origin, path, sku: .item.sku}' ``` -**LocalStack cleanup:** -Add `--use-localstack` to either command above. - -## Verifying the Rules Engine Scenario Quickly (LocalStack) - -Assume you ran with `--name-prefix mydemo` and got `ep-mydemo-rules-12345`: +```json +{ + "origin": "primary", + "path": "/api/catalog/2", + "sku": "AFD-002" +} +``` ```bash -HOST="https://ep-mydemo-rules-12345.afd.localhost.localstack.cloud:4566" - -# 1) ModifyResponseHeader on GET → expect X-CDN: MSFT -curl -i "$HOST/" | grep -i "^X-CDN:\s*MSFT" || echo "Header X-CDN not present" - -# 2) UrlRewrite for /api → / -curl -i "$HOST/api" | head -n 1 - -# 3) UrlRedirect for /old → /new -curl -i -L "$HOST/old" | head -n 5 +# What Front Door tells the origin about the caller and about itself +curl -s $ENDPOINT_URL/whoami | jq .front_door_headers ``` -## Deploy to Azure (Cloud) and Test - -1. **Sign in/select subscription:** - ```bash - az login - az account set --subscription "" - ``` - -2. **Run deployment** (avoid `--use-localstack`): - ```bash - cd samples/function-app-front-door/python - bash ./scripts/deploy_all.sh --name-prefix mydemo --location eastus - ``` - -3. **Note the printed outputs** (resource group and endpoints) and test as instructed. Allow 2–10 minutes for AFD readiness. - -## If You Closed the Terminal and Need Hostnames Later - -**Function host:** -```bash -az functionapp show -g -n --query defaultHostName -o tsv +```json +{ + "host": "local-catalog-primary-test.azurewebsites.azure.localhost.localstack.cloud:4566", + "via": "1.1 Azure", + "x-azure-clientip": "127.0.0.1", + "x-azure-fdid": "8c7dc56e48154939834f0469a7e5c1bf", + "x-azure-requestchain": "hops=1", + "x-azure-socketip": "127.0.0.1", + "x-forwarded-for": "127.0.0.1", + "x-forwarded-host": "local-catalog-test.afd.azure.localhost.localstack.cloud", + "x-forwarded-proto": "http" +} ``` -**AFD endpoint hostname:** ```bash -az afd endpoint show -g --profile-name --endpoint-name --query hostName -o tsv +# Empty the cache for a set of paths +az afd endpoint purge \ + --endpoint-name local-catalog-test \ + --profile-name local-catalog-afd-test \ + --resource-group local-rg \ + --content-paths '/catalog/*' ``` -**List resources by RG:** -- Function Apps: - ```bash - az functionapp list -g --query "[].{name:name,host:defaultHostName}" - ``` -- AFD profiles: - ```bash - az afd profile list -g --query "[].name" - ``` -- AFD endpoints: - ```bash - az afd endpoint list -g --profile-name --query "[].{name:name,host:hostName}" - ``` - -## Common Notes and Troubleshooting - -- **Windows users**: Use Git Bash or WSL to run bash scripts -- **Authentication**: The function trigger is Anonymous; no keys required -- **Function response**: Returns plain text and echoes `WEBSITE_HOSTNAME` to help testing multi-origins -- **Application Insights**: Disabled by default via `--disable-app-insights` -- **Deployment method**: zip deploy via the Azure CLI for both Azure and LocalStack -- **AFD readiness**: 2–10 minutes typical; check provisioning state: - ```bash - az afd endpoint show -g --profile-name --endpoint-name --query provisioningState -o tsv - ``` -- **Region/runtime**: Change with `--location`/`--python-version` in `deploy_all.sh` - ## Cleanup -Delete all resources by removing the resource group (non-blocking delete): - -**Using env file:** ```bash -bash ./scripts/cleanup_all.sh --env-file ./scripts/.last_deploy_all.env +bash scripts/cleanup.sh ``` -**Or directly:** -```bash -bash ./scripts/cleanup_all.sh --resource-group -``` +## LocalStack notes + +- **The endpoint's local address.** Front Door assigns the endpoint a `*.azurefd.net` host name, and the emulator reports one too, but that name only resolves once [LocalStack's DNS server](https://docs.localstack.cloud/aws/capabilities/networking/dns-server/) is in front of the machine. The scripts use the emulator's own alias instead, `http://.afd.azure.localhost.localstack.cloud:4566`, which resolves to `127.0.0.1` without any DNS setup. +- **Plain HTTP to the origins.** The emulator serves Function Apps over HTTP on port 4566, so the routes forward with `HttpOnly` and do not redirect HTTP to HTTPS. Against real Azure the same script uses `HttpsOnly` and `--https-redirect Enabled`, because `*.azurewebsites.net` is HTTPS-only. This is the only difference in what the script deploys. +- **The origin's host name and port.** An origin's `--host-name` is a bare host name, so the script splits the `host:4566` the emulator reports and passes the port as `--http-port`. The `--origin-host-header` keeps the port, because that is the name the emulator routes the Function App by. +- **Cache status values.** The emulator reports `X-Cache: HIT`, `MISS` and `UNCACHEABLE`; Azure reports `TCP_HIT`, `TCP_MISS` and friends. `validate.sh` looks for the word, not the whole value. + +## Two Azure details worth knowing -## Additional Notes +- **`UrlPath` conditions drop the leading slash.** A rule that should fire on `/shop/2` matches on `shop`, not `/shop`; `UrlRewrite`'s `--source-pattern`, on the other hand, keeps it (`/shop`). A rule with a leading slash in the match value is accepted, stored and silently never matches. +- **`az afd rule create` has two spellings.** Up to Azure CLI 2.83 the `afd` commands are part of the CLI and take one flattened condition and action per rule (`--match-variable`, `--action-name`, …). From 2.85 they live in the [`cdn` extension](https://github.com/Azure/azure-cli-extensions/tree/main/src/cdn), which takes `--conditions` and `--actions` in its own shorthand syntax, and spells the route's rule sets and caching differently too. `deploy.sh` detects which one is installed and uses it. -- Azure Front Door is a global resource; the script uses `Standard_AzureFrontDoor` SKU and links the route to the default domain of the endpoint -- The function removes the `/api` prefix so you can call `/john` directly -- The deployment uses zip deploy; because the function has no heavy dependencies, it should work without additional build steps. If you add dependencies that require native builds, consider using the Azure Functions Core Tools for publishing +## What this sample does not cover + +[Custom domains](https://learn.microsoft.com/en-us/azure/frontdoor/standard-premium/how-to-add-custom-domain) and their certificates, [WAF policies and security policies](https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/afds-overview), [private link origins](https://learn.microsoft.com/en-us/azure/frontdoor/private-link), and the older [classic Front Door](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview) and [classic CDN](https://learn.microsoft.com/en-us/azure/cdn/cdn-overview) profiles. The emulator implements all of them; see the [Front Door coverage page](https://docs.localstack.cloud/azure/services/front-door/) for what each one supports. ## References -- [LocalStack for Azure Documentation](https://docs.localstack.cloud/azure/) -- [lstk CLI](https://docs.localstack.cloud/aws/developer-tools/running-localstack/lstk/) -- [lstk GitHub repository](https://github.com/localstack/lstk) +- [Azure Front Door documentation](https://learn.microsoft.com/en-us/azure/frontdoor/) +- [Routing architecture](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-routing-architecture) and [route matching](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-routing-methods) +- [Rules engine actions](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-rules-engine-actions) and [match conditions](https://learn.microsoft.com/en-us/azure/frontdoor/rules-match-conditions) +- [Caching with Azure Front Door](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-caching) +- [How Front Door forwards requests to origins](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol) +- [LocalStack for Azure: Front Door](https://docs.localstack.cloud/azure/services/front-door/) diff --git a/samples/function-app-front-door/python/function/.python_packages/requirements.txt.md5 b/samples/function-app-front-door/python/function/.python_packages/requirements.txt.md5 deleted file mode 100644 index 4808fdf..0000000 --- a/samples/function-app-front-door/python/function/.python_packages/requirements.txt.md5 +++ /dev/null @@ -1 +0,0 @@ -1B2M2Y8AsgTpgAmY7PhCfg== \ No newline at end of file diff --git a/samples/function-app-front-door/python/function/function_app.py b/samples/function-app-front-door/python/function/function_app.py new file mode 100644 index 0000000..8e06f88 --- /dev/null +++ b/samples/function-app-front-door/python/function/function_app.py @@ -0,0 +1,98 @@ +"""The origin behind Azure Front Door: a small catalog API plus a health endpoint. + +Every response says which of the two Function Apps answered and what path the origin was asked +for, so the Front Door behaviours the sample demonstrates -- origin selection, route matching, URL +rewriting -- can be read straight off the body. The caching behaviour is the origin's to decide: +the catalog sets a ``Cache-Control`` Front Door can honour, everything else says ``no-store``. +""" + +import json +import os +from urllib.parse import urlparse + +import azure.functions as func + +app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) + +#: Which Function App this is, from an app setting the deployment script sets. The two apps are +#: identical apart from this value, which is what makes origin selection observable. +ORIGIN_NAME = os.environ.get("ORIGIN_NAME", "unknown") + +CATALOG = { + "1": {"sku": "AFD-001", "name": "Edge cache mug", "price": 12.5}, + "2": {"sku": "AFD-002", "name": "Origin group hoodie", "price": 48.0}, + "3": {"sku": "AFD-003", "name": "Rules engine notebook", "price": 7.25}, +} + +#: The headers Front Door adds on its way to the origin. Echoed by /whoami so a reader can see +#: what arrives at an origin that sits behind an edge. +FRONT_DOOR_HEADERS = ( + "host", + "via", + "x-azure-clientip", + "x-azure-socketip", + "x-azure-fdid", + "x-azure-requestchain", + "x-forwarded-for", + "x-forwarded-host", + "x-forwarded-proto", +) + + +def json_response(body: dict, status_code: int = 200, cache_control: str = "no-store"): + return func.HttpResponse( + json.dumps(body, indent=2), + status_code=status_code, + mimetype="application/json", + headers={"Cache-Control": cache_control}, + ) + + +def origin_path(req: func.HttpRequest) -> str: + """The path this Function App was asked for, which is not always the one the client sent.""" + return urlparse(req.url).path + + +@app.route(route="health", methods=["GET", "HEAD"]) +def health(req: func.HttpRequest) -> func.HttpResponse: + """Front Door's health probe target. + + The probe is a HEAD request, so this route has to accept HEAD as well as GET: an origin that + answers the probe with 405 is taken out of rotation and its route starts returning 503. + """ + return json_response({"status": "healthy", "origin": ORIGIN_NAME}) + + +@app.route(route="whoami", methods=["GET"]) +def whoami(req: func.HttpRequest) -> func.HttpResponse: + """What the origin received, including the headers Front Door added.""" + headers = { + name: value for name, value in req.headers.items() if name.lower() in FRONT_DOOR_HEADERS + } + return json_response( + { + "origin": ORIGIN_NAME, + "path": origin_path(req), + "method": req.method, + "front_door_headers": headers, + } + ) + + +@app.route(route="status", methods=["GET"]) +def status(req: func.HttpRequest) -> func.HttpResponse: + """The target of the sample's second, more specific route.""" + return json_response({"origin": ORIGIN_NAME, "path": origin_path(req), "status": "ok"}) + + +@app.route(route="catalog/{item}", methods=["GET"]) +def catalog(req: func.HttpRequest) -> func.HttpResponse: + """A cacheable response: Front Door stores it for as long as this ``Cache-Control`` allows.""" + wanted = req.route_params.get("item") + item = CATALOG.get(wanted) + if item is None: + return json_response({"error": f"No catalog item {wanted}"}, status_code=404) + return json_response( + {"origin": ORIGIN_NAME, "path": origin_path(req), "item": item}, + cache_control="public, max-age=300", + ) diff --git a/samples/function-app-front-door/python/function/hello/__init__.py b/samples/function-app-front-door/python/function/hello/__init__.py deleted file mode 100644 index 35ed81e..0000000 --- a/samples/function-app-front-door/python/function/hello/__init__.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Minimal HTTP-triggered function without azure.functions dependency. -Returns plain text so it works in both Azure and LocalStack without needing the -'azure-functions' package during local build/publish. - -Enhancements for demos: -- Echoes the WEBSITE_HOSTNAME so multi-origin routing can be observed easily. -- If header 'x-echo' is present in the request, it is echoed back in the body. -""" - -import os - - -def main(req): - # Try to read the {name} from route params first - name = None - try: - if hasattr(req, 'route_params') and req.route_params: - name = req.route_params.get('name') - except Exception: - name = None - - # Fallback to query string (?name=foo) - if not name: - try: - if hasattr(req, 'params') and req.params: - name = req.params.get('name') - except Exception: - name = None - - if not name: - name = 'world' - - # Detect which host/app served the request to distinguish origins - host = os.environ.get('WEBSITE_HOSTNAME') or 'unknown-host' - - # Optionally echo a header for debugging - echoed = None - try: - if hasattr(req, 'headers') and req.headers: - echoed = req.headers.get('x-echo') or req.headers.get('X-Echo') - except Exception: - echoed = None - - body = f"hello {name} from {host}" - if echoed: - body += f" (echoed-header={echoed})" - - # Returning a string lets the runtime create a 200 OK text/plain response. - return body diff --git a/samples/function-app-front-door/python/function/hello/function.json b/samples/function-app-front-door/python/function/hello/function.json deleted file mode 100644 index 093698e..0000000 --- a/samples/function-app-front-door/python/function/hello/function.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "scriptFile": "__init__.py", - "bindings": [ - { - "authLevel": "Anonymous", - "type": "httpTrigger", - "direction": "in", - "name": "req", - "methods": [ "get" ], - "route": "{name?}" - }, - { - "type": "http", - "direction": "out", - "name": "$return" - } - ] -} diff --git a/samples/function-app-front-door/python/function/host.json b/samples/function-app-front-door/python/function/host.json index ee90cba..b7e5ad1 100644 --- a/samples/function-app-front-door/python/function/host.json +++ b/samples/function-app-front-door/python/function/host.json @@ -1,8 +1,7 @@ { "version": "2.0", - "extensions": { - "http": { - "routePrefix": "" - } + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[4.*, 5.0.0)" } } diff --git a/samples/function-app-front-door/python/function/requirements.txt b/samples/function-app-front-door/python/function/requirements.txt index e69de29..75db2c4 100644 --- a/samples/function-app-front-door/python/function/requirements.txt +++ b/samples/function-app-front-door/python/function/requirements.txt @@ -0,0 +1 @@ +azure-functions diff --git a/samples/function-app-front-door/python/images/basic.png b/samples/function-app-front-door/python/images/basic.png deleted file mode 100644 index 3640d8b42bb85bac82261d236dc12ebb718b90f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41649 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 Z?uL}zoZy%F7zl@eriVak7hJIl`wt78EKUFb diff --git a/samples/function-app-front-door/python/images/disabled_state.png b/samples/function-app-front-door/python/images/disabled_state.png deleted file mode 100644 index af62d008873bb9a0eceb46b0e746a44afe38b40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45538 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

jewt>dMMX5U=sBfjtnkUyK<0-S4{GW?EZA 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 z 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 diff --git a/samples/function-app-front-door/python/images/spec.png b/samples/function-app-front-door/python/images/spec.png deleted file mode 100644 index 466d87339285079d9c0f9352d27e7eb62ceecc21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51075 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%0DP*4VV#Nq9eh5$>u9Doq$r;Db@Yq&N(eT-9I3J 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 diff --git a/samples/function-app-front-door/python/scripts/.last_deploy_all.env b/samples/function-app-front-door/python/scripts/.last_deploy_all.env deleted file mode 100644 index 69f3cff..0000000 --- a/samples/function-app-front-door/python/scripts/.last_deploy_all.env +++ /dev/null @@ -1,10 +0,0 @@ -RESOURCE_GROUP="rg-testafd-30236" -PROFILE_NAME="afd-testafd-30236" -EP_BASIC="ep-testafd-basic-30236" -EP_MULTI="ep-testafd-multi-30236" -EP_SPEC="ep-testafd-spec-30236" -EP_RULES="ep-testafd-rules-30236" -EP_STATE="ep-testafd-state-30236" -FUNC_MAIN="fa-testafd-30236" -FUNC_A="fa-testafda-30236" -FUNC_B="fa-testafdb-30236" diff --git a/samples/function-app-front-door/python/scripts/README.md b/samples/function-app-front-door/python/scripts/README.md new file mode 100644 index 0000000..4c4e3af --- /dev/null +++ b/samples/function-app-front-door/python/scripts/README.md @@ -0,0 +1,25 @@ +# Azure CLI Deployment + +This directory contains Bash scripts for deploying and validating the sample using the `lstk` CLI. For details about the sample application, see [Front Door and Function Apps](../README.md). + +## Prerequisites + +- [LocalStack for Azure](https://docs.localstack.cloud/azure/) +- [Docker](https://docs.docker.com/get-docker/) +- [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) +- [lstk CLI](https://docs.localstack.cloud/aws/developer-tools/running-localstack/lstk/) +- [jq](https://jqlang.org/) and `zip` + +## Scripts + +| Script | Purpose | +|--------|---------| +| `deploy.sh` | Idempotently provisions two Function Apps and their storage on a shared App Service plan, deploys the same zip package to both, then creates the Front Door profile, endpoint, two origin groups, three origins, the rule set with its three rules, and the two routes. Prints the endpoint URL and the commands to try it. | +| `validate.sh` | Walks the whole chain (origin health and the probe method, routing, route specificity, origin priority, the three rules, caching and purge, the headers the edge adds, an origin error, the endpoint's enabled state) and exits non-zero on any failure. | +| `call-front-door.sh` | Quick user-level smoke test: read a catalog item, read it again from the edge cache, follow the rewrite and the redirect, and print what the origin received. | +| `cleanup.sh` | Deletes the resource group and the local zip artifact. | + +## Notes + +- The scripts read `az account show --query environmentName` and adjust two things for the emulator: the routes forward to the origins over plain HTTP, and the endpoint is called through its `*.afd.azure.localhost.localstack.cloud:4566` alias rather than its `*.azurefd.net` host name. +- `deploy.sh` supports both spellings of `az afd rule create`: the flattened arguments of Azure CLI 2.83 and earlier, and the `--conditions`/`--actions` shorthand of the `cdn` extension used from 2.85 on. diff --git a/samples/function-app-front-door/python/scripts/call-front-door.sh b/samples/function-app-front-door/python/scripts/call-front-door.sh new file mode 100755 index 0000000..976b71d --- /dev/null +++ b/samples/function-app-front-door/python/scripts/call-front-door.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# Variables +PREFIX='local' +SUFFIX='test' +RESOURCE_GROUP_NAME="${PREFIX}-rg" +PROFILE_NAME="${PREFIX}-catalog-afd-${SUFFIX}" +ENDPOINT_NAME="${PREFIX}-catalog-${SUFFIX}" +BODY_FILE='/tmp/front_door_call.json' +HEADERS_FILE='/tmp/front_door_call_headers.txt' + +# Retrieve the Front Door profile +echo "Retrieving the [$PROFILE_NAME] Front Door profile..." +PROFILE_ID=$(az afd profile show --profile-name $PROFILE_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv) + +if [[ -n "$PROFILE_ID" ]]; then + echo "[$PROFILE_NAME] Front Door profile successfully retrieved" +else + echo "Failed to retrieve the [$PROFILE_NAME] Front Door profile" + exit 1 +fi + +# Where the endpoint answers: Azure's hostName, or the emulator's local alias (the emulator also +# claims the *.azurefd.net name, but it only resolves once LocalStack's DNS is in front of the machine) +ENVIRONMENT_NAME=$(az account show --query environmentName --output tsv) +if [[ "$ENVIRONMENT_NAME" == "LocalStack" ]]; then + ENDPOINT_URL="http://${ENDPOINT_NAME}.afd.azure.localhost.localstack.cloud:4566" +else + ENDPOINT_HOST_NAME=$(az afd endpoint show --endpoint-name $ENDPOINT_NAME --profile-name $PROFILE_NAME --resource-group $RESOURCE_GROUP_NAME --query hostName --output tsv) + ENDPOINT_URL="https://$ENDPOINT_HOST_NAME" +fi + +# Call the endpoint and report what the edge did with the request +call_endpoint() { + local PATH_TO_CALL="$1" + STATUS=$(curl -s -m 20 -o "$BODY_FILE" -D "$HEADERS_FILE" -w "%{http_code}" "$ENDPOINT_URL$PATH_TO_CALL") + CACHE=$(grep -i "^x-cache:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') + SERVED_BY=$(grep -i "^x-served-by:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') + LOCATION=$(grep -i "^location:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +} + +echo "Calling [$ENDPOINT_URL/catalog/1]..." +call_endpoint /catalog/1 + +if [[ "$STATUS" == "200" ]]; then + jq . "$BODY_FILE" + echo "Cache status: ${CACHE:-(none)}, stamped by the rule set: ${SERVED_BY:-(none)}" +else + echo "[$ENDPOINT_URL/catalog/1] returned [$STATUS]: $(cat "$BODY_FILE")" + exit 1 +fi + +echo "Calling it again, to be served from the edge cache..." +call_endpoint /catalog/1 +echo "Cache status: ${CACHE:-(none)}" + +echo "Calling [$ENDPOINT_URL/shop/3], which the rules engine rewrites to /catalog/3..." +call_endpoint /shop/3 + +if [[ "$STATUS" == "200" ]]; then + echo "The origin was asked for $(jq -r '.path' "$BODY_FILE") and answered with $(jq -r '.item.name' "$BODY_FILE")" +else + echo "[$ENDPOINT_URL/shop/3] returned [$STATUS]: $(cat "$BODY_FILE")" + exit 1 +fi + +echo "Calling [$ENDPOINT_URL/legacy], which the rules engine redirects..." +call_endpoint /legacy +echo "Answered [$STATUS] at the edge, pointing at ${LOCATION:-(no Location header)}" + +echo "Calling [$ENDPOINT_URL/whoami], which reports what the origin received..." +call_endpoint /whoami + +if [[ "$STATUS" == "200" ]]; then + jq . "$BODY_FILE" +else + echo "[$ENDPOINT_URL/whoami] returned [$STATUS]: $(cat "$BODY_FILE")" + exit 1 +fi diff --git a/samples/function-app-front-door/python/scripts/cleanup.sh b/samples/function-app-front-door/python/scripts/cleanup.sh new file mode 100755 index 0000000..ede7f93 --- /dev/null +++ b/samples/function-app-front-door/python/scripts/cleanup.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# ============================================================================= +# Removes everything scripts/deploy.sh created. +# +# Deleting the resource group is enough: the Front Door profile, its endpoint, +# origin groups, origins, routes and rule set, both Function Apps, their storage +# accounts and the shared App Service plan are all inside it. +# ============================================================================= + +PREFIX='local' +RESOURCE_GROUP_NAME="${PREFIX}-rg" +CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "Deleting resource group [$RESOURCE_GROUP_NAME] and everything in it..." +az group delete \ + --name "$RESOURCE_GROUP_NAME" \ + --yes \ + --only-show-errors 1>/dev/null + +if [[ $? -eq 0 ]]; then + echo "Resource group [$RESOURCE_GROUP_NAME] deleted." +else + echo "WARNING: could not delete resource group [$RESOURCE_GROUP_NAME] (it may not exist)." +fi + +rm -f "$CURRENT_DIR"/../function/*.zip +echo "Removed local deployment artifacts." diff --git a/samples/function-app-front-door/python/scripts/cleanup_all.sh b/samples/function-app-front-door/python/scripts/cleanup_all.sh deleted file mode 100644 index 8139d13..0000000 --- a/samples/function-app-front-door/python/scripts/cleanup_all.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Unified cleanup script for the consolidated Function App + Azure Front Door samples. -# -# This script deletes the resource group created by scripts/deploy_all.sh. It can read -# the resource group from an env file produced by the deploy script or accept it via flag. -# -# Usage examples: -# # Using the env file written by deploy_all.sh -# bash ./scripts/cleanup_all.sh --env-file ./scripts/.last_deploy_all.env -# -# # Passing the RG directly -# bash ./scripts/cleanup_all.sh --resource-group rg-funcafdall-12345 -# -# Requirements: az CLI - -RESOURCE_GROUP="" -ENV_FILE="" - -print_usage() { - cat <&2; print_usage; exit 1;; - esac -done - -if [[ -n "$ENV_FILE" ]]; then - if [[ ! -f "$ENV_FILE" ]]; then - echo "Env file not found: $ENV_FILE" >&2; exit 1 - fi - # shellcheck disable=SC1090 - source "$ENV_FILE" -fi - -if [[ -z "$RESOURCE_GROUP" ]]; then - echo "Resource group not specified. Provide -g/--resource-group or --env-file pointing to deploy env." >&2 - exit 1 -fi - -az group delete -n "$RESOURCE_GROUP" --yes --no-wait -echo "Delete requested for resource group '$RESOURCE_GROUP'." diff --git a/samples/function-app-front-door/python/scripts/deploy.sh b/samples/function-app-front-door/python/scripts/deploy.sh new file mode 100755 index 0000000..0d419c2 --- /dev/null +++ b/samples/function-app-front-door/python/scripts/deploy.sh @@ -0,0 +1,518 @@ +#!/bin/bash + +# Variables +PREFIX='local' +SUFFIX='test' +LOCATION='westeurope' +RESOURCE_GROUP_NAME="${PREFIX}-rg" +APP_SERVICE_PLAN_NAME="${PREFIX}-catalog-app-service-plan-${SUFFIX}" +APP_SERVICE_PLAN_SKU='B1' +RUNTIME='python' +RUNTIME_VERSION='3.11' +FUNCTIONS_VERSION='4' +# The two Function Apps are identical apart from their ORIGIN_NAME setting, which is what makes +# origin selection and route matching observable in the response body. +PRIMARY_FUNCTION_APP_NAME="${PREFIX}-catalog-primary-${SUFFIX}" +SECONDARY_FUNCTION_APP_NAME="${PREFIX}-catalog-secondary-${SUFFIX}" +# Storage account names are limited to 24 characters, lower case and digits only. +PRIMARY_STORAGE_ACCOUNT_NAME="${PREFIX}catalogpri${SUFFIX}" +SECONDARY_STORAGE_ACCOUNT_NAME="${PREFIX}catalogsec${SUFFIX}" +PROFILE_NAME="${PREFIX}-catalog-afd-${SUFFIX}" +PROFILE_SKU='Standard_AzureFrontDoor' +ENDPOINT_NAME="${PREFIX}-catalog-${SUFFIX}" +PRIMARY_ORIGIN_GROUP='catalog-origin-group' +STANDBY_ORIGIN_GROUP='status-origin-group' +PRIMARY_ORIGIN='primary' +STANDBY_ORIGIN='standby' +SECONDARY_ORIGIN='secondary' +CATCH_ALL_ROUTE='catalog-route' +STATUS_ROUTE='status-route' +RULE_SET_NAME='catalogrules' +# The Functions host serves every HTTP trigger under /api, and the route's origin path puts it +# back on the way to the origin, so clients never see it. +ORIGIN_PATH='/api' +PROBE_PATH='/api/health' +FUNCTION_ZIPFILE='catalog_function.zip' +CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)" + +# Get the current subscription +SUBSCRIPTION_NAME=$(az account show --query name --output tsv) + +# The emulator's Function Apps answer on plain HTTP under their own hostnames, while real Azure +# serves *.azurewebsites.net over HTTPS only, so the route reaches the origins over a different +# protocol in each environment. Everything else below is the same on both. +ENVIRONMENT_NAME=$(az account show --query environmentName --output tsv) +if [[ "$ENVIRONMENT_NAME" == "LocalStack" ]]; then + FORWARDING_PROTOCOL='HttpOnly' + HTTPS_REDIRECT='Disabled' +else + FORWARDING_PROTOCOL='HttpsOnly' + HTTPS_REDIRECT='Enabled' +fi + +# Check if the resource group already exists +echo "Checking if [$RESOURCE_GROUP_NAME] resource group actually exists in the [$SUBSCRIPTION_NAME] subscription..." +az group show --name $RESOURCE_GROUP_NAME &>/dev/null + +if [[ $? != 0 ]]; then + echo "No [$RESOURCE_GROUP_NAME] resource group actually exists in the [$SUBSCRIPTION_NAME] subscription" + echo "Creating [$RESOURCE_GROUP_NAME] resource group in the [$SUBSCRIPTION_NAME] subscription..." + + az group create --name $RESOURCE_GROUP_NAME --location "$LOCATION" 1>/dev/null + + if [[ $? == 0 ]]; then + echo "[$RESOURCE_GROUP_NAME] resource group successfully created in the [$SUBSCRIPTION_NAME] subscription" + else + echo "Failed to create [$RESOURCE_GROUP_NAME] resource group in the [$SUBSCRIPTION_NAME] subscription" + exit 1 + fi +else + echo "[$RESOURCE_GROUP_NAME] resource group already exists in the [$SUBSCRIPTION_NAME] subscription" +fi + +# Check if the app service plan already exists. Both Function Apps share it, as they would on Azure. +echo "Checking if [$APP_SERVICE_PLAN_NAME] app service plan actually exists in the [$RESOURCE_GROUP_NAME] resource group..." +az appservice plan show --name $APP_SERVICE_PLAN_NAME --resource-group $RESOURCE_GROUP_NAME &>/dev/null + +if [[ $? != 0 ]]; then + echo "No [$APP_SERVICE_PLAN_NAME] app service plan actually exists in the [$RESOURCE_GROUP_NAME] resource group" + echo "Creating [$APP_SERVICE_PLAN_NAME] app service plan in the [$RESOURCE_GROUP_NAME] resource group..." + + az appservice plan create \ + --name $APP_SERVICE_PLAN_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --location "$LOCATION" \ + --sku $APP_SERVICE_PLAN_SKU \ + --is-linux 1>/dev/null + + if [[ $? == 0 ]]; then + echo "[$APP_SERVICE_PLAN_NAME] app service plan successfully created in the [$RESOURCE_GROUP_NAME] resource group" + else + echo "Failed to create [$APP_SERVICE_PLAN_NAME] app service plan in the [$RESOURCE_GROUP_NAME] resource group" + exit 1 + fi +else + echo "[$APP_SERVICE_PLAN_NAME] app service plan already exists in the [$RESOURCE_GROUP_NAME] resource group" +fi + +# Create the zip package once; both Function Apps run the same code +cd "$CURRENT_DIR/../function" || exit +if [ -f "$FUNCTION_ZIPFILE" ]; then + rm "$FUNCTION_ZIPFILE" +fi +echo "Creating zip package of the function app..." +zip -r "$FUNCTION_ZIPFILE" function_app.py host.json requirements.txt + +# Create a storage account and a Function App, set the origin name it reports, and deploy the code +create_function_app() { + local FUNCTION_APP_NAME=$1 + local STORAGE_ACCOUNT_NAME=$2 + local ORIGIN_NAME=$3 + + echo "Checking if [$STORAGE_ACCOUNT_NAME] storage account actually exists in the [$RESOURCE_GROUP_NAME] resource group..." + az storage account show --name "$STORAGE_ACCOUNT_NAME" --resource-group $RESOURCE_GROUP_NAME &>/dev/null + + if [[ $? != 0 ]]; then + echo "Creating [$STORAGE_ACCOUNT_NAME] storage account in the [$RESOURCE_GROUP_NAME] resource group..." + + az storage account create \ + --name "$STORAGE_ACCOUNT_NAME" \ + --resource-group $RESOURCE_GROUP_NAME \ + --location "$LOCATION" \ + --sku Standard_LRS 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to create [$STORAGE_ACCOUNT_NAME] storage account in the [$RESOURCE_GROUP_NAME] resource group" + exit 1 + fi + echo "[$STORAGE_ACCOUNT_NAME] storage account successfully created in the [$RESOURCE_GROUP_NAME] resource group" + else + echo "[$STORAGE_ACCOUNT_NAME] storage account already exists in the [$RESOURCE_GROUP_NAME] resource group" + fi + + echo "Checking if [$FUNCTION_APP_NAME] function app actually exists in the [$RESOURCE_GROUP_NAME] resource group..." + az functionapp show --name "$FUNCTION_APP_NAME" --resource-group $RESOURCE_GROUP_NAME &>/dev/null + + if [[ $? != 0 ]]; then + echo "Creating [$FUNCTION_APP_NAME] function app in the [$RESOURCE_GROUP_NAME] resource group..." + + az functionapp create \ + --name "$FUNCTION_APP_NAME" \ + --resource-group $RESOURCE_GROUP_NAME \ + --plan $APP_SERVICE_PLAN_NAME \ + --storage-account "$STORAGE_ACCOUNT_NAME" \ + --runtime $RUNTIME \ + --runtime-version $RUNTIME_VERSION \ + --functions-version $FUNCTIONS_VERSION \ + --os-type Linux 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to create [$FUNCTION_APP_NAME] function app in the [$RESOURCE_GROUP_NAME] resource group" + exit 1 + fi + echo "[$FUNCTION_APP_NAME] function app successfully created in the [$RESOURCE_GROUP_NAME] resource group" + else + echo "[$FUNCTION_APP_NAME] function app already exists in the [$RESOURCE_GROUP_NAME] resource group" + fi + + echo "Setting app settings for the [$FUNCTION_APP_NAME] function app..." + az functionapp config appsettings set \ + --name "$FUNCTION_APP_NAME" \ + --resource-group $RESOURCE_GROUP_NAME \ + --settings \ + FUNCTIONS_WORKER_RUNTIME="$RUNTIME" \ + SCM_DO_BUILD_DURING_DEPLOYMENT='true' \ + ENABLE_ORYX_BUILD='true' \ + ORIGIN_NAME="$ORIGIN_NAME" 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to set app settings for the [$FUNCTION_APP_NAME] function app" + exit 1 + fi + + echo "Deploying function app [$FUNCTION_APP_NAME] with zip file [$FUNCTION_ZIPFILE]..." + az functionapp deploy \ + --resource-group $RESOURCE_GROUP_NAME \ + --name "$FUNCTION_APP_NAME" \ + --src-path "$FUNCTION_ZIPFILE" \ + --type zip \ + --async true 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to deploy function app [$FUNCTION_APP_NAME]" + exit 1 + fi + echo "Function app [$FUNCTION_APP_NAME] deployed successfully" +} + +create_function_app "$PRIMARY_FUNCTION_APP_NAME" "$PRIMARY_STORAGE_ACCOUNT_NAME" primary +create_function_app "$SECONDARY_FUNCTION_APP_NAME" "$SECONDARY_STORAGE_ACCOUNT_NAME" secondary +rm -f "$FUNCTION_ZIPFILE" + +# An origin's host name carries no port, so split the one the emulator reports. On Azure the +# default host name is a bare name and the ports below are the standard 80 and 443. +read_origin_address() { + local FUNCTION_APP_NAME=$1 + local DEFAULT_HOST_NAME + + DEFAULT_HOST_NAME=$(az functionapp show --name "$FUNCTION_APP_NAME" --resource-group $RESOURCE_GROUP_NAME --query defaultHostName --output tsv) + + if [[ -z "$DEFAULT_HOST_NAME" ]]; then + echo "Failed to read the default host name of the [$FUNCTION_APP_NAME] function app" >&2 + exit 1 + fi + + ORIGIN_HOST_NAME="${DEFAULT_HOST_NAME%%:*}" + if [[ "$DEFAULT_HOST_NAME" == *:* ]]; then + ORIGIN_HTTP_PORT="${DEFAULT_HOST_NAME##*:}" + ORIGIN_HTTPS_PORT="${DEFAULT_HOST_NAME##*:}" + else + ORIGIN_HTTP_PORT=80 + ORIGIN_HTTPS_PORT=443 + fi + # The origin host header is what the Function App is addressed by, port included: that is the + # name it is routed by, and the name it reports as WEBSITE_HOSTNAME. + ORIGIN_HOST_HEADER="$DEFAULT_HOST_NAME" +} + +read_origin_address "$PRIMARY_FUNCTION_APP_NAME" +PRIMARY_HOST_NAME=$ORIGIN_HOST_NAME +PRIMARY_HOST_HEADER=$ORIGIN_HOST_HEADER +PRIMARY_HTTP_PORT=$ORIGIN_HTTP_PORT +PRIMARY_HTTPS_PORT=$ORIGIN_HTTPS_PORT + +read_origin_address "$SECONDARY_FUNCTION_APP_NAME" +SECONDARY_HOST_NAME=$ORIGIN_HOST_NAME +SECONDARY_HOST_HEADER=$ORIGIN_HOST_HEADER +SECONDARY_HTTP_PORT=$ORIGIN_HTTP_PORT +SECONDARY_HTTPS_PORT=$ORIGIN_HTTPS_PORT + +echo "Primary origin: $PRIMARY_HOST_HEADER" +echo "Secondary origin: $SECONDARY_HOST_HEADER" + +# Check if the Front Door profile already exists +echo "Checking if [$PROFILE_NAME] Front Door profile actually exists in the [$RESOURCE_GROUP_NAME] resource group..." +az afd profile show --profile-name $PROFILE_NAME --resource-group $RESOURCE_GROUP_NAME &>/dev/null + +if [[ $? != 0 ]]; then + echo "Creating [$PROFILE_NAME] Front Door profile in the [$RESOURCE_GROUP_NAME] resource group..." + + az afd profile create \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --sku $PROFILE_SKU 1>/dev/null + + if [[ $? == 0 ]]; then + echo "[$PROFILE_NAME] Front Door profile successfully created in the [$RESOURCE_GROUP_NAME] resource group" + else + echo "Failed to create [$PROFILE_NAME] Front Door profile in the [$RESOURCE_GROUP_NAME] resource group" + exit 1 + fi +else + echo "[$PROFILE_NAME] Front Door profile already exists in the [$RESOURCE_GROUP_NAME] resource group" +fi + +# The endpoint is the address clients call; its host name is assigned by Azure +echo "Creating the [$ENDPOINT_NAME] endpoint..." +az afd endpoint create \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --enabled-state Enabled 1>/dev/null + +if [[ $? != 0 ]]; then + echo "Failed to create the [$ENDPOINT_NAME] endpoint" + exit 1 +fi + +# Origin groups carry the health probe and the load-balancing settings. The probe is a HEAD +# request to a path the Function App answers; an origin that fails it is taken out of rotation. +create_origin_group() { + local ORIGIN_GROUP_NAME=$1 + + echo "Creating the [$ORIGIN_GROUP_NAME] origin group..." + az afd origin-group create \ + --origin-group-name "$ORIGIN_GROUP_NAME" \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --probe-request-type HEAD \ + --probe-protocol Http \ + --probe-path $PROBE_PATH \ + --probe-interval-in-seconds 30 \ + --sample-size 4 \ + --successful-samples-required 3 \ + --additional-latency-in-milliseconds 50 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to create the [$ORIGIN_GROUP_NAME] origin group" + exit 1 + fi +} + +create_origin_group $PRIMARY_ORIGIN_GROUP +create_origin_group $STANDBY_ORIGIN_GROUP + +# Priority is a strict tier, not a preference: while a priority-1 origin is healthy, the +# priority-2 origin receives nothing at all. +create_origin() { + local ORIGIN_GROUP_NAME=$1 + local ORIGIN_NAME=$2 + local HOST_NAME=$3 + local HOST_HEADER=$4 + local HTTP_PORT=$5 + local HTTPS_PORT=$6 + local PRIORITY=$7 + + echo "Creating the [$ORIGIN_NAME] origin in the [$ORIGIN_GROUP_NAME] origin group..." + az afd origin create \ + --origin-name "$ORIGIN_NAME" \ + --origin-group-name "$ORIGIN_GROUP_NAME" \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --host-name "$HOST_NAME" \ + --origin-host-header "$HOST_HEADER" \ + --http-port "$HTTP_PORT" \ + --https-port "$HTTPS_PORT" \ + --priority "$PRIORITY" \ + --weight 1000 \ + --enabled-state Enabled 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to create the [$ORIGIN_NAME] origin" + exit 1 + fi +} + +create_origin $PRIMARY_ORIGIN_GROUP $PRIMARY_ORIGIN "$PRIMARY_HOST_NAME" "$PRIMARY_HOST_HEADER" "$PRIMARY_HTTP_PORT" "$PRIMARY_HTTPS_PORT" 1 +create_origin $PRIMARY_ORIGIN_GROUP $STANDBY_ORIGIN "$SECONDARY_HOST_NAME" "$SECONDARY_HOST_HEADER" "$SECONDARY_HTTP_PORT" "$SECONDARY_HTTPS_PORT" 2 +create_origin $STANDBY_ORIGIN_GROUP $SECONDARY_ORIGIN "$SECONDARY_HOST_NAME" "$SECONDARY_HOST_HEADER" "$SECONDARY_HTTP_PORT" "$SECONDARY_HTTPS_PORT" 1 + +# The rule set: three rules, each one action, applied to the catch-all route. +echo "Creating the [$RULE_SET_NAME] rule set..." +az afd rule-set create \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME 1>/dev/null + +if [[ $? != 0 ]]; then + echo "Failed to create the [$RULE_SET_NAME] rule set" + exit 1 +fi + +# `az afd rule create` comes in two spellings. Up to Azure CLI 2.83 the command is part of the CLI +# itself and takes one flattened condition and action; from 2.85 it lives in the `cdn` extension, +# which takes --conditions and --actions in its own shorthand syntax instead. The sample supports +# both, because which one is installed is not the sample's to decide. +if az afd rule create --help 2>/dev/null | grep -q -- '--actions'; then + AFD_RULE_SYNTAX='extension' +else + AFD_RULE_SYNTAX='cli' +fi +echo "Creating the rules ($AFD_RULE_SYNTAX syntax)..." + +# Rule 1: stamp every response that came through Front Door. The condition matches the request +# method, so it applies to all of the sample's traffic. +if [[ "$AFD_RULE_SYNTAX" == 'extension' ]]; then + az afd rule create \ + --rule-name stampHeader \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 1 \ + --match-processing-behavior Continue \ + --conditions "[{request-method:{parameters:{operator:Equal,match-values:[GET],negate-condition:false}}}]" \ + --actions "[{modify-response-header:{parameters:{header-action:Overwrite,header-name:X-Served-By,value:front-door}}}]" 1>/dev/null +else + az afd rule create \ + --rule-name stampHeader \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 1 \ + --match-processing-behavior Continue \ + --match-variable RequestMethod --operator Equal --match-values GET \ + --action-name ModifyResponseHeader --header-action Overwrite --header-name X-Served-By --header-value front-door 1>/dev/null +fi + +if [[ $? != 0 ]]; then + echo "Failed to create the [stampHeader] rule" + exit 1 +fi + +# Rule 2: publish the catalog under a friendlier path. Note the match value: the UrlPath condition +# sees the path *without* its leading slash, while UrlRewrite's source pattern keeps it. +if [[ "$AFD_RULE_SYNTAX" == 'extension' ]]; then + az afd rule create \ + --rule-name rewriteShop \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 2 \ + --match-processing-behavior Continue \ + --conditions "[{url-path:{parameters:{operator:BeginsWith,match-values:[shop],negate-condition:false}}}]" \ + --actions "[{url-rewrite:{parameters:{source-pattern:/shop,destination:/catalog,preserve-unmatched-path:true}}}]" 1>/dev/null +else + az afd rule create \ + --rule-name rewriteShop \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 2 \ + --match-processing-behavior Continue \ + --match-variable UrlPath --operator BeginsWith --match-values shop \ + --action-name UrlRewrite --source-pattern /shop --destination /catalog --preserve-unmatched-path true 1>/dev/null +fi + +if [[ $? != 0 ]]; then + echo "Failed to create the [rewriteShop] rule" + exit 1 +fi + +# Rule 3: retire an old path at the edge. A redirect is terminal, so the origin is never called. +if [[ "$AFD_RULE_SYNTAX" == 'extension' ]]; then + az afd rule create \ + --rule-name redirectLegacy \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 3 \ + --conditions "[{url-path:{parameters:{operator:BeginsWith,match-values:[legacy],negate-condition:false}}}]" \ + --actions "[{url-redirect:{parameters:{redirect-type:Found,destination-protocol:MatchRequest,custom-path:/status}}}]" 1>/dev/null +else + az afd rule create \ + --rule-name redirectLegacy \ + --rule-set-name $RULE_SET_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --order 3 \ + --match-variable UrlPath --operator BeginsWith --match-values legacy \ + --action-name UrlRedirect --redirect-type Found --redirect-protocol MatchRequest --custom-path /status 1>/dev/null +fi + +if [[ $? != 0 ]]; then + echo "Failed to create the [redirectLegacy] rule" + exit 1 +fi + +# The two routes. Caching and rule sets are spelled differently by the two CLI generations too: +# --enable-caching / --rule-sets in the CLI, --cache-configuration / --formatted-rule-sets in the +# extension, which takes resource IDs rather than names. +RULE_SET_ID=$(az afd rule-set show --rule-set-name $RULE_SET_NAME --profile-name $PROFILE_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv) + +echo "Creating the [$CATCH_ALL_ROUTE] route..." +if [[ "$AFD_RULE_SYNTAX" == 'extension' ]]; then + az afd route create \ + --route-name $CATCH_ALL_ROUTE \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --origin-group $PRIMARY_ORIGIN_GROUP \ + --origin-path $ORIGIN_PATH \ + --patterns-to-match '/*' \ + --supported-protocols Http Https \ + --link-to-default-domain Enabled \ + --https-redirect $HTTPS_REDIRECT \ + --forwarding-protocol $FORWARDING_PROTOCOL \ + --formatted-rule-sets "[{id:'$RULE_SET_ID'}]" \ + --cache-configuration "{query-string-caching-behavior:IgnoreQueryString}" 1>/dev/null +else + az afd route create \ + --route-name $CATCH_ALL_ROUTE \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --origin-group $PRIMARY_ORIGIN_GROUP \ + --origin-path $ORIGIN_PATH \ + --patterns-to-match '/*' \ + --supported-protocols Http Https \ + --link-to-default-domain Enabled \ + --https-redirect $HTTPS_REDIRECT \ + --forwarding-protocol $FORWARDING_PROTOCOL \ + --rule-sets $RULE_SET_NAME \ + --enable-caching true \ + --query-string-caching-behavior IgnoreQueryString 1>/dev/null +fi + +if [[ $? != 0 ]]; then + echo "Failed to create the [$CATCH_ALL_ROUTE] route" + exit 1 +fi + +# A more specific pattern wins over the catch-all, whatever order the routes were created in. +# This one has no rule set and no caching, which is how the two routes tell themselves apart. +echo "Creating the [$STATUS_ROUTE] route..." +az afd route create \ + --route-name $STATUS_ROUTE \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --origin-group $STANDBY_ORIGIN_GROUP \ + --origin-path $ORIGIN_PATH \ + --patterns-to-match '/status' \ + --supported-protocols Http Https \ + --link-to-default-domain Enabled \ + --https-redirect $HTTPS_REDIRECT \ + --forwarding-protocol $FORWARDING_PROTOCOL 1>/dev/null + +if [[ $? != 0 ]]; then + echo "Failed to create the [$STATUS_ROUTE] route" + exit 1 +fi + +# Where the endpoint answers. The emulator also reports Azure's *.azurefd.net address in hostName, +# but that name only resolves once LocalStack's DNS is in front of the machine, so the local alias +# is printed instead. +if [[ "$ENVIRONMENT_NAME" == "LocalStack" ]]; then + ENDPOINT_URL="http://${ENDPOINT_NAME}.afd.azure.localhost.localstack.cloud:4566" +else + ENDPOINT_HOST_NAME=$(az afd endpoint show --endpoint-name $ENDPOINT_NAME --profile-name $PROFILE_NAME --resource-group $RESOURCE_GROUP_NAME --query hostName --output tsv) + ENDPOINT_URL="https://$ENDPOINT_HOST_NAME" +fi + +echo "Deployment completed. The catalog is published at: $ENDPOINT_URL" +echo "Try it with:" +echo " curl -i $ENDPOINT_URL/catalog/1 # cacheable, served by the primary origin" +echo " curl -i $ENDPOINT_URL/shop/1 # rewritten to /catalog/1 by the rules engine" +echo " curl -i $ENDPOINT_URL/legacy # redirected to /status by the rules engine" +echo " curl -i $ENDPOINT_URL/status # the more specific route, served by the secondary origin" +echo " curl -s $ENDPOINT_URL/whoami | jq # what the origin received" diff --git a/samples/function-app-front-door/python/scripts/deploy_all.sh b/samples/function-app-front-door/python/scripts/deploy_all.sh deleted file mode 100644 index b276402..0000000 --- a/samples/function-app-front-door/python/scripts/deploy_all.sh +++ /dev/null @@ -1,409 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Unified deployment script for the Function App + Azure Front Door samples. -# -# This script provisions everything needed to exercise the following Azure Front Door data plane behaviors: -# 1) Basic single-origin routing (ep-basic) -# 2) Multiple origins with priority/weight selection (ep-multi) -# 3) Route specificity/precedence (ep-spec) -# 4) Rules Engine demo via Rule Set + Rule (ep-rules) -# 5) Endpoint enabled/disabled state toggle (ep-state) -# -# By default, all scenarios are deployed. You can selectively skip scenarios via flags. -# -# Requirements -# - az CLI -# - bash, zip -# - Optional: Azure Functions Core Tools (‘func’) -# -# Examples -# # Real Azure (eastus by default) -# bash ./scripts/deploy_all.sh --name-prefix demo -# - -# ------------------------------- -# Defaults (overridable via flags) -# ------------------------------- -NAME_PREFIX="funcafdall" -LOCATION="eastus" -RESOURCE_GROUP="" -PYTHON_VERSION="3.11" - -# Scenario toggles -DO_BASIC="true" -DO_MULTI="true" -DO_SPEC="true" -DO_RULES="true" -DO_STATE="true" - -print_usage() { - cat <&2; print_usage; exit 1;; - esac -done - -# ------------------------------- -# Paths and assets -# ------------------------------- -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -FUNCTION_SRC="$ROOT_DIR/function" -ZIP_MAIN="$ROOT_DIR/app_main.zip" -ZIP_A="$ROOT_DIR/app_A.zip" -ZIP_B="$ROOT_DIR/app_B.zip" -ENV_OUT="$SCRIPT_DIR/.last_deploy_all.env" - -# ------------------------------- -# Name generation -# ------------------------------- -prefix=$(echo "$NAME_PREFIX" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9') -[[ -z "$prefix" ]] && prefix="demo" -suffix=$(printf "%05d" $(( (RANDOM % 100000) ))) - -[[ -z "$RESOURCE_GROUP" ]] && RESOURCE_GROUP="rg-$prefix-$suffix" - -# Storage + Function Apps -storageMain="st${prefix}${suffix}"; storageMain="${storageMain:0:24}" -funcMain="fa-$prefix-$suffix" - -storageA="st${prefix}a${suffix}"; storageA="${storageA:0:24}" -storageB="st${prefix}b${suffix}"; storageB="${storageB:0:24}" -funcA="fa-${prefix}a-$suffix" -funcB="fa-${prefix}b-$suffix" - -# AFD profile and endpoints (one profile, multiple endpoints) -profileName="afd-$prefix-$suffix" -epBasic="ep-${prefix}-basic-$suffix" -epMulti="ep-${prefix}-multi-$suffix" -epSpec="ep-${prefix}-spec-$suffix" -epRules="ep-${prefix}-rules-$suffix" -epState="ep-${prefix}-state-$suffix" - -# Origin groups and origins -ogBasic="og-${prefix}-basic" -ogSpec="og-${prefix}-spec" -ogRules="og-${prefix}-rules" -ogMulti="og-${prefix}-multi" - -orMainBasic="or-${prefix}-main-basic" -orMainSpec="or-${prefix}-main-spec" -orMainRules="or-${prefix}-main-rules" -orA="or-${prefix}-a" -orB="or-${prefix}-b" - -# Routes (one per endpoint unless scenario needs multiple) -rtBasic="rt-${prefix}-basic" -rtMultiCatchAll="rt-${prefix}-multi-all" -rtSpecAll="rt-${prefix}-spec-all" -rtSpecJohn="rt-${prefix}-spec-john" -rtRules="rt-${prefix}-rules" -rtState="rt-${prefix}-state" - -# Rule Set and Rule names for AFD Rules Engine -# Constraints: must start with a letter and contain only letters and digits (no hyphens/underscores). -# We derive alphanumeric names from the sanitized prefix+suffix used elsewhere. -ruleSetName="rs${prefix}${suffix}" -ruleName="ruleAddHeader" - -# ------------------------------- -# Cleanup on exit -# ------------------------------- -finish() { - set +e - [[ -f "$ZIP_MAIN" ]] && rm -f "$ZIP_MAIN" - [[ -f "$ZIP_A" ]] && rm -f "$ZIP_A" - [[ -f "$ZIP_B" ]] && rm -f "$ZIP_B" - set -e -} -trap finish EXIT - -echo "Resource Group: $RESOURCE_GROUP" - -# ------------------------------- -# Resource Group -# ------------------------------- -az group create -n "$RESOURCE_GROUP" -l "$LOCATION" -o none - -# ------------------------------- -# Function App(s): create + configure -# ------------------------------- -create_function_app() { - local funcName="$1"; local storageName="$2" - az storage account create -g "$RESOURCE_GROUP" -n "$storageName" -l "$LOCATION" --sku Standard_LRS --kind StorageV2 -o none - az functionapp create -g "$RESOURCE_GROUP" -n "$funcName" \ - --consumption-plan-location "$LOCATION" \ - --runtime python --runtime-version "$PYTHON_VERSION" \ - --functions-version 4 --os-type Linux \ - --storage-account "$storageName" --disable-app-insights -o none - az functionapp config appsettings set -g "$RESOURCE_GROUP" -n "$funcName" \ - --settings WEBSITE_RUN_FROM_PACKAGE=1 FUNCTIONS_WORKER_RUNTIME=python SCM_DO_BUILD_DURING_DEPLOYMENT=false -o none -} - -publish_function_code() { - local funcName="$1"; local zipPath="$2" - rm -f "$zipPath"; ( cd "$FUNCTION_SRC" && zip -rq "$zipPath" . ) - az functionapp deployment source config-zip -g "$RESOURCE_GROUP" -n "$funcName" --src "$zipPath" -} - -if [[ "$DO_BASIC" == "true" || "$DO_SPEC" == "true" || "$DO_RULES" == "true" || "$DO_STATE" == "true" ]]; then - create_function_app "$funcMain" "$storageMain" - publish_function_code "$funcMain" "$ZIP_MAIN" -fi - -if [[ "$DO_MULTI" == "true" ]]; then - create_function_app "$funcA" "$storageA" - create_function_app "$funcB" "$storageB" - publish_function_code "$funcA" "$ZIP_A" - publish_function_code "$funcB" "$ZIP_B" -fi - -# Resolve hostnames -funcMainHost=""; funcAHost=""; funcBHost="" -if [[ "$DO_BASIC" == "true" || "$DO_SPEC" == "true" || "$DO_RULES" == "true" || "$DO_STATE" == "true" ]]; then - funcMainHost=$(az functionapp show -g "$RESOURCE_GROUP" -n "$funcMain" --query defaultHostName -o tsv) -fi -if [[ "$DO_MULTI" == "true" ]]; then - funcAHost=$(az functionapp show -g "$RESOURCE_GROUP" -n "$funcA" --query defaultHostName -o tsv) - funcBHost=$(az functionapp show -g "$RESOURCE_GROUP" -n "$funcB" --query defaultHostName -o tsv) -fi - -# ------------------------------- -# Azure Front Door: profile -# ------------------------------- -az afd profile create -g "$RESOURCE_GROUP" --profile-name "$profileName" --sku Standard_AzureFrontDoor -o none - -# Helper to create endpoint, origin group, origin, and route -create_endpoint_single_origin() { - local endpointName="$1"; local originGroupName="$2"; local originName="$3"; local routeName="$4"; local funcHost="$5"; local patterns="$6" - az afd endpoint create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$endpointName" --enabled-state Enabled -o none - az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$originGroupName" \ - --probe-request-type GET --probe-protocol Http --probe-interval-in-seconds 120 --probe-path / --sample-size 4 --successful-samples-required 3 --additional-latency-in-milliseconds 0 -o none - az afd origin create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$originGroupName" --origin-name "$originName" \ - --host-name "$funcHost" --origin-host-header "$funcHost" --http-port 80 --https-port 443 -o none - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$endpointName" --route-name "$routeName" \ - --origin-group "$originGroupName" --patterns-to-match "$patterns" --https-redirect Enabled --supported-protocols Http Https --link-to-default-domain Enabled --forwarding-protocol MatchRequest -o none -} - -create_endpoint_multi_origin() { - local endpointName="$1"; local originGroupName="$2"; local originAName="$3"; local originBName="$4"; local routeName="$5"; - local hostA="$6"; local hostB="$7"; local prioA="$8"; local prioB="$9"; local weightA="${10}"; local weightB="${11}" - az afd endpoint create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$endpointName" --enabled-state Enabled -o none - az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$originGroupName" \ - --probe-request-type HEAD --probe-protocol Http --probe-interval-in-seconds 120 --probe-path / --sample-size 4 --successful-samples-required 3 --additional-latency-in-milliseconds 0 -o none - az afd origin create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$originGroupName" --origin-name "$originAName" \ - --host-name "$hostA" --origin-host-header "$hostA" --http-port 80 --https-port 443 --priority "$prioA" --weight "$weightA" -o none - az afd origin create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$originGroupName" --origin-name "$originBName" \ - --host-name "$hostB" --origin-host-header "$hostB" --http-port 80 --https-port 443 --priority "$prioB" --weight "$weightB" -o none - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$endpointName" --route-name "$routeName" \ - --origin-group "$originGroupName" --patterns-to-match '/*' --https-redirect Enabled --supported-protocols Http Https --link-to-default-domain Enabled --forwarding-protocol MatchRequest -o none -} - -# Basic single-origin -if [[ "$DO_BASIC" == "true" ]]; then - create_endpoint_single_origin "$epBasic" "$ogBasic" "$orMainBasic" "$rtBasic" "$funcMainHost" '/*' -fi - -# Multi origins -if [[ "$DO_MULTI" == "true" ]]; then - create_endpoint_multi_origin "$epMulti" "$ogMulti" "$orA" "$orB" "$rtMultiCatchAll" "$funcAHost" "$funcBHost" 1 2 75 25 -fi - -# Route specificity: create two routes on the same endpoint -if [[ "$DO_SPEC" == "true" ]]; then - az afd endpoint create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epSpec" --enabled-state Enabled -o none - az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$ogSpec" \ - --probe-request-type GET --probe-protocol Http --probe-interval-in-seconds 120 --probe-path / --sample-size 4 --successful-samples-required 3 --additional-latency-in-milliseconds 0 -o none - az afd origin create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$ogSpec" --origin-name "$orMainSpec" \ - --host-name "$funcMainHost" --origin-host-header "$funcMainHost" --http-port 80 --https-port 443 -o none - # Catch-all - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epSpec" --route-name "$rtSpecAll" \ - --origin-group "$ogSpec" --patterns-to-match '/*' --https-redirect Enabled --supported-protocols Http Https --link-to-default-domain Enabled --forwarding-protocol MatchRequest -o none - # Specific '/john' - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epSpec" --route-name "$rtSpecJohn" \ - --origin-group "$ogSpec" --patterns-to-match '/john' --https-redirect Enabled --supported-protocols Http Https --link-to-default-domain Enabled --forwarding-protocol MatchRequest -o none -fi - -# Rules engine demo: create rule set with a rule that adds a response header; attach to route -if [[ "$DO_RULES" == "true" ]]; then - az afd endpoint create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epRules" --enabled-state Enabled -o none - az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$ogRules" \ - --probe-request-type GET --probe-protocol Http --probe-interval-in-seconds 120 --probe-path / --sample-size 4 --successful-samples-required 3 --additional-latency-in-milliseconds 0 -o none - az afd origin create -g "$RESOURCE_GROUP" --profile-name "$profileName" --origin-group-name "$ogRules" --origin-name "$orMainRules" \ - --host-name "$funcMainHost" --origin-host-header "$funcMainHost" --http-port 80 --https-port 443 -o none - - # Create a Rule Set and a Rule. If the Azure CLI extension/command group is unavailable, skip gracefully. - set +e - az afd rule-set create -g "$RESOURCE_GROUP" --profile-name "$profileName" --rule-set-name "$ruleSetName" -o none - RS_STATUS=$? - set -e - if [[ $RS_STATUS -eq 0 ]]; then - # Rules use the shorthand syntax of the `cdn` CLI extension (>= 1.0.0b1), where - # conditions/actions are passed as structured lists instead of flattened arguments. - # Add Rule 1: ModifyResponseHeader when RequestMethod == GET - set +e - az afd rule create \ - -g "$RESOURCE_GROUP" \ - --profile-name "$profileName" \ - --rule-set-name "$ruleSetName" \ - --rule-name "$ruleName" \ - --order 1 \ - --match-processing-behavior Continue \ - --conditions "[{request-method:{parameters:{operator:Equal,match-values:[GET],negate-condition:false}}}]" \ - --actions "[{modify-response-header:{parameters:{header-action:Overwrite,header-name:X-CDN,value:MSFT}}}]" -o none - RULE_STATUS=$? - set -e - # Add Rule 2: UrlRewrite when UrlPath begins with /api -> / - set +e - az afd rule create \ - -g "$RESOURCE_GROUP" \ - --profile-name "$profileName" \ - --rule-set-name "$ruleSetName" \ - --rule-name rule2 \ - --order 2 \ - --match-processing-behavior Continue \ - --conditions "[{url-path:{parameters:{operator:BeginsWith,match-values:[/api],negate-condition:false}}}]" \ - --actions "[{url-rewrite:{parameters:{source-pattern:/api,destination:/}}}]" -o none - set -e - # Add Rule 3: UrlRedirect when UrlPath begins with /old -> /new (302 Found) - set +e - az afd rule create \ - -g "$RESOURCE_GROUP" \ - --profile-name "$profileName" \ - --rule-set-name "$ruleSetName" \ - --rule-name rule3 \ - --order 3 \ - --conditions "[{url-path:{parameters:{operator:BeginsWith,match-values:[/old],negate-condition:false}}}]" \ - --actions "[{url-redirect:{parameters:{redirect-type:Found,custom-path:/new}}}]" -o none - set -e - else - echo "Note: 'az afd rule-set' command group not available; skipping rule creation." - RULE_STATUS=1 - fi - - # Create a route and attach the rule set if created. The cdn CLI extension replaced - # `--rule-sets ` with `--formatted-rule-sets`, which takes resource-id references. - if [[ $RS_STATUS -eq 0 ]]; then - RULE_SET_ID=$(az afd rule-set show -g "$RESOURCE_GROUP" --profile-name "$profileName" --rule-set-name "$ruleSetName" --query id -o tsv) - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epRules" --route-name "rt-${prefix}-rules" \ - --origin-group "$ogRules" --patterns-to-match '/*' --https-redirect Enabled --supported-protocols Http Https \ - --link-to-default-domain Enabled --forwarding-protocol MatchRequest --formatted-rule-sets "[{id:'$RULE_SET_ID'}]" -o none - else - az afd route create -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$epRules" --route-name "rt-${prefix}-rules" \ - --origin-group "$ogRules" --patterns-to-match '/*' --https-redirect Enabled --supported-protocols Http Https \ - --link-to-default-domain Enabled --forwarding-protocol MatchRequest -o none - fi -fi - -# Endpoint enabled/disabled scenario: provision an endpoint we can toggle -if [[ "$DO_STATE" == "true" ]]; then - create_endpoint_single_origin "$epState" "og-${prefix}-state" "or-${prefix}-state" "rt-${prefix}-state" "$funcMainHost" '/*' -fi - -# ------------------------------- -# Resolve hostnames for output -# ------------------------------- -resolve_ep_host() { az afd endpoint show -g "$RESOURCE_GROUP" --profile-name "$profileName" --endpoint-name "$1" --query hostName -o tsv || true; } - -hostBasic=""; hostMulti=""; hostSpec=""; hostRules=""; hostState="" -[[ "$DO_BASIC" == "true" ]] && hostBasic=$(resolve_ep_host "$epBasic") -[[ "$DO_MULTI" == "true" ]] && hostMulti=$(resolve_ep_host "$epMulti") -[[ "$DO_SPEC" == "true" ]] && hostSpec=$(resolve_ep_host "$epSpec") -[[ "$DO_RULES" == "true" ]] && hostRules=$(resolve_ep_host "$epRules") -[[ "$DO_STATE" == "true" ]] && hostState=$(resolve_ep_host "$epState") - -# Detect LocalStack environment for local URLs -IS_LOCALSTACK="false" -ENVIRONMENT=$(az account show --query environmentName --output tsv 2>/dev/null || true) -if [[ "$ENVIRONMENT" == "LocalStack" ]]; then - IS_LOCALSTACK="true" - epBasicLocal="${epBasic}.afd.localhost.localstack.cloud:4566" - epMultiLocal="${epMulti}.afd.localhost.localstack.cloud:4566" - epSpecLocal="${epSpec}.afd.localhost.localstack.cloud:4566" - epRulesLocal="${epRules}.afd.localhost.localstack.cloud:4566" - epStateLocal="${epState}.afd.localhost.localstack.cloud:4566" -fi - -# ------------------------------- -# Persist environment for cleanup -# ------------------------------- -cat > "$ENV_OUT" </dev/null) +ORIGIN=$(jq -r '.origin' "$BODY_FILE" 2>/dev/null) +RECEIVED_PATH=$(jq -r '.path' "$BODY_FILE" 2>/dev/null) +if [[ "$SKU" == "AFD-001" ]]; then + echo "The catch-all route reached the catalog" +else + echo "Expected catalog item AFD-001 through the endpoint (got sku=$SKU)" + FAILED=1 +fi +if [[ "$ORIGIN" == "primary" ]]; then + echo "The priority-1 origin answered" +else + echo "Expected the priority-1 origin to answer (got: $ORIGIN)" + FAILED=1 +fi +# The route's origin path puts the Functions route prefix back on, so the client never sends it. +if [[ "$RECEIVED_PATH" == "/api/catalog/1" ]]; then + echo "The route's origin path prefixed the request to the origin: $RECEIVED_PATH" +else + echo "Expected the origin to be asked for /api/catalog/1 (got: $RECEIVED_PATH)" + FAILED=1 +fi + +# 3. The rules engine stamped the response on its way out. +SERVED_BY=$(grep -i "^x-served-by:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +echo "Response header added by the rule set: ${SERVED_BY:-(none)}" +if [[ "$SERVED_BY" == "front-door" ]]; then + echo "The ModifyResponseHeader rule ran" +else + echo "Expected X-Served-By: front-door from the rule set" + FAILED=1 +fi + +# Every response carries Front Door's own reference id, which support asks for. +if grep -qi "^x-azure-ref:" "$HEADERS_FILE"; then + echo "The response carries an X-Azure-Ref reference id" +else + echo "Expected an X-Azure-Ref header on the response" + FAILED=1 +fi + +# 4. A more specific route wins over the catch-all, and sends the request to a different origin +# group. Both routes are linked to the same endpoint. +echo "Calling [$ENDPOINT_URL/status]..." +STATUS_CODE=$(curl -s -m 20 -o "$BODY_FILE" -w "%{http_code}" "$ENDPOINT_URL/status") +STATUS_ORIGIN=$(jq -r '.origin' "$BODY_FILE" 2>/dev/null) +echo "HTTP $STATUS_CODE: $(cat "$BODY_FILE" | tr -d '\n')" +if [[ "$STATUS_CODE" == "200" && "$STATUS_ORIGIN" == "secondary" ]]; then + echo "/status matched the specific route and went to the other origin group" +else + echo "Expected /status to be served by the secondary origin (got HTTP $STATUS_CODE, origin=$STATUS_ORIGIN)" + FAILED=1 +fi + +# 5. The UrlRewrite rule: the client asks for /shop/2, the origin is asked for /api/catalog/2. +echo "Calling [$ENDPOINT_URL/shop/2]..." +SHOP_STATUS=$(curl -s -m 20 -o "$BODY_FILE" -w "%{http_code}" "$ENDPOINT_URL/shop/2") +SHOP_PATH=$(jq -r '.path' "$BODY_FILE" 2>/dev/null) +SHOP_SKU=$(jq -r '.item.sku' "$BODY_FILE" 2>/dev/null) +echo "HTTP $SHOP_STATUS: origin path $SHOP_PATH, sku $SHOP_SKU" +if [[ "$SHOP_STATUS" == "200" && "$SHOP_PATH" == "/api/catalog/2" && "$SHOP_SKU" == "AFD-002" ]]; then + echo "The UrlRewrite rule rewrote /shop to /catalog before the origin call" +else + echo "Expected /shop/2 to reach the origin as /api/catalog/2 with sku AFD-002" + FAILED=1 +fi + +# 6. The UrlRedirect rule answers at the edge: the origin is never called. +echo "Calling [$ENDPOINT_URL/legacy]..." +REDIRECT_STATUS=$(curl -s -m 20 -o /dev/null -D "$HEADERS_FILE" -w "%{http_code}" "$ENDPOINT_URL/legacy") +LOCATION=$(grep -i "^location:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +echo "HTTP $REDIRECT_STATUS -> ${LOCATION:-(no Location header)}" +if [[ "$REDIRECT_STATUS" == "302" && "$LOCATION" == */status ]]; then + echo "The UrlRedirect rule answered at the edge" +else + echo "Expected a 302 to /status from the rule set" + FAILED=1 +fi + +# 7. Caching. The catalog response carries a Cache-Control the edge can honour, so the second +# request is served from the cache. Azure reports this as TCP_HIT and the emulator as HIT, so the +# check reads the word rather than the whole value. +# +# The first request has to start from an empty cache to mean anything, and an earlier run of this +# script against the same endpoint would have left entries behind, so purge before measuring. +purge_catalog() { + az afd endpoint purge \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --content-paths '/catalog/*' 1>/dev/null + + if [[ $? != 0 ]]; then + echo "Failed to purge the endpoint" + FAILED=1 + fi +} + +echo "Purging /catalog/* so the cache starts empty..." +purge_catalog + +echo "Requesting [$ENDPOINT_URL/catalog/3] twice..." +curl -s -m 20 -o /dev/null -D "$HEADERS_FILE" "$ENDPOINT_URL/catalog/3" +FIRST_CACHE=$(grep -i "^x-cache:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +if echo "$FIRST_CACHE" | grep -qi "hit"; then + echo "Expected the first request after a purge to reach the origin (got: $FIRST_CACHE)" + FAILED=1 +fi +curl -s -m 20 -o "$BODY_FILE" -D "$HEADERS_FILE" "$ENDPOINT_URL/catalog/3" +SECOND_CACHE=$(grep -i "^x-cache:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +CACHE_AGE=$(grep -i "^age:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +echo "First request: X-Cache: ${FIRST_CACHE:-(none)}; second request: X-Cache: ${SECOND_CACHE:-(none)} Age: ${CACHE_AGE:-(none)}" +if echo "$SECOND_CACHE" | grep -qi "hit"; then + echo "The second request was served from the edge cache" +else + echo "Expected the second request to be a cache hit (got: ${SECOND_CACHE:-none})" + FAILED=1 +fi + +# A purge empties the cache for the paths it names, so the next request goes to the origin again. +echo "Purging /catalog/* from the endpoint..." +purge_catalog + +PURGED_CACHE='' +for i in $(seq 1 $PROPAGATION_ATTEMPTS); do + curl -s -m 20 -o /dev/null -D "$HEADERS_FILE" "$ENDPOINT_URL/catalog/3" + PURGED_CACHE=$(grep -i "^x-cache:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') + echo "$PURGED_CACHE" | grep -qi "hit" || break + sleep 5 +done +echo "After the purge: X-Cache: ${PURGED_CACHE:-(none)}" +if echo "$PURGED_CACHE" | grep -qi "hit"; then + echo "Expected the purged path to be fetched from the origin again" + FAILED=1 +else + echo "The purged path was fetched from the origin again" +fi + +# A response the origin marks no-store is never cached, however often it is asked for. +curl -s -m 20 -o /dev/null -D "$HEADERS_FILE" "$ENDPOINT_URL/whoami" +curl -s -m 20 -o "$BODY_FILE" -D "$HEADERS_FILE" "$ENDPOINT_URL/whoami" +NOSTORE_CACHE=$(grep -i "^x-cache:" "$HEADERS_FILE" | tr -d '\r' | awk '{print $2}') +echo "A no-store response: X-Cache: ${NOSTORE_CACHE:-(none)}" +if echo "$NOSTORE_CACHE" | grep -qi "hit"; then + echo "A response the origin marked no-store was served from the cache" + FAILED=1 +else + echo "The no-store response was not cached" +fi + +# 8. What Front Door tells the origin about the client and about itself. +echo "Reading [$ENDPOINT_URL/whoami]..." +jq -r '.front_door_headers' "$BODY_FILE" 2>/dev/null +FORWARDED_HOST=$(jq -r '.front_door_headers["x-forwarded-host"] // ""' "$BODY_FILE" 2>/dev/null) +CLIENT_IP=$(jq -r '.front_door_headers["x-azure-clientip"] // ""' "$BODY_FILE" 2>/dev/null) +FDID=$(jq -r '.front_door_headers["x-azure-fdid"] // ""' "$BODY_FILE" 2>/dev/null) +if [[ -n "$FORWARDED_HOST" && "$ENDPOINT_URL" == *"$FORWARDED_HOST"* ]]; then + echo "The origin was told which host the client asked for: $FORWARDED_HOST" +else + echo "Expected X-Forwarded-Host to name the endpoint (got: ${FORWARDED_HOST:-none})" + FAILED=1 +fi +if [[ -n "$CLIENT_IP" ]]; then + echo "The origin was told the client's address: $CLIENT_IP" +else + echo "Expected an X-Azure-ClientIP header at the origin" + FAILED=1 +fi +# The profile's own id, which an origin uses to refuse traffic that did not come through it. +if [[ -n "$FDID" ]]; then + echo "The origin was told which Front Door profile called it: $FDID" +else + echo "Expected an X-Azure-FDID header at the origin" + FAILED=1 +fi + +# 9. Priority is a strict tier: while the priority-1 origin is healthy the standby gets nothing. +# /whoami is not cached, so each of these requests reaches an origin. +echo "Sending ten requests to check origin selection..." +STANDBY_ANSWERS=0 +for i in $(seq 1 10); do + WHO=$(curl -s -m 20 "$ENDPOINT_URL/whoami" | jq -r '.origin' 2>/dev/null) + [[ "$WHO" == "secondary" ]] && STANDBY_ANSWERS=$((STANDBY_ANSWERS + 1)) +done +if [[ $STANDBY_ANSWERS == 0 ]]; then + echo "All ten requests were answered by the priority-1 origin" +else + echo "The priority-2 standby answered $STANDBY_ANSWERS of ten requests while the primary was healthy" + FAILED=1 +fi + +# 10. The origin's own error passes through the edge untouched. +MISSING_STATUS=$(curl -s -m 20 -o "$BODY_FILE" -w "%{http_code}" "$ENDPOINT_URL/catalog/99") +echo "HTTP $MISSING_STATUS: $(cat "$BODY_FILE" | tr -d '\n')" +if [[ "$MISSING_STATUS" == "404" ]] && grep -q "No catalog item 99" "$BODY_FILE"; then + echo "The origin's 404 passes through Front Door" +else + echo "Expected the origin's 404 for a missing catalog item (got HTTP $MISSING_STATUS)" + FAILED=1 +fi + +# 11. A disabled endpoint stops serving, and serves again once it is enabled. This check runs last +# because it takes the endpoint out of service while it runs. +echo "Disabling the [$ENDPOINT_NAME] endpoint..." +az afd endpoint update \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --enabled-state Disabled 1>/dev/null + +DISABLED_STATUS='' +for i in $(seq 1 $PROPAGATION_ATTEMPTS); do + DISABLED_STATUS=$(curl -s -m 20 -o /dev/null -w "%{http_code}" "$ENDPOINT_URL/status") + [[ "$DISABLED_STATUS" != "200" ]] && break + sleep 5 +done +echo "A disabled endpoint answers: HTTP $DISABLED_STATUS" +if [[ "$DISABLED_STATUS" != "200" ]]; then + echo "The disabled endpoint stopped serving" +else + echo "Expected the disabled endpoint to stop serving" + FAILED=1 +fi + +echo "Enabling the [$ENDPOINT_NAME] endpoint again..." +az afd endpoint update \ + --endpoint-name $ENDPOINT_NAME \ + --profile-name $PROFILE_NAME \ + --resource-group $RESOURCE_GROUP_NAME \ + --enabled-state Enabled 1>/dev/null + +ENABLED_STATUS='' +for i in $(seq 1 $PROPAGATION_ATTEMPTS); do + ENABLED_STATUS=$(curl -s -m 20 -o /dev/null -w "%{http_code}" "$ENDPOINT_URL/status") + [[ "$ENABLED_STATUS" == "200" ]] && break + sleep 5 +done +echo "The re-enabled endpoint answers: HTTP $ENABLED_STATUS" +if [[ "$ENABLED_STATUS" == "200" ]]; then + echo "The endpoint serves again" +else + echo "Expected the re-enabled endpoint to serve again" + FAILED=1 +fi + +if [[ $FAILED == 0 ]]; then + echo "All validation checks passed" +else + echo "Some validation checks failed" +fi +exit $FAILED