# Model Deployment Strategies on Azure
**Område:** MLOps & GenAIOps
**Dato:** 2026-02-04
**Målgruppe:** Arkitekter som planlegger ML-modellutplassering i produksjon
**Konfidensgrad:** ⚡️⚡️⚡️ Høy (basert på Microsoft Learn + offisielle code samples)
**Last updated:** 2026-04
## Introduksjon
Model deployment strategies handler om hvordan man trygt og effektivt ruller ut nye ML-modeller eller modellversjoner til produksjon uten å forårsake nedetid eller forringet brukeropplevelse. Azure Machine Learning tilbyr flere deployment patterns som støtter **progressive exposure**, **traffic routing**, og **rollback-mekanismer**.
Korrekt valg av deployment strategy reduserer risiko, muliggjør raskere iterasjoner, og sikrer at feil oppdages tidlig før full produksjonsrullering. Dette er spesielt kritisk for GenAI-løsninger hvor modelloppførsel kan variere betydelig mellom versjoner.
**Hovedutfordringer:**
- Unngå service disruption ved modellbytte
- Validere ny modell mot reell produksjonstrafikk
- Kunne rulle tilbake raskt ved feil
- Sammenligne modellytelse mellom versjoner (A/B testing)
- Håndtere stateful components (databaser, schemas) ved rollback
## Kjernekomponenter
### 1. Azure Machine Learning Online Endpoints
**Online endpoints** er det primære konseptet for real-time inferencing i Azure ML. Et endpoint fungerer som et API som klienter kan konsumere, mens underliggende **deployments** representerer den faktiske implementasjonen.
**Nøkkelkonsept:**
- **Endpoint** = API-kontrakten (URL, autentisering)
- **Deployment** = Konkret modellversjon + infrastruktur + scoring script
- Ett endpoint kan ha **flere deployments** samtidig
- Traffic routing styres på endpoint-nivå
**To typer online endpoints:**
1. **Managed Online Endpoints** – Azure administrerer infrastruktur (anbefalt)
2. **Kubernetes Online Endpoints** – Du administrerer AKS-cluster
**Eksempel (Python SDK):**
```python
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment
# Opprett endpoint
endpoint = ManagedOnlineEndpoint(
name="heart-classifier-endpoint",
auth_mode="key",
description="Production endpoint for heart disease classifier"
)
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Deployment (med modell, environment, scoring script)
blue_deployment = ManagedOnlineDeployment(
name="blue",
endpoint_name="heart-classifier-endpoint",
model=model,
environment=env,
code_configuration=CodeConfiguration(code="./src", scoring_script="score.py"),
instance_type="Standard_DS3_v2",
instance_count=2
)
ml_client.online_deployments.begin_create_or_update(blue_deployment).result()
# Allokér all trafikk til blue
endpoint.traffic = {"blue": 100}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Referanse:** [Managed online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-online?view=azureml-api-2)
---
### 2. Blue-Green Deployment
**Blue-green deployment** er en strategi der to identiske miljøer (blue = nåværende, green = ny) kjører parallelt. Trafikken byttes gradvis fra blue til green, og man kan raskt rulle tilbake ved feil.
**Workflow:**
1. **Blue (v1)** kjører i produksjon med 100% trafikk
2. Deploy **Green (v2)** til samme endpoint med 0% trafikk
3. Test Green isolert (via deployment-name parameter)
4. Allokér små andeler trafikk til Green (10%, 25%, 50%)
5. Monitorér health metrics, error rates, latency
6. Gradvis øk til 100% Green
7. Fjern Blue deployment når Green er stabil
**Eksempel (Azure CLI):**
```bash
# Deploy green deployment (0% traffic)
az ml online-deployment create --name green \
--endpoint-name $ENDPOINT_NAME \
-f green-deployment.yml
# Test green isolert
az ml online-endpoint invoke --name $ENDPOINT_NAME \
--deployment-name green \
--request-file sample.json
# Allokér 10% trafikk til green
az ml online-endpoint update --name $ENDPOINT_NAME \
--traffic "blue=90 green=10"
# Monitorér, deretter 100% til green
az ml online-endpoint update --name $ENDPOINT_NAME \
--traffic "blue=0 green=100"
# Slett blue deployment
az ml online-deployment delete --name blue \
--endpoint-name $ENDPOINT_NAME --yes
```
**Fordeler:**
- Null downtime
- Enkel rollback (bare bytt trafikk tilbake)
- Tester mot reell produksjonstrafikk
- Støtter gradvis rollout
**Ulemper:**
- Krever dobbelt ressurskapasitet under rullering
- Komplisert ved stateful components (database migrations)
**Referanse:** [Safe rollout for real-time inference](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2)
---
### 3. Canary Deployment
**Canary deployment** er en variant av progressive exposure der en liten "kanari-gruppe" av brukere får tilgang til den nye versjonen først. Dette kan være interne brukere, beta-testere, eller en geografisk region.
**Workflow:**
1. Deploy ny versjon til subset av infrastruktur (f.eks. én AKS-node)
2. Route 5-10% av trafikk til canary
3. Samle metrics og feedback fra canary-gruppen
4. Utvid gradvis til 25%, 50%, 100%
5. Rulle tilbake hvis canary viser feil
**Azure implementering:**
- For **AKS deployments**: Bruk Kubernetes Deployment Stamps pattern
- For **Managed Endpoints**: Samme som blue-green, men fokus på små initial percentages
**Eksempel (Azure DevOps Pipelines):**
```yaml
# Deploy canary with 10% traffic
- task: KubernetesManifest@1
inputs:
action: 'deploy'
strategy: 'canary'
percentage: '10'
manifests: 'manifests/deployment.yml'
```
**Fordeler:**
- Tidlig feil-deteksjon
- Begrenset blast radius ved feil
- God for testing av nye features med ekte brukere
**Ulemper:**
- Krever sofistikert traffic routing (feature flags, load balancer)
- Kan være vanskelig å isolere canary-trafikk for debugging
**Referanse:** [Canary deployment for Kubernetes](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/kubernetes/canary-demo?view=azure-devops)
---
### 4. Shadow Deployment (Traffic Mirroring)
**Shadow deployment** kopierer en prosentandel av live trafikk til en ny deployment uten å returnere resultater til klienten. Dette lar deg validere ny modell mot reell produksjonsdata uten å påvirke brukere.
**Nøkkelkonsept:**
- **Mirror traffic** = Kopier requests til shadow deployment
- Klienten får alltid svar fra primær deployment (blue)
- Shadow deployment (green) logger metrics, men påvirker ikke response
- Maks 50% mirror traffic (bandwidth quota limits)
**Eksempel (Python SDK):**
```python
# Mirror 10% av trafikk til green
endpoint.mirror_traffic = {"green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Invoke endpoint flere ganger (trafikk går til blue, 10% mirrors til green)
for i in range(100):
ml_client.online_endpoints.invoke(
endpoint_name=endpoint_name,
request_file="sample.json"
)
# Sjekk green logs for validering
ml_client.online_deployments.get_logs(
name="green",
endpoint_name=endpoint_name,
lines=100
)
# Disable mirroring
endpoint.mirror_traffic = {"green": 0}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Begrensninger:**
- **Ikke støttet** for Kubernetes online endpoints
- Maks 50% mirror traffic (p.g.a. endpoint bandwidth quota)
- Kun én deployment kan motta mirrored traffic
- En deployment kan **ikke** motta både live og mirrored traffic
**Use cases:**
- Validere latency for ny modell
- Sjekke for HTTP errors før live traffic
- Sammenligne predictions mellom modeller (offline analysis)
**Referanse:** [Traffic mirroring documentation](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2#test-the-deployment-with-mirrored-traffic)
---
### 5. A/B Testing
**A/B testing** router trafikk mellom to (eller flere) modellversjoner for å sammenligne performance metrics, conversion rates, eller brukeropplevelse.
**Implementering i Azure ML:**
```python
# 50/50 split mellom v1 og v2
endpoint.traffic = {"model-v1": 50, "model-v2": 50}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Viktige poeng:**
- Total traffic **må** summere til 100% (eller 0% for disable)
- Bruk Application Insights for å tracke metrics per deployment
- Samle nok data før konklusjon (statistisk signifikans)
**Advanced: Target specific deployment via HTTP header:**
```python
# Klient kan overstyre traffic routing med header:
# azureml-model-deployment: model-v2
```
**Referanse:** [Controlled rollout for online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-model-management-and-deployment?view=azureml-api-2#model-registration,-packaging,-and-deployment)
---
## Arkitekturmønstre
### Mønster 1: Progressive Rollout for Managed Endpoints
**Scenario:** Du har en produksjonsmodell (v1) og vil deploye v2 med minimal risiko.
**Steg:**
1. **Deploy v2 med 0% traffic**
```bash
az ml online-deployment create --name v2 \
--endpoint-name prod-endpoint -f v2-deployment.yml
```
2. **Test isolert**
```bash
az ml online-endpoint invoke --name prod-endpoint \
--deployment-name v2 --request-file test-data.json
```
3. **Mirror 10% trafikk for validation** (valgfritt)
```bash
az ml online-endpoint update --name prod-endpoint \
--mirror-traffic "v2=10"
```
**Bake time:** 6-12 timer. Sjekk logs for errors, latency, HTTP 500s.
4. **Start live traffic med 10%**
```bash
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=90 v2=10" --mirror-traffic "v2=0"
```
**Bake time:** 24 timer. Monitorér Application Insights metrics.
5. **Øk gradvis til 25%, 50%, 100%**
```bash
# 50/50 split
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=50 v2=50"
# Full rollout
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=0 v2=100"
```
**Bake time:** Øk mellom hver fase (24-48 timer for 50%, 72 timer før 100%).
6. **Fjern v1 deployment**
```bash
az ml online-deployment delete --name v1 \
--endpoint-name prod-endpoint --yes
```
**Health checks per fase:**
- HTTP error rate < 0.1%
- p95 latency < SLA threshold
- Model prediction drift innenfor toleranse
- No increase in retry/timeout errors
---
### Mønster 2: Blue-Green med Database Migrations
**Utfordring:** Stateful components (database schema endringer) kompliserer rollback.
**Løsning: Backward-compatible schema migrations**
**Steg:**
1. **Deploy database schema v2 (backward compatible)**
- Nye kolonner har default values
- Gamle kolonner beholdes (deprecated, ikke fjernet)
- Applikasjonen kan kjøre mot begge schemas
2. **Deploy blue (v1) og green (v2) parallelt**
- Begge deployments bruker samme database
- v1 ignorerer nye kolonner
- v2 populerer nye kolonner
3. **Gradvis trafikk-bytte (som tidligere)**
4. **Cleanup fase (etter 100% green)**
- Kjør datamigrasjon script for å fylle nye kolonner (for gamle rader)
- Etter 1-2 uker, fjern deprecated kolonner
**Rollback-strategi:**
- Hvis feil oppdages før cleanup: Bare bytt trafikk tilbake til blue
- Hvis feil oppdages etter cleanup: Krever restore fra backup (derfor lang bake time)
---
### Mønster 3: Multi-Region Deployment with Canary
**Scenario:** Global produksjonsmodell med brukere i Europa, USA, Asia.
**Arkitektur:**
```
Azure Front Door (global load balancer)
├── Region: West Europe
│ ├── Endpoint: eu-prod-endpoint
│ │ ├── Deployment: blue (v1)
│ │ └── Deployment: green (v2) [canary]
├── Region: East US
│ └── Endpoint: us-prod-endpoint
│ └── Deployment: blue (v1)
└── Region: Southeast Asia
└── Endpoint: asia-prod-endpoint
└── Deployment: blue (v1)
```
**Rollout plan:**
1. **Deploy green til West Europe endpoint** (10% trafikk)
2. **Bake time:** 48 timer (dekker ulike tidssoner i Europa)
3. **Hvis OK:** Øk til 100% i West Europe
4. **Deploy green til East US** (10% trafikk)
5. **Bake time:** 48 timer
6. **Hvis OK:** Øk til 100% i East US
7. **Deploy green til Southeast Asia** (10% trafikk)
8. **Final bake:** 48 timer, deretter 100%
**Fordel:** Begrenser blast radius til én region. Hvis West Europe feiler, USA og Asia er upåvirket.
---
## Beslutningsveiledning
### Når bruke hvilken strategi?
| Strategi | Bruk når... | Ikke bruk når... |
|----------|-------------|------------------|
| **Blue-Green** | - Kritisk produksjonsmodell
- Trenger rask rollback
- Kan doble infrastruktur midlertidig | - Svært stateful (kompleks database)
- Knappe ressurser (cost constraints) |
| **Canary** | - Ny feature med ukjent impact
- Interne brukere kan teste først
- Geografisk segmenterte brukere | - Alle brukere må få samme versjon
- Real-time consistency krav |
| **Shadow Deployment** | - Validere ytelse før live traffic
- Sammenligne modellpredictions offline
- Testing av latency/throughput | - Bandwidth quotas er trange
- Trenger immediate feedback fra brukere |
| **A/B Testing** | - Business-critical decision (f.eks. recommendation model)
- Trenger statistisk signifikant sammenligning | - Raskt behov for rollout
- Ikke nok trafikk for statistisk kraft |
| **Progressive Rollout** | - Standard for alle produksjonsdeployments
- Alltid kombinert med en av strategiene over | - (Alltid bruk progressive rollout!) |
---
### Beslutningstre
```
START: Skal deploye ny modellversjon?
│
├─ Er dette første produksjonsdeployment?
│ └─ JA → Deploy single deployment (100% traffic) → Ferdig
│
├─ Har du stateful components (database)?
│ ├─ JA → Implementer backward-compatible migrations først
│ └─ NEI → Fortsett
│
├─ Trenger du sammenligne to versjoner for business metrics?
│ ├─ JA → A/B Testing (50/50 eller annen split)
│ └─ NEI → Fortsett
│
├─ Er modellen kritisk (høy blast radius ved feil)?
│ ├─ JA → Shadow deployment først (mirror 10-50%)
│ │ → Deretter Blue-Green med canary percentages (10% → 25% → 50% → 100%)
│ └─ NEI → Blue-Green med standard rollout (10% → 100%)
│
└─ Er brukerbasen geografisk spredt?
├─ JA → Multi-region canary (én region om gangen)
└─ NEI → Single-region progressive rollout
```
---
## Integrasjon med Microsoft-stakken
### 1. Azure DevOps Pipelines
**CI/CD for ML model deployment:**
```yaml
# azure-pipelines.yml
trigger:
branches:
include:
- main
stages:
- stage: Build
jobs:
- job: TrainModel
steps:
- task: AzureCLI@2
inputs:
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az ml job create -f training-job.yml
- stage: DeployCanary
dependsOn: Build
jobs:
- deployment: DeployGreen
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
displayName: 'Deploy green (0% traffic)'
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-deployment create --name green \
--endpoint-name prod-endpoint -f green.yml
- stage: Canary10Percent
dependsOn: DeployCanary
jobs:
- job: UpdateTraffic
steps:
- task: AzureCLI@2
displayName: 'Route 10% to green'
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=90 green=10"
- task: Delay@1
inputs:
delayForMinutes: '60' # Bake time
- stage: ValidateCanary
dependsOn: Canary10Percent
jobs:
- job: CheckMetrics
steps:
- task: AzureCLI@2
displayName: 'Query Application Insights'
inputs:
scriptType: 'bash'
inlineScript: |
# Sjekk error rate for green deployment
ERROR_RATE=$(az monitor app-insights metrics show \
--app my-app-insights \
--metric "requests/failed" \
--filter "cloud/roleName eq 'green'" \
--aggregation avg --query value -o tsv)
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
echo "Error rate too high, failing pipeline"
exit 1
fi
- stage: RolloutFull
dependsOn: ValidateCanary
condition: succeeded()
jobs:
- deployment: FullRollout
environment: 'production-approval' # Manual approval gate
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=0 green=100"
```
**Approval gates:**
- **Environment protection rules** i Azure DevOps sikrer manuell godkjenning før full rollout
- Integrer med **Azure Monitor alerts** for automatisk rollback ved feil
---
### 2. Azure Monitor & Application Insights
**Health metrics for deployment validation:**
```python
# Python-script for å sjekke deployment health
from azure.monitor.query import MetricsQueryClient, MetricAggregationType
from azure.identity import DefaultAzureCredential
from datetime import timedelta
credential = DefaultAzureCredential()
client = MetricsQueryClient(credential)
# Hent metrics for green deployment (siste time)
response = client.query_resource(
resource_uri=f"/subscriptions/{subscription_id}/resourceGroups/{rg}/providers/Microsoft.MachineLearningServices/workspaces/{ws}/onlineEndpoints/{endpoint}/deployments/green",
metric_names=["RequestLatency", "RequestsPerSecond", "CpuUtilizationPercentage"],
timespan=timedelta(hours=1),
aggregations=[MetricAggregationType.AVERAGE, MetricAggregationType.P95]
)
for metric in response.metrics:
print(f"{metric.name}: {metric.timeseries[0].data[0].average}")
```
**Alerts for automatic rollback:**
```bash
# Opprett alert rule for høy error rate
az monitor metrics alert create \
--name "green-deployment-high-errors" \
--resource-group myRG \
--scopes /subscriptions/.../onlineEndpoints/prod-endpoint/deployments/green \
--condition "avg requests/failed > 5" \
--window-size 5m \
--evaluation-frequency 1m \
--action /subscriptions/.../actionGroups/rollback-webhook
```
---
### 3. Azure Machine Learning Registries (MLOps maturity)
**Shared model registry på tvers av workspaces:**
```python
# Register model i shared registry (én gang)
from azure.ai.ml import MLClient
from azure.ai.ml.entities import Model
registry_client = MLClient(credential, registry_name="company-ml-registry")
model = Model(
name="heart-classifier",
version="2.0",
path="./model",
type="mlflow_model",
tags={"production-ready": "true"}
)
registry_client.models.create_or_update(model)
# Deploy fra registry i flere workspaces (dev, staging, prod)
prod_client = MLClient(credential, subscription_id, "prod-rg", "prod-ws")
deployment = ManagedOnlineDeployment(
name="green",
endpoint_name="prod-endpoint",
model=f"azureml://registries/company-ml-registry/models/heart-classifier/versions/2.0",
instance_type="Standard_DS3_v2",
instance_count=2
)
prod_client.online_deployments.begin_create_or_update(deployment).result()
```
**Fordeler:**
- Én kilde til sannhet for produksjonsmodeller
- Deploy samme modell-artifact til dev/staging/prod (consistency)
- Støtter multi-region deployment med samme modellversjon
**Referanse:** [Machine Learning Registries for MLOps](https://learn.microsoft.com/en-us/azure/machine-learning/concept-machine-learning-registries-mlops)
---
### 4. MLflow for Model Packaging
**No-code deployment av MLflow-modeller:**
```python
# Registrer MLflow model (inkluderer dependencies)
import mlflow
mlflow.set_tracking_uri(workspace.get_mlflow_tracking_uri())
with mlflow.start_run():
mlflow.sklearn.log_model(
sk_model=model,
artifact_path="model",
registered_model_name="heart-classifier",
signature=signature,
conda_env=conda_env
)
# Deploy uten scoring script (Azure ML genererer automatisk)
deployment = ManagedOnlineDeployment(
name="green",
endpoint_name="prod-endpoint",
model="azureml:heart-classifier@latest", # MLflow model
instance_type="Standard_DS3_v2",
instance_count=2
# Ingen code_configuration eller environment nødvendig!
)
```
**Fordeler:**
- Raskere deployment (ingen custom scoring script)
- Built-in support for scikit-learn, TensorFlow, PyTorch
- Enklere rollback (bare endre model version)
**Auth note (Verified MCP 2026-04):** For production deployments, use Microsoft Entra token-based authentication (`aad_token`) instead of key-based auth — provides identity-based access control.
**Referanse:** [Deploy MLflow models to online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-mlflow-models-online-endpoints?view=azureml-api-2)
---
## Offentlig sektor (Norge)
### 1. Krav til endringshåndtering (Digdir)
**Utredningsinstruksen (2016) § 5:**
- Alle større IT-endringer (inkludert ML-modellutplasseringer) må dokumenteres med beslutningsgrunnlag
- **ADR (Architecture Decision Record)** bør inkludere valg av deployment strategy
**Eksempel ADR for deployment strategy:**
```markdown
# ADR-023: Blue-Green Deployment for Kredittscoring-modell
## Status
Akseptert (2026-02-04)
## Kontekst
Vi må deploye v2 av kredittscoring-modellen til produksjon. Modellen
påvirker 50 000 søknader per måned. Feil kan føre til feilaktige
kredittvurderinger med økonomiske og juridiske konsekvenser.
## Beslutning
Vi bruker **blue-green deployment** med følgende faser:
1. Shadow deployment (mirror 10%) i 48 timer
2. Live traffic 10% i 72 timer
3. Live traffic 50% i 72 timer
4. Live traffic 100%
## Konsekvenser
+ Redusert risiko for feil (gradvis rollout)
+ Rask rollback (bare bytt trafikk)
- Økte infrastrukturkostnader i rollout-perioden (2x compute)
- Krever 1 uke total rollout-tid
## Compliance
- Personvernforordningen (GDPR): Logging av alle modellpredictions
- Arkivloven: Bevaring av modellversjon-metadata i 5 år
```
---
### 2. Logging og Etterprøvbarhet
**Krav (GDPR Art. 22 + Arkivloven):**
- Alle automatiserte beslutninger må kunne etterprøves
- Ved modellbytte: Logg hvilken versjon som ga hver prediction
**Implementering:**
```python
# Custom scoring script med versjon-logging
import json
import logging
from datetime import datetime
def init():
global model, model_version
model = mlflow.pyfunc.load_model(model_path)
model_version = os.getenv("MODEL_VERSION", "unknown")
def run(raw_data):
data = json.loads(raw_data)
predictions = model.predict(data["input"])
# Logg hver prediction med modellversjon
for i, pred in enumerate(predictions):
logging.info(json.dumps({
"timestamp": datetime.utcnow().isoformat(),
"model_version": model_version,
"deployment_name": os.getenv("DEPLOYMENT_NAME"),
"input_hash": hashlib.sha256(str(data["input"][i]).encode()).hexdigest(),
"prediction": float(pred),
"user_id": data.get("user_id", [None])[i]
}))
return predictions.tolist()
```
**Log Analytics query for å finne alle predictions fra en deployment:**
```kql
AppTraces
| where TimeGenerated > ago(7d)
| extend LogData = parse_json(Message)
| where LogData.deployment_name == "green"
| project TimeGenerated, LogData.model_version, LogData.prediction, LogData.user_id
| summarize PredictionCount = count() by model_version
```
---
### 3. Risikovurdering (ROS-analyse)
**Trussel: Feil i ny modellversjon gir feilaktige beslutninger**
| Sannsynlighet | Konsekvens | Risiko | Tiltak |
|---------------|------------|--------|--------|
| Middels (3/5) | Høy (4/5) | 12 (Rød) | - Progressive rollout med 48t bake time
- Shadow deployment før live
- Automated rollback ved error rate > 0.1%
- Manual approval gate før 100% rollout |
**Implementering av tiltak:**
1. **Automated rollback** via Azure Monitor alert + Logic App
2. **Manual approval** via Azure DevOps environment protection
3. **Shadow deployment** i 48 timer (dekker helg + hverdag)
---
### 4. Kostnader for Progressive Rollout
**Scenario:** Blue-green deployment i 1 uke rollout-periode
| Fase | Blue Instances | Green Instances | Varighet | Cost (NOK/mnd)* |
|------|---------------|----------------|----------|-----------------|
| Shadow (mirror 10%) | 2x DS3_v2 | 2x DS3_v2 | 2 dager | ~520 NOK |
| Live 10% | 2x DS3_v2 | 2x DS3_v2 | 3 dager | ~780 NOK |
| Live 50% | 2x DS3_v2 | 2x DS3_v2 | 2 dager | ~520 NOK |
| Live 100% (cleanup) | 0 | 2x DS3_v2 | - | 0 NOK (baseline) |
**Total ekstra kostnad:** ~1 820 NOK for 1 ukes rollout (dobbelt kapasitet i 7 dager).
**Optimalisering:**
- Bruk **autoscaling** på green deployment (start med 1 instance, skaler ved behov)
- **Scheduled scaling**: Reducer instances utenfor kontortid (hvis batch-scoring)
*Basert på DS3_v2 = ~2 600 NOK/mnd (per instance)
---
## Kostnad og lisensiering
### 1. Compute-kostnader
**Managed Online Endpoints (Pay-as-you-go):**
| VM Type | vCPU | RAM | Cost (NOK/time)* | Anbefalt for |
|---------|------|-----|------------------|--------------|
| Standard_DS2_v2 | 2 | 7 GB | ~1,10 | Dev/test, små modeller |
| Standard_DS3_v2 | 4 | 14 GB | ~2,20 | Produksjon (medium load) |
| Standard_DS4_v2 | 8 | 28 GB | ~4,40 | Produksjon (høy load) |
| Standard_NC6s_v3 (GPU) | 6 | 112 GB | ~25,00 | Deep learning inferencing |
**Blue-green deployment cost multiplier:**
- Under rollout: **2x compute cost** (begge deployments kjører)
- Varighet: 1-2 uker (avhengig av bake times)
- **Total overhead:** ~5-10% av årlig compute-kostnad
**Eksempel:**
- Baseline produksjon: 2x DS3_v2 (24/7) = ~5 200 NOK/mnd
- Med 4 rollouts per år (1 uke each): 5 200 + (1 820 × 4/12) = ~5 807 NOK/mnd
- **Overhead: ~12%**
*Priser er estimat per jan 2026, Norway East region.
---
### 2. Bandwidth og Storage
**Endpoint bandwidth quota:**
- Default: **5 MBps per endpoint**
- Shadow deployment: Teller mot bandwidth (derfor 50% max mirror traffic)
- Overskridelse: Throttling (HTTP 429 errors)
**Kostnad ved throttling:**
- Ikke direkte kostnad, men **reduced throughput**
- Løsning: Øk quota (support ticket) eller optimaliser payload size
**Model registry storage:**
- Gratis for første 10 GB
- Deretter: ~0,50 NOK/GB/mnd
- Ved mange modellversjoner: Implementer retention policy (slett gamle versjoner)
---
### 3. Lisensiering
**Azure Machine Learning workspace:**
- Gratis (betaler kun for underliggende compute/storage)
- Alle deployment-features (blue-green, mirroring, A/B) inkludert
**MLflow:**
- Open source, gratis
- Azure ML har innebygd MLflow tracking (ingen ekstra kostnad)
**Azure DevOps:**
- **Gratis tier:** 1 hosted pipeline (Microsoft-hosted agent)
- **Basic plan:** ~50 NOK/bruker/mnd + pipeline minutes
- Deployment-pipelines krever parallel jobs (ekstra cost hvis mange pipelines)
---
## For arkitekten (Cosmo)
### 1. Checklist før du velger deployment strategy
**Spørsmål å stille stakeholders:**
1. **Hva er maksimal akseptabel downtime?**
- 0 minutter → Blue-Green eller Canary
- <30 minutter → In-place deployment med rolling update
2. **Hvor kritisk er modellen for business?**
- Kritisk (påvirker revenue/compliance) → Shadow først, deretter gradvis rollout
- Medium → Blue-Green med 10% → 100%
- Lav → Direct deployment med basic smoke test
3. **Har du stateful components (database)?**
- Ja → Implementer backward-compatible migrations først
- Nei → Enklere rollback-strategi
4. **Trenger dere sammenligne modellversjoner for metrics?**
- Ja → A/B testing (50/50 eller annen split)
- Nei → Blue-Green
5. **Hva er budget for ekstra compute under rollout?**
- Begrenset → Canary (én node om gangen)
- Fleksibelt → Blue-Green (full parallell kapasitet)
6. **Hvor lang tid har dere for å rulle ut?**
- 1-2 dager → Aggressiv rollout (10% → 100% raskt)
- 1-2 uker → Konservativ (shadow + bake times)
---
### 2. Anti-patterns (hva du IKKE skal gjøre)
**❌ Direct swap uten testing:**
```python
# IKKE GJØR DETTE!
endpoint.traffic = {"blue": 0, "green": 100} # 0% → 100% instant
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Problem:** Ingen validering, ingen rollback-mulighet, høy blast radius.
**✅ Gjør dette isteden:**
```python
# Shadow først
endpoint.mirror_traffic = {"green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
time.sleep(3600 * 24) # 24 timer bake time
# Så gradvis live
endpoint.mirror_traffic = {"green": 0}
endpoint.traffic = {"blue": 90, "green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
---
**❌ Ingen health metrics monitoring:**
- Deploye ny versjon uten å sjekke error rates, latency, throughput
**✅ Implementer automated health checks:**
```python
def check_deployment_health(deployment_name, threshold_error_rate=0.01):
"""Sjekk health metrics for deployment."""
response = metrics_client.query_resource(
resource_uri=f".../{deployment_name}",
metric_names=["RequestLatency", "RequestsPerSecond", "RequestsFailed"],
timespan=timedelta(hours=1)
)
error_rate = response.metrics["RequestsFailed"].average / response.metrics["RequestsPerSecond"].average
if error_rate > threshold_error_rate:
raise Exception(f"Error rate {error_rate:.2%} exceeds threshold {threshold_error_rate:.2%}")
return True
```
---
**❌ Slett blue deployment for tidlig:**
- Fjerne blue deployment rett etter 100% green rollout
**✅ Behold blue i minst 1 uke:**
```python
# Vent 1 uke etter 100% rollout før cleanup
endpoint.traffic = {"blue": 0, "green": 100}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Sett reminder: Cleanup blue deployment etter 2026-02-11
```
**Rasjonale:** Hvis kritisk bug oppdages etter 3 dager, kan du raskt rulle tilbake til blue uten redeployment.
---
### 3. Rollback-playbook
**Scenario: Green deployment viser økt error rate under 50% rollout**
**Steg:**
1. **Immediate action (< 5 min):**
```bash
# Bytt tilbake til 100% blue
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=100 green=0"
```
2. **Verifiser rollback (< 10 min):**
```bash
# Sjekk at error rate går ned
az monitor app-insights query \
--app my-app-insights \
--analytics-query "requests | where timestamp > ago(5m) | summarize ErrorRate = countif(success == false) / count()"
```
3. **Incident postmortem (< 24 timer):**
- Hva var root cause? (sjekk logs: `az ml online-deployment get-logs --name green`)
- Hvorfor fanget vi ikke dette i shadow phase?
- Oppdater deployment checklist med ny validering
4. **Fix og redeploy (< 1 uke):**
- Fix bug i kode/modell
- Re-run training/testing
- Start ny rollout fra steg 1 (shadow deployment)
---
### 4. Conversation starters med kunden
**Når kunden sier: "Vi vil bare deploye den nye modellen nå."**
**Cosmo:** "Jeg forstår at dere er klare for produksjon. La meg stille noen raske spørsmål for å sikre en trygg deployment:
1. Hvis den nye modellen viser seg å ha feil i produksjon, hvor raskt må vi kunne rulle tilbake? 5 minutter? 1 time? 1 dag?
2. Har dere monitoring satt opp for å oppdage feil? Hvilke metrics ser dere på – error rate, latency, modell-drift?
3. Er det OK å kjøre begge modellversjonene parallelt i 1-2 uker (dvs. dobbel infrastrukturkostnad)? Eller må vi optimalisere for kostnad?
Basert på svarene kan vi velge rett strategi – f.eks. blue-green med gradvis rollout hvis dere trenger rask rollback, eller canary hvis kostnadsoptimalisering er prioritet."
---
**Når kunden sier: "Vi har ikke tid til langsom rollout, vi må ha 100% i produksjon i morgen."**
**Cosmo:** "Jeg skjønner at time-to-market er kritisk. La oss se på risiko vs. hastighet:
**Rask rollout (1-2 dager):**
- Deploy green med 0% traffic i kveld
- Test isolert i natt (automated smoke tests)
- 50% traffic i morgen tidlig (kl 09:00)
- 100% traffic samme dag (kl 15:00) hvis ingen kritiske feil
- **Risiko:** Hvis feil oppdages kl 16:00, har 50% av brukere fått dårlig service hele dagen
**Balansert rollout (3-4 dager):**
- Shadow deployment i 24 timer (validere mot real traffic)
- 10% live traffic dag 2
- 50% live traffic dag 3
- 100% live traffic dag 4
- **Risiko:** Redusert blast radius (maks 10% brukere påvirket hvis feil)
Hva er konsekvensen hvis 50% av brukere får feil predictions i ett døgn? Hvis det er akseptabelt, kan vi kjøre rask rollout. Hvis ikke, anbefaler jeg balansert."
---
### 5. Teknisk deep-dive: Hvordan traffic routing fungerer
**Under panseret på Azure ML Online Endpoints:**
```
Client Request (HTTP POST)
↓
Azure Front Door (global load balancer)
↓
Endpoint (prod-endpoint.norwayeast.inference.ml.azure.com)
↓
Traffic Routing Logic:
- Hvis HTTP header "azureml-model-deployment: green" → Route til green
- Ellers: Bruk traffic percentage (f.eks. 90% blue, 10% green)
↓
Deployment (blue eller green)
↓
Scoring Container (Docker image med model + scoring script)
↓
Return Prediction
```
**Mirror traffic flow:**
```
Client Request
↓
Endpoint
├─→ Primary Deployment (blue) → Return Response til client
└─→ Shadow Deployment (green) → Logg metrics, IKKE return response
```
**Viktig implementasjonsdetalje:**
- Traffic routing skjer **før** request når deployment container
- Mirror traffic er **async** (non-blocking for primary deployment)
- Hvis shadow deployment crasher, påvirker det **ikke** client response
---
## Kilder og verifisering
Denne kunnskapsreferansen er basert på følgende Microsoft Learn-artikler og code samples (verifisert 2026-02-04):
**Primære kilder:**
1. [Perform safe rollout of new deployments for real-time inference](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2)
→ Komplett guide til blue-green deployment og traffic mirroring (Verified MCP 2026-04)
2. [MLOps model management with Azure Machine Learning](https://learn.microsoft.com/en-us/azure/machine-learning/concept-model-management-and-deployment?view=azureml-api-2)
→ Oversikt over deployment capabilities og controlled rollout
3. [Online endpoint deployment for real-time inferencing](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-online?view=azureml-api-2)
→ Konsepter: endpoints vs. deployments, traffic routing, mirroring
4. [Tutorial: Use a canary deployment strategy for Kubernetes](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/kubernetes/canary-demo?view=azure-devops)
→ Canary deployment med Azure DevOps Pipelines
5. [Progressive rollout of MLflow models to Online Endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-mlflow-models-online-progressive?view=azureml-api-2)
→ MLflow-spesifikk progressive rollout; supports model packaging (--with-package) for endpoints without egress connectivity (Verified MCP 2026-04)
**Code samples:**
- [azureml-examples/sdk/python/endpoints/online/managed/online-endpoints-safe-rollout.ipynb](https://github.com/Azure/azureml-examples/blob/main/sdk/python/endpoints/online/managed/online-endpoints-safe-rollout.ipynb)
- [azureml-examples/cli/endpoints/online/managed/sample/](https://github.com/Azure/azureml-examples/tree/main/cli/endpoints/online/managed/sample)
**Well-Architected Framework:**
- [Architecture strategies for safe deployment practices](https://learn.microsoft.com/en-us/azure/well-architected/operational-excellence/safe-deployments)
→ Progressive exposure model, bake times, rollback strategies (Verified MCP 2026-04 — adds safe decommissioning guidance + AI opportunity note for GenAI-assisted rollout tuning)
**Pricing (sist verifisert: 2026-02-04):**
- [Azure Machine Learning pricing](https://azure.microsoft.com/en-us/pricing/details/machine-learning/)
→ Compute costs for managed endpoints
**MCP-kall utført:** 8 (microsoft_docs_search × 5, microsoft_docs_fetch × 2, microsoft_code_sample_search × 1)
---
**Sist oppdatert:** 2026-04-10
**Neste review:** 2026-07-10 (eller ved større endringer i Azure ML deployment capabilities)
### Safe Rollout / Blue-Green Deployment (Azure Well-Architected 2026)
Azure ML managed online endpoints support blue-green (safe rollout) deployments natively:
```bash
# Deploy green deployment with 0% traffic initially
az ml online-deployment create --name green --endpoint my-endpoint --traffic-allocation 0
# Test green deployment in isolation (direct routing)
az ml online-endpoint invoke --name my-endpoint --deployment-name green
# Mirror 10% of live traffic to green for shadow testing
# Then progressively shift: 10% → 50% → 100%
az ml online-endpoint update --name my-endpoint --traffic blue=90 green=10
```
**Azure Well-Architected SDP principles (OE:11)**:
- **Progressive exposure**: Canary → Blue-Green → Deployment Stamps
- **Health models**: Pass health checks before each rollout phase
- **Bake time**: Hours/days between phases (not minutes) to capture time-zone usage patterns
- **Failure detection**: Automatic halt + investigation when health signals degrade
- **Recovery options**: Roll back (revert), roll forward (hotfix), or redeploy last known good
**Azure facilitation**:
- `Azure Pipelines` + `GitHub Actions` support multi-stage deployments with approval gates
- `Azure App Configuration` for feature flag management
- `Azure Load Balancers` for traffic routing and health monitoring
- Point-in-time restore available for Azure SQL, Cosmos DB, MySQL, PostgreSQL
**Emergency SDP**: Prescriptive protocols for hotfix acceleration — approval stage and bake time reduction — with explicit approval criteria.
**Safe decommissioning (new in 2026-04)**: Removing components is highest-risk. Steps: validate inactivity → preserve state (backup/export) → disable before deleting → monitor watch window covering full usage cycle → clean up residual references. Skip disable only if compliance requires immediate removal.
**AI opportunity**: AI can assist rollout tuning — analyze deployment docs, code reviews, incident history to suggest rollout strategies and parameters (low/medium GenAI approach). Advanced agentic solutions can auto-update rollout configurations.