Section 16

Cloud cheat sheet: Azure vs AWS vs GCP

The same building blocks exist on every big cloud, under different names. This page maps them side by side: a one-line definition, the current product name on each cloud, what to use it for, and what to remember about security, cost and patterns. Each category also lists the .NET 10 SDK packages for all three clouds.

Service mapping based on ByteByteGo's Compare Cloud cheat sheet (PDF). The definitions, tips and extra rows are our own, and product names were checked against official docs in October 2026. The PDF also has an Oracle Cloud column; this page covers Azure, AWS and GCP only.

16.1 How to read this cheat sheet Added

Four ideas make every row easier to read: who is responsible for what, how each cloud names its locations, how you pay, and how each cloud decides who can do what.

1. Shared responsibility

The cloud always secures the buildings, hardware and hypervisor. The more managed the service, the more the cloud takes on. You always own your data, your identities and access rules, and your configuration.

2. Regions and zones

ConceptAzureAWSGCP
Region (a metro area with several data centres)Region, e.g. australiaeast (Sydney)Region, e.g. ap-southeast-2 (Sydney)Region, e.g. australia-southeast1 (Sydney)
Zone (separate power, cooling, network)Availability zones 1, 2, 3. The numbers are logical and map differently per subscriptionAvailability Zones ap-southeast-2a/b/c. Names map per account; AZ IDs like apse2-az1 are fixedZones australia-southeast1-a/b/c
DR partner regionMany regions have a paired region (Australia East ↔ Australia Southeast). Newer regions may notNo pairs. You pick the second regionNo pairs. Dual-region and multi-region options for some services
Private network scopeVNet is regionalVPC is regional, subnets live in one AZVPC is global, subnets are regional
Australian regionsAustralia East, Southeast, Central (Canberra)Sydney, Melbourne (ap-southeast-4)Sydney, Melbourne (australia-southeast2)

3. Pricing models

ModelAzureAWSGCPRemember
On-demand (pay per second or hour, no commitment)Pay-as-you-goOn-DemandOn-demand, plus automatic sustained use discounts on some machine familiesMost expensive per hour. Fine for spiky or new workloads
Commit 1 or 3 yearsReservations, Azure savings plan for computeReserved Instances, Savings PlansCommitted use discounts (resource-based or spend-based)Big discounts for steady load. Commit only to your proven baseline
Spare capacitySpot VMsEC2 Spot InstancesSpot VMs (preemptible VMs is the older name)Up to ~90% off, but can be taken back at short notice
Bring your licencesAzure Hybrid Benefit (Windows Server, SQL Server)BYOL, often on Dedicated HostsBYOL on sole-tenant nodesLicences can be the biggest line for SQL Server workloads
Data transferData in is mostly free. Data out to the internet, between regions and (on some clouds) between zones is billed per GBEgress is the hidden cost of multi-cloud and chatty designs

4. Identity model

AspectAzureAWSGCP
Directory for peopleMicrosoft Entra IDIAM Identity Center (usually federated to your IdP)Cloud Identity or Google Workspace
Resource hierarchyManagement groups → subscriptions → resource groups → resourcesOrganizations → OUs → accounts → resourcesOrganization → folders → projects → resources
Granting accessAzure RBAC role assignment at a scopeIAM policies (identity-based and resource-based) on rolesIAM allow policy binds a principal to a role on a resource
Org guardrailsAzure PolicyService control policies (SCPs)Organization Policy
Identity for codeManaged identitiesIAM roles (instance profile, task role, EKS Pod Identity)Service accounts attached to the resource
Billing and blast-radius boundarySubscriptionAccountProject
  • Security: design zones and access first. Use at least 2 zones for production, and give code an identity instead of a password on every cloud.
  • Cost: on-demand for new or spiky load, commitments for the steady baseline, spot for work that can restart. Watch egress.
  • Pattern: map by capability, not by name. "S3 = Blob = Cloud Storage" is useful, but limits, consistency and pricing still differ.

Azure, AWS or GCP? The names change. The building blocks don't ☁️

🧩 Every cloud has compute, storage, networking, databases, messaging, AI and identity

🛡️ Shared responsibility: the more managed the service, the less you patch. Data and access are always yours

💰 On-demand for spiky load, commit for the baseline, spot for restartable work

🌏 GCP VPCs are global. Azure VNets and AWS VPCs are regional

Learn the capability first, then the three names. What surprised you most moving between clouds?

#Cloud #Azure #AWS #GoogleCloud #SolutionArchitecture

16.2 Compute: VMs, app platforms & functions Added

Where your code runs. Pick by how much of the server you want to manage, from a full VM down to a single function.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Virtual machines: a server you rent by the second. You own the OSVirtual MachinesEC2Compute EngineLift-and-shift, legacy apps, custom OS or licencesYou patch the OS · right-size, then commit · build from images, not by hand
VM autoscaling group: identical VMs that grow and shrink with loadVirtual Machine Scale SetsEC2 Auto Scaling groupsManaged instance groupsStateless web tiers, workersSpread across zones · scale on metrics
Spare-capacity VMs: deep-discount VMs the cloud can take backSpot VMsEC2 Spot InstancesSpot VMsBatch, CI runners, test, risk runsUp to ~90% off · notice: Azure ~30 s, AWS 2 min, GCP ~30 s · checkpoint work
Web app platform (PaaS): deploy code; the platform runs and patches serversApp ServiceElastic BeanstalkApp EngineWeb apps and APIs with little opsUse private endpoints and VNet integration · fewer knobs than VMs
Functions (FaaS): run a small function per event, pay per runAzure Functions (Flex Consumption plan)LambdaCloud Run functionsEvent handlers, glue code, spiky loadsCold starts and run-time limits · can cost more than containers at high, steady volume
Batch jobs: a managed queue of big parallel jobs on a VM poolAzure BatchAWS BatchBatchSimulations, rendering, overnight riskPair with spot · pay only for the VMs used

🔄 Renamed / retired (checked Oct 2026)

  • Google Cloud Functions → Cloud Run functions (August 2024). The PDF still says "Cloud Functions". (cloud.google.com)
  • Azure Functions Linux Consumption plan retires on 30 September 2028. New apps should use Flex Consumption. (learn.microsoft.com)
  • Security: give every VM, app and function a managed identity or role, and no public IP unless it really serves the internet. Use a bastion or session manager instead of open RDP/SSH.
  • Cost: right-size first, then buy reservations, savings plans or committed use discounts for the baseline. Turn dev and test off at night.
  • Pattern: prefer the most managed option that fits. Functions for events, containers for services, VMs only when you must.
  • Lock-in: plain VMs and containers move between clouds easily. Function triggers and bindings don't.
How to implement it
CloudPackagesUse them for
AzureAzure.ResourceManager.Compute + Azure.Identity; Microsoft.Azure.Functions.Worker + Microsoft.Azure.Functions.Worker.SdkManage VMs and scale sets with DefaultAzureCredential. Write isolated-worker functions. App Service needs no SDK: deploy your ASP.NET Core app as is
AWSAWSSDK.EC2; Amazon.Lambda.AspNetCoreServer.Hosting, Amazon.Lambda.AnnotationsManage instances. Run a minimal API in Lambda with AddAWSLambdaHosting; annotations generate the handler code. Credentials come from the default chain (env vars, profile or SSO, IAM role)
Google CloudGoogle.Cloud.Compute.V1; Google.Cloud.Functions.Hosting (Functions Framework for .NET)Manage VMs. Write Cloud Run functions in C#. Auth uses Application Default Credentials (ADC)
AspireAspire.Hosting.Azure.Functions, Aspire.Hosting.Azure.AppService, Aspire.Hosting.AWSModel functions and web apps in the AppHost and deploy them. The AWS integration adds CloudFormation/CDK resources and local Lambda support

Managed function runtimes can lag behind the newest .NET release. Check the supported runtime list, or ship a container image (Lambda, Container Apps and Cloud Run all accept one) to run .NET 10 today.

16.3 Containers & Kubernetes Added

Package the app and its runtime as an image, then let a managed platform run, scale and heal it. Choose serverless containers first and Kubernetes when you need its control.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Managed Kubernetes: the cloud runs the control plane; you run workloadsAKSEKSGKEMany services, platform teams, portabilityControl-plane fee on EKS, GKE and AKS Standard tier · you still own upgrades, policies and add-ons
Hands-off Kubernetes: Kubernetes API with nodes managed for youAKS AutomaticEKS Auto ModeGKE AutopilotKubernetes without node careLess node control · Autopilot bills for pod resources
Serverless containers: give it an image; it runs, scales and serves HTTPSAzure Container AppsECS on Fargate (ECS Express Mode for simple web apps)Cloud RunAPIs, workers, event consumersContainer Apps and Cloud Run can scale to zero · Fargate bills per running task
Run-to-finish containers: start, do the job, stopContainer Apps jobs, Container InstancesECS tasks on FargateCloud Run jobsDB migrations, reports, batch stepsSet timeouts and retries · secrets from the vault, not baked into the image
Container registry: private store for imagesAzure Container RegistryAmazon ECRArtifact RegistryStore and scan images near where they runPrivate endpoint · scan on push · same region as the runtime to avoid egress
Service-to-service networking: discovery, mTLS and traffic rulesIstio-based service mesh add-on for AKS; Dapr in Container AppsECS Service Connect, VPC LatticeCloud Service MeshZero-trust traffic between microservicesAdds latency and ops work · only if you need it

🔄 Renamed / retired (checked Oct 2026)

  • Google Container Registry → Artifact Registry. Container Registry shut down on 18 March 2025. (cloud.google.com)
  • Azure Spring Apps retires on 31 March 2028 and has been closed to new customers since 17 March 2025. Microsoft points to Container Apps or AKS. (learn.microsoft.com)
  • AWS App Runner is closed to new customers (from 30 April 2026). AWS recommends ECS Express Mode. (docs.aws.amazon.com)
  • AWS App Mesh was discontinued on 30 September 2026. Use ECS Service Connect or VPC Lattice. (docs.aws.amazon.com)
  • GKE Enterprise / Anthos: since September 2025, GKE is one paid offering with extra features sold as add-ons. (cloud.google.com)
  • Security: pull images only from your private registry, run as non-root, and give each workload its own identity (workload identity on AKS and GKE, EKS Pod Identity or IRSA on EKS).
  • Cost: scale-to-zero platforms (Container Apps, Cloud Run) suit low or bursty traffic. A busy Kubernetes cluster is cheaper per request but costs people time.
  • Pattern: start on serverless containers. Move to Kubernetes when you need custom networking, operators, or dozens of services under one platform team.
  • Lock-in: the image is portable; the platform config (Bicep, task definitions, Cloud Run YAML) is not. Kubernetes YAML moves best.
How to implement it
CloudPackagesUse them for
Anybuilt-in dotnet publish /t:PublishContainerBuild an OCI image from the SDK, no Dockerfile needed, and push it to any registry
AzureAzure.Containers.ContainerRegistry, Azure.ResourceManager.AppContainers, Azure.ResourceManager.ContainerServiceList and clean up images; create or update Container Apps and AKS clusters from code
AWSAWSSDK.ECS, AWSSDK.ECR, AWSSDK.EKSRun tasks, update services, manage repositories and clusters
Google CloudGoogle.Cloud.Run.V2, Google.Cloud.ArtifactRegistry.V1, Google.Cloud.Container.V1Deploy Cloud Run services and jobs, manage repositories and GKE clusters
AspireAspire.Hosting.Azure.AppContainers; Aspire.Hosting.Kubernetes previewDeploy the whole AppHost to Container Apps (with azd), or generate Kubernetes deployment files

16.4 Storage: object, block, file & archive Added

Where bytes live. Object storage for files and data lakes, block storage as a VM's disk, file shares for apps that need a drive letter, and archive for records you must keep but rarely read.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Object storage: unlimited files ("objects") in buckets over HTTPSBlob StorageS3Cloud StorageDocuments, backups, logs, static sitesBlock public access · short-lived signed URLs for sharing · lifecycle rules to cheaper tiers
Data lake storage: object storage tuned for analytics, with folders and ACLsAzure Data Lake Storage, OneLake (Fabric)S3 (+ S3 Tables, Lake Formation)Cloud Storage (+ BigLake)Raw → curated data for Spark and SQLOpen formats (Parquet, Delta, Iceberg) reduce lock-in
Block storage: a virtual disk attached to one VMManaged DisksEBSPersistent Disk, HyperdiskVM boot and data disks, databases on VMsZonal: copy snapshots to another zone or region · encrypted at rest by default
Shared file storage: a network share many servers mount (SMB/NFS)Azure Files, Azure NetApp FilesEFS (NFS), FSx (Windows, NetApp ONTAP, Lustre)Filestore, NetApp VolumesLift-and-shift apps that need a shared drivePrivate access only · some tiers bill for provisioned size, not used size
Archive: very cheap storage for data you rarely readBlob Archive tierS3 Glacier Deep ArchiveCloud Storage Archive class7-year records, compliance copiesMinimum stay 180 / 180 / 365 days · Azure and AWS reads take hours; GCP reads are instant but cost more per GB
Managed backup: policy-based backups across servicesAzure BackupAWS BackupBackup and DR ServiceVM, database and file backupsImmutable vaults in a separate subscription/account/project protect against ransomware

Corrected from the PDF: "File Storage" is Azure Files and "File Store" is Filestore. GCP block storage now includes Hyperdisk as well as Persistent Disk.

  • Security: turn off public access at the account or organisation level. Share with short-lived signed URLs: user delegation SAS · S3 presigned URLs · V4 signed URLs.
  • Cost: tiers have minimum storage days and read fees. Moving data out (egress) or reading it back from archive can cost more than storing it.
  • Pattern: keep the lake in one cloud and bring compute to the data. Copying petabytes between clouds is slow and expensive.
  • Encryption: all three encrypt at rest by default. Use customer-managed keys (Key Vault · KMS · Cloud KMS) when policy says you must control the key.
How to implement it
CloudPackagesUse them for
AzureAzure.Storage.Blobs, Azure.Storage.Files.DataLake, Azure.Storage.Files.Shares + Azure.IdentityBlobs, data lake folders and ACLs, SMB shares. Authenticate with Entra ID, not account keys
AWSAWSSDK.S3 (includes TransferUtility), AWSSDK.Extensions.NETCore.SetupUpload and download objects, multipart uploads for big files, presigned URLs. Register clients in DI
Google CloudGoogle.Cloud.Storage.V1Buckets, objects, signed URLs
AspireAspire.Hosting.Azure.Storage + Aspire.Azure.Storage.BlobsProvision storage in Azure, or run the Azurite emulator locally, and inject a ready BlobServiceClient
// Same job, three clouds: each SDK finds credentials without a key in code
// Azure: DefaultAzureCredential tries env vars, workload/managed identity, then your dev login
var blobs = new BlobServiceClient(new Uri("https://stbank.blob.core.windows.net"),
    new DefaultAzureCredential());
await blobs.GetBlobContainerClient("statements")
    .UploadBlobAsync("2026-10/acc-42.pdf", BinaryData.FromBytes(pdf));

// AWS: the default credential chain finds env vars, profile/SSO, or the IAM role
var s3 = new AmazonS3Client(RegionEndpoint.APSoutheast2);
await s3.PutObjectAsync(new PutObjectRequest
    { BucketName = "bank-statements", Key = "2026-10/acc-42.pdf", InputStream = new MemoryStream(pdf) });

// GCP: Application Default Credentials (attached service account, or gcloud login on dev)
var gcs = await StorageClient.CreateAsync();
await gcs.UploadObjectAsync("bank-statements", "2026-10/acc-42.pdf", "application/pdf", new MemoryStream(pdf));

Storing data in the cloud is cheap. Getting it back out isn't 💸

🧊 Hot → cool → cold → archive tiers cut storage cost as data ages

⏳ But every colder tier has a minimum stay (archive: 180 days on Azure and AWS, 365 on GCP)

📤 Egress and archive reads are billed per GB. A "cheap" archive can get expensive on restore day

🔐 Block public access everywhere, and share with short-lived signed URLs

Model the read path, not just the write path. How often do you really restore?

#CloudStorage #FinOps #Azure #AWS #GoogleCloud

16.5 Networking, DNS, load balancing & edge Added

How traffic reaches your app and how your services talk privately: private networks, DNS, load balancers, CDN and WAF at the edge, and links back to the data centre.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Private network: your own isolated IP space in the cloudVirtual Network (VNet)VPCVPC networkEvery workloadAzure and AWS are regional; GCP is global · plan IP ranges so they never overlap on-prem
Connect networks: join many networks into a hubVNet peering, Virtual WANVPC peering, Transit GatewayVPC Network Peering, Network Connectivity CenterHub-and-spoke landing zonesPeering is not transitive · cross-region traffic is billed
Private access to PaaS: reach a managed service on a private IPPrivate Endpoint (Private Link)PrivateLink (interface VPC endpoints)Private Service ConnectDatabases, storage, vaults with no public accessNeeds private DNS zones · charged per endpoint-hour and GB
DNS: turns names into IP addressesAzure DNS (public and private zones)Route 53Cloud DNSPublic domains, private service namesLow TTLs before migrations · health-checked failover records
Layer 4 load balancer: spreads TCP/UDP connectionsAzure Load BalancerNetwork Load BalancerNetwork Load Balancer (passthrough or proxy)Non-HTTP traffic, very high throughputNo HTTP routing or WAF
Layer 7 load balancer: routes HTTP by host and path, ends TLSApplication GatewayApplication Load BalancerApplication Load Balancer (regional)Web apps and APIs in one regionAdd WAF here or at the edge · health probes on /health
Global edge + CDN: entry point near users, with cachingAzure Front DoorCloudFront (+ Global Accelerator)Global external Application Load Balancer + Cloud CDNMulti-region apps, static contentCache to cut origin load and egress · lock origins to edge-only traffic
WAF and DDoS: block attacks before they reach the appAzure Web Application Firewall, Azure DDoS ProtectionAWS WAF, AWS ShieldCloud ArmorAny internet-facing appStart with managed OWASP rules · add rate-limit rules
Hybrid connectivity: link the cloud to your data centreVPN Gateway, ExpressRouteSite-to-Site VPN, Direct ConnectCloud VPN, Cloud InterconnectCore banking on-prem, cloud front-endsPrivate circuits for steady, high volume · two links for resilience
Network firewall: inspect and filter traffic between networksAzure FirewallAWS Network FirewallCloud Next Generation FirewallEgress control in a hubCharged per hour and per GB · central egress = one place to log

🔄 Renamed / retired (checked Oct 2026)

  • Azure CDN from Edgio shut down in January 2025. Azure Front Door (classic) retires 31 March 2027 and Azure CDN Standard from Microsoft (classic) on 30 September 2027. Move to Front Door Standard or Premium. (learn.microsoft.com)
  • Security: one public entry point (edge + WAF). Lock app origins to accept traffic only from the edge, and put databases, storage and vaults behind private endpoints.
  • Cost: NAT gateways, private endpoints, firewalls and cross-zone or cross-region traffic are charged by the hour and the GB. They add up in hub-and-spoke designs.
  • Pattern: hub-and-spoke: shared firewall, DNS and hybrid links in the hub, one spoke per app or environment.
  • GCP difference: one global VPC can span regions, and Shared VPC lets a central team own the network for many projects.
How to implement it
CloudPackagesUse them for
Anybuilt-in UseForwardedHeaders (Microsoft.AspNetCore.HttpOverrides), MapHealthChecksThe app side of every load balancer: read the real client IP and scheme, and answer health probes
AzureAzure.ResourceManager.Network, Azure.ResourceManager.Dns, Azure.ResourceManager.CdnVNets, private endpoints, DNS records. Front Door Standard/Premium is managed through the CDN resource provider
AWSAWSSDK.Route53, AWSSDK.ElasticLoadBalancingV2, AWSSDK.CloudFront, AWSSDK.WAFV2DNS records, target groups, CloudFront signed URLs (AmazonCloudFrontUrlSigner), WAF rules
Google CloudGoogle.Cloud.Compute.V1, Google.Apis.Dns.v1VPCs, firewall rules and load balancers are part of the Compute API. Cloud DNS uses the older REST-style client (no Google.Cloud.Dns library)

Behind a load balancer, only trust forwarded headers from your proxy's addresses. Otherwise anyone can fake their IP in X-Forwarded-For.

Same diagram, three clouds, one surprise 🌐

🗺️ Azure VNets and AWS VPCs are regional. A GCP VPC is global

🚪 Edge + WAF: Front Door · CloudFront + AWS WAF · Cloud CDN + Cloud Armor

🔒 Private endpoints: Private Link · PrivateLink · Private Service Connect

🔌 Back to the data centre: ExpressRoute · Direct Connect · Cloud Interconnect

One public door, everything else private. Which cloud's networking took you longest to learn?

#CloudNetworking #Azure #AWS #GoogleCloud #ZeroTrust

16.6 Databases Added

Managed databases: the cloud handles patching, backups and failover. Choose by data shape and access pattern, not by brand.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Managed SQL Server: SQL Server with patching, backups and HA handledAzure SQL Database, SQL Managed InstanceRDS for SQL ServerCloud SQL for SQL ServerExisting .NET + SQL Server appsEntra/IAM auth instead of SQL passwords · licence-included vs bring-your-own
Managed PostgreSQL / MySQL: open-source relational, managedAzure Database for PostgreSQL / MySQL (flexible server)RDS, Aurora (PostgreSQL, MySQL)Cloud SQL, AlloyDB for PostgreSQLNew OLTP appsThe most portable choice across clouds · zone-redundant HA roughly doubles compute cost
Globally distributed SQL: relational and consistent across regionsNo exact match: Cosmos DB multi-region writes, or Azure SQL geo-replicationAurora DSQL, Aurora Global DatabaseSpannerGlobal ledgers, always-on systemsCross-region writes add latency · priced for scale, not small apps
Document / key-value NoSQL: JSON items by key, scales without schema changesCosmos DBDynamoDBFirestoreProfiles, carts, sessions, cataloguesDesign the partition key for your queries first · provisioned vs on-demand capacity
Wide-column: huge sparse tables keyed by row, for massive writesManaged Instance for Apache Cassandra, Cosmos DB for Apache CassandraAmazon KeyspacesBigtableTime series, IoT, telemetryKnow your query patterns up front
In-memory cache: sub-millisecond key-value store in RAMAzure Managed RedisElastiCache (Valkey, Redis OSS, Memcached)Memorystore (Valkey, Redis)Cache-aside, sessions, rate limitsNot the source of truth · TLS + auth on

Corrected from the PDF: it maps DynamoDB and Cosmos DB to Firebase Realtime Database. For server-side apps the closer match is Firestore (documents) or Bigtable (wide-column). Realtime Database is mainly a mobile/web sync store.

🔄 Renamed / retired (checked Oct 2026)

  • Azure Database for MariaDB was retired on 19 September 2025. Use Azure Database for MySQL flexible server. (techcommunity.microsoft.com)
  • Azure Cache for Redis retires on 30 September 2028 (Enterprise tiers 31 March 2027). New caches go on Azure Managed Redis. (learn.microsoft.com)
  • Security: private endpoints only, identity-based auth (Entra ID, RDS IAM auth, Cloud SQL IAM auth), and customer-managed keys where policy requires them.
  • Cost: HA replicas, read replicas and cross-region copies each multiply cost. Serverless or on-demand modes suit spiky or dev workloads.
  • Pattern: PostgreSQL is the most portable engine. Cosmos DB, DynamoDB, Firestore and Spanner are powerful but tie your data model to one cloud.
How to implement it
CloudPackagesUse them for
AnyNpgsql + Npgsql.EntityFrameworkCore.PostgreSQL; StackExchange.RedisPostgreSQL on any cloud with EF Core 10; Redis/Valkey caches on any cloud
AzureMicrosoft.Data.SqlClient + Microsoft.EntityFrameworkCore.SqlServer; Microsoft.Azure.Cosmos; Microsoft.Azure.StackExchangeRedisAzure SQL with Authentication=Active Directory Default (no password); Cosmos DB; Entra auth for Azure Managed Redis
AWSAWSSDK.RDS; AWSSDK.DynamoDBv2RDSAuthTokenGenerator creates short-lived IAM tokens for RDS/Aurora; DynamoDBContext maps items to C# classes
Google CloudGoogle.Cloud.Firestore, Google.Cloud.Spanner.Data, Google.Cloud.Bigtable.V2Firestore documents, Spanner through ADO.NET, Bigtable rows. For Cloud SQL use Npgsql/SqlClient over private IP or the Cloud SQL Auth Proxy
AspireAspire.Hosting.Azure.Sql, Aspire.Hosting.Azure.PostgreSQL, Aspire.Hosting.Azure.CosmosDB, Aspire.Hosting.Azure.RedisProvision in Azure or run containers/emulators locally, with connection strings injected

16.7 Analytics, big data & data integration Added

Move data from operational systems into a lake and a warehouse, process it in batch or as a stream, and serve it to dashboards and models.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Data warehouse: columnar SQL store for big analytical queriesMicrosoft Fabric Data Warehouse (Synapse dedicated pools still run)Redshift (incl. Serverless)BigQueryBI, finance and risk reportingPartition and cluster big tables · serverless modes bill per query or compute used
SQL over lake files: query files in object storage, no load stepFabric lakehouse SQL endpoint, Synapse serverless SQLAthenaBigQuery external tables, BigLakeAd-hoc questions on raw dataOften billed per data scanned: use Parquet + partitions
Spark / Hadoop: managed clusters for big batch and ML data jobsAzure Databricks, Fabric Spark, HDInsightEMR (incl. EMR Serverless)Managed Service for Apache SparkLarge ETL, feature engineeringUse serverless or auto-terminate · idle clusters burn money
Stream ingestion: durable, ordered log for high-volume eventsEvent Hubs (Kafka-compatible)Kinesis Data Streams, Amazon MSKPub/Sub, Managed Service for Apache KafkaClickstreams, card transactions, IoTPartition by key to keep order · retention = how far back you can replay
Stream processing: windows and aggregates on data in motionStream Analytics, Fabric Real-Time IntelligenceManaged Service for Apache FlinkDataflow (Apache Beam)Fraud signals, live dashboardsPlan for late and duplicate events
ETL / data integration: pipelines that copy and transform dataAzure Data Factory, Data Factory in FabricAWS GlueCloud Data Fusion, DataflowNightly loads, SaaS → lakeUse private runtimes for on-prem sources (self-hosted integration runtime, Glue connections)
BI dashboards: self-service charts on top of the dataPower BIAmazon Quick SightLookerExec and ops reportingRow-level security for customer data

Corrected from the PDF: it puts Kinesis, "Streaming Analytics" and Dataflow in one row. Ingestion (Kinesis Data Streams · Event Hubs · Pub/Sub) and processing (Managed Service for Apache Flink · Stream Analytics · Dataflow) are separate jobs, so they get separate rows here.

🔄 Renamed / retired (checked Oct 2026)

  • Dataproc → Managed Service for Apache Spark (both the cluster and serverless options). The API is still called Dataproc. (docs.cloud.google.com)
  • Kinesis Data Analytics → Amazon Managed Service for Apache Flink. (aws.amazon.com)
  • Azure Synapse Analytics is not retired, but Microsoft steers new work to Microsoft Fabric and offers a Synapse-to-Fabric migration assistant. HDInsight 4.0 and 5.0 retired in March 2025; 5.1 is current. (azure.microsoft.com, learn.microsoft.com)
  • Amazon QuickSight is now Amazon Quick Sight, part of Amazon Quick. Existing APIs still work. (docs.aws.amazon.com)
  • Security: mask or tokenise card numbers before they reach the lake, and use column- and row-level security in the warehouse. Keep the lake private.
  • Cost: scan-based pricing punishes SELECT *. Partition, cluster, and set budgets or quotas per team.
  • Pattern: medallion layers (bronze → silver → gold) in open table formats keep you portable between Databricks, Fabric, EMR and BigQuery.
How to implement it
CloudPackagesUse them for
AzureAzure.Messaging.EventHubs + Azure.Messaging.EventHubs.Processor; Azure.ResourceManager.DataFactory; Microsoft.Data.SqlClientPublish and consume streams; trigger pipelines; query Fabric Warehouse and Synapse SQL endpoints over TDS
AWSAWSSDK.Kinesis, AWSSDK.Athena, AWSSDK.RedshiftDataAPIService, AWSSDK.Glue, AWSSDK.ElasticMapReducePut records, run Athena and Redshift queries over HTTPS (no drivers), start Glue jobs and EMR steps
Google CloudGoogle.Cloud.BigQuery.V2 (+ Google.Cloud.BigQuery.Storage.V1), Google.Cloud.PubSub.V1, Google.Cloud.Dataproc.V1Query and load BigQuery, fast bulk reads, publish events, submit Spark jobs

Spark jobs are normally written in Python, Scala or SQL. .NET for Apache Spark is no longer maintained, so .NET apps usually produce the events and query the results.

16.8 Messaging, events & workflows Added

Let services talk without waiting on each other: queues for work, topics for fan-out, event routers for "something happened", and workflow engines for multi-step processes. Section 10 covers the patterns.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Simple queue: a durable list of jobs; each message goes to one workerQueue StorageSQSCloud Tasks (or a Pub/Sub pull subscription)Background jobs, load levellingAt-least-once: make workers idempotent · cheap per million messages
Enterprise broker: queues + topics with sessions, transactions, DLQService BusSQS FIFO + SNS, or Amazon MQ (ActiveMQ, RabbitMQ)Pub/Sub (ordering keys, dead-letter topics)Payments, ordered workflows, JMS/AMQP appsService Bus has no exact twin · check ordering and transaction needs
Pub/sub fan-out: one message, many subscribersService Bus topics, Event GridSNSPub/SubNotify fraud, CRM and analytics at onceFilter at the subscription to cut cost and noise
Event router: routes cloud, SaaS and custom events by rulesEvent GridEventBridgeEventarc"Blob uploaded", "order placed" triggersCloudEvents format · keep events small, fetch details by id
Workflow orchestration: run multi-step processes with retries and stateLogic Apps, Durable FunctionsStep FunctionsWorkflowsOnboarding, loan approval, sagasBilled per step or transition · keep loops tight
Mobile push: send notifications to phonesNotification HubsAWS End User Messaging (push), SNS mobile pushFirebase Cloud MessagingTransaction alertsNever put sensitive data in the push text

Corrected from the PDF: it lines up SNS, Service Bus and Firebase Cloud Messaging, and SQS, Storage Queues and Pub/Sub. FCM is mobile push, and Pub/Sub is a pub/sub service. The closest GCP match for a plain work queue is Cloud Tasks or a Pub/Sub pull subscription.

🔄 Renamed / retired (checked Oct 2026)

  • Amazon Pinpoint reaches end of support on 30 October 2026. Its SMS, voice and push APIs live on as AWS End User Messaging; email moves to Amazon SES. (docs.aws.amazon.com)
  • Security: send and receive with identities and least-privilege roles (e.g. "Service Bus Data Sender"), not connection strings or shared keys. Private endpoints for brokers.
  • Cost: mostly per message or operation. Batching, long polling and subscription filters cut the bill.
  • Pattern: queue for commands, topic for events, workflow engine when a process has many steps and compensations. Always add a DLQ and an alert on it.
  • Portability: Kafka (Event Hubs Kafka endpoint, MSK, Managed Service for Apache Kafka) and CloudEvents travel between clouds best.
How to implement it
CloudPackagesUse them for
AzureAzure.Messaging.ServiceBus, Azure.Storage.Queues, Azure.Messaging.EventGrid; Microsoft.Azure.Functions.Worker.Extensions.ServiceBusSend and process messages and sessions; simple queues; publish events; Service Bus triggers in Functions
AWSAWSSDK.SQS, AWSSDK.SimpleNotificationService, AWSSDK.EventBridge, AWSSDK.StepFunctions; AWS.MessagingRaw SDKs per service, or the AWS Message Processing Framework for .NET: typed publishers and handlers over SQS, SNS and EventBridge
Google CloudGoogle.Cloud.PubSub.V1, Google.Cloud.Tasks.V2, Google.Cloud.Workflows.Executions.V1PublisherClient / SubscriberClient with batching and flow control; task queues; start workflow runs
PortableCloudNative.CloudEvents; Aspire.Hosting.Azure.ServiceBusOne event envelope that Event Grid and Eventarc both understand; Service Bus emulator for local dev

16.9 AI & machine learning Added

Train and serve your own models, call hosted foundation models, run agents, and add prebuilt AI (documents, speech, vision) through an API. This category changes names the fastest.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
ML platform: train, track, deploy and monitor your own modelsAzure Machine LearningAmazon SageMaker AIGemini Enterprise Agent Platform (formerly Vertex AI)Credit scoring, churn, custom modelsGPU quota and idle endpoints drive cost · register models with lineage
Foundation models API: call hosted LLMs and embeddingsMicrosoft Foundry Models (incl. Azure OpenAI)Amazon BedrockGemini Enterprise Agent Platform (Model Garden, Gemini)Chat, summarising, extraction, RAGPay per token or reserved throughput · check data residency per model
Agent runtime: host agents with tools, memory and tracingFoundry Agent ServiceAmazon Bedrock AgentCoreAgent Runtime on Agent PlatformAssistants that call APIsLeast-privilege tool access · human approval for money movement
Search / retrieval for RAG: hybrid keyword + vector search over your contentAzure AI Search (Foundry IQ)Bedrock Knowledge Bases, OpenSearch ServiceAgent Search, Vector SearchPolicy and product Q&A with citationsIndex only what users may see · security trimming per user
Prebuilt AI: ready APIs for documents, speech and imagesFoundry Tools: Document Intelligence, Speech, Vision, LanguageTextract, Transcribe, Rekognition, ComprehendDocument AI, Speech-to-Text, Vision APIKYC documents, call transcriptsPer page/minute pricing · PII handling and retention settings
Safety guardrails: filter harmful prompts and outputs, block jailbreaksAzure AI Content SafetyAmazon Bedrock GuardrailsModel ArmorAny customer-facing GenAICheck both input and output · log blocked attempts

🔄 Renamed / retired (checked Oct 2026)

  • Azure AI Studio / Azure AI Foundry → Microsoft Foundry. Azure AI services (Cognitive Services) → Foundry Tools. Azure OpenAI is now "Azure OpenAI in Foundry Models". The PDF's "Machine Learning" is Azure Machine Learning. (learn.microsoft.com, azure.microsoft.com)
  • Vertex AI → Gemini Enterprise Agent Platform ("Agent Platform"). Vertex AI Search → Agent Search; Agent Engine → Agent Runtime. Existing workloads keep working. (docs.cloud.google.com)
  • SageMaker → Amazon SageMaker AI for the ML service; "Amazon SageMaker" is now the wider data and AI platform.
  • Security: keyless auth, private endpoints to model and search services, and confirm the provider doesn't train on your prompts (all three state this for their enterprise APIs; check your contract).
  • Cost: tokens are the new egress. Cache answers, trim context, route easy questions to smaller models, and set budgets per app.
  • Pattern: put a thin abstraction (IChatClient) between your code and the model so you can switch models or clouds. Evaluate before you switch.
  • Residency: not every model is offered in Australian regions. Check per model, and whether "global" deployments may process data offshore.
How to implement it
CloudPackagesUse them for
AnyMicrosoft.Extensions.AI; Microsoft.Agents.AI (Microsoft Agent Framework)One IChatClient / embedding interface over any provider; build agents and workflows on top
AzureAzure.AI.Projects; OpenAI + Microsoft.Extensions.AI.OpenAI; Azure.Search.Documents; Azure.AI.DocumentIntelligenceFoundry projects and agents; call Foundry's OpenAI-compatible v1 endpoint with the official OpenAI library; RAG retrieval; document extraction
AWSAWSSDK.BedrockRuntime, AWSSDK.BedrockAgentRuntime, AWS.Bedrock.MEAI; AWSSDK.SageMakerRuntime, AWSSDK.TextractBedrock Converse API, knowledge bases and agents, IChatClient for Bedrock; call SageMaker endpoints; extract documents
Google CloudGoogle.GenAI, Google.Cloud.AIPlatform.V1, Google.Cloud.DocumentAI.V1Gemini through the Google Gen AI SDK; manage endpoints and predictions on Agent Platform; Document AI processors
AspireAspire.Hosting.Foundry previewProvision Foundry model deployments from the AppHost

AWSSDK.Extensions.Bedrock.MEAI is deprecated on nuget.org in favour of AWS.Bedrock.MEAI.

Your cloud AI vocabulary is probably out of date 🤖

🔷 Azure AI Foundry → Microsoft Foundry. Azure AI services → Foundry Tools

🟢 Vertex AI → Gemini Enterprise Agent Platform

🟠 SageMaker → SageMaker AI; Bedrock now has AgentCore for agents

🧱 The pattern hasn't changed: identity → retrieve → guardrail → model → guardrail

Learn the pattern, keep a thin IChatClient layer, and the renames stop hurting. Which rename confused you most?

#GenAI #Azure #AWS #GoogleCloud #dotnet

16.10 Identity, keys & security Added

Who can do what, how code proves who it is without passwords, where keys and secrets live, and how you spot threats and audit changes.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Workforce identity: staff sign-in, SSO, MFAMicrosoft Entra IDIAM Identity CenterCloud Identity, Google WorkspaceConsole and app SSO for staffPhishing-resistant MFA · no long-lived user access keys
Resource permissions: which identity may do which action on which resourceAzure RBACAWS IAM (policies, roles)Cloud IAM (roles, allow policies)Least-privilege accessGrant to groups at the narrowest scope · review regularly
Workload identity: code gets credentials from the platform, no secretManaged identitiesIAM roles (instance profile, task role, EKS Pod Identity)Attached service accountsApps calling cloud APIsRemoves the #1 leak: secrets in config
External federation: CI or other clouds swap an OIDC token for cloud accessWorkload identity federationIAM OIDC providers (AssumeRoleWithWebIdentity), IAM Roles AnywhereWorkload Identity FederationGitHub Actions, cross-cloud callsPin to repo, branch and environment claims
Customer identity (CIAM): sign-up and sign-in for your customersMicrosoft Entra External IDAmazon CognitoIdentity PlatformBanking app loginsPriced per monthly active user · add bot and fraud checks
Key management (KMS/HSM): create and use encryption keysKey Vault, Managed HSMAWS KMS, CloudHSMCloud KMS, Cloud HSMCustomer-managed keys, signingKeys never leave the service · separate key admins from data admins
Secrets store: keep passwords, API keys and connection stringsKey Vault (secrets)Secrets Manager (or SSM Parameter Store)Secret ManagerThird-party API keysRotate automatically · cache in the app
Certificates: issue and renew TLS certificatesKey Vault certificates, App Service managed certificatesAWS Certificate ManagerCertificate ManagerHTTPS on custom domainsAutomate renewal · alert before expiry
Posture and threat detection: find misconfigurations and attacksMicrosoft Defender for CloudSecurity Hub, GuardDutySecurity Command CenterContinuous compliance (CIS, APRA CPS 234 evidence)Turn on org-wide · route findings to the SOC/SIEM
Audit log: who changed what, and whenActivity Log (+ Entra audit logs)CloudTrailCloud Audit LogsInvestigations, complianceShip to a separate, locked-down log account

Corrected from the PDF: it maps AWS IAM to Azure Active Directory and GCP Cloud Identity. Azure AD is now Microsoft Entra ID, and those are directories for people. The permission systems are Azure RBAC, AWS IAM and Cloud IAM.

🔄 Renamed / retired (checked Oct 2026)

  • Azure Active Directory → Microsoft Entra ID (2023).
  • Azure AD B2C has not been sold to new customers since 1 May 2025 (supported until at least May 2030). New customer-identity projects use Microsoft Entra External ID. (learn.microsoft.com)
  • Security: identities for code everywhere (managed identity, IAM role, service account), OIDC federation for CI, and no long-lived access keys. Break-glass accounts are monitored.
  • Cost: KMS and secret stores charge per key and per 10,000 operations. Cache secrets in the app, and use envelope encryption (data keys) for bulk data.
  • Pattern: one identity provider for people (often Entra ID), federated into AWS and GCP. Each cloud keeps its own permission model.
  • Guardrails: org-level policies (Azure Policy · SCPs · Organization Policy) stop public buckets and unapproved regions before anyone can create them.
How to implement it
CloudPackagesUse them for
AzureAzure.Identity, Azure.Security.KeyVault.Secrets, Azure.Security.KeyVault.Keys, Azure.Extensions.AspNetCore.Configuration.Secrets, Microsoft.Identity.WebCredentials (DefaultAzureCredential, ManagedIdentityCredential); secrets and keys; Key Vault as an IConfiguration source; protect APIs with Entra ID
AWSAWSSDK.SecretsManager, AWSSDK.KeyManagementService, AWSSDK.SecurityToken, Amazon.Extensions.Configuration.SystemsManagerSecrets, KMS encrypt/decrypt and data keys, assume roles, Parameter Store as config. Credentials from the default chain
Google CloudGoogle.Cloud.SecretManager.V1, Google.Cloud.Kms.V1, Google.Apis.Auth, Google.Cloud.Iam.Credentials.V1Secrets, keys, Application Default Credentials and ID tokens, service account impersonation
// Read one secret on each cloud, with no password in code or config
// Azure Key Vault
var kv = new SecretClient(new Uri("https://kv-bank.vault.azure.net/"), new DefaultAzureCredential());
string azurePwd = (await kv.GetSecretAsync("db-password")).Value.Value;

// AWS Secrets Manager (credentials from the IAM role via the default chain)
using var sm = new AmazonSecretsManagerClient();
var resp = await sm.GetSecretValueAsync(new GetSecretValueRequest { SecretId = "db-password" });
string awsPwd = resp.SecretString;

// Google Secret Manager (Application Default Credentials)
var gsm = await SecretManagerServiceClient.CreateAsync();
var ver = await gsm.AccessSecretVersionAsync(new SecretVersionName("bank-prod", "db-password", "latest"));
string gcpPwd = ver.Payload.Data.ToStringUtf8();

DefaultAzureCredential is great in development. In production, Microsoft recommends a specific credential (for example ManagedIdentityCredential) so the app can't silently pick up the wrong identity.

The most common cloud breach isn't a hack. It's a leaked key 🔑

🪪 Give code an identity: managed identity · IAM role · service account

🤝 Let CI log in with OIDC federation, not stored access keys

🗝️ Keep the few real secrets in Key Vault · Secrets Manager · Secret Manager, and rotate them

📜 Send audit logs to a separate, locked-down account

If a secret isn't stored anywhere, it can't leak. How many long-lived keys are left in your estate?

#CloudSecurity #IAM #ZeroTrust #Azure #AWS

16.11 Monitoring, management & infrastructure as code Added

See what's happening (metrics, logs, traces, alerts), build environments from code, enforce rules, and keep the bill under control.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Metrics and alerts: numbers over time, with rules that page someoneAzure MonitorCloudWatchCloud MonitoringSLO dashboards, on-call alertsAlert on symptoms (errors, latency), not every CPU blip
Logs: searchable records from apps and platformLog Analytics (KQL)CloudWatch Logs (Logs Insights)Cloud Logging (Log Analytics)Troubleshooting, auditIngestion is the big cost: sample, filter, set retention · never log PII or card data
Tracing / APM: follow one request across servicesApplication InsightsX-Ray, CloudWatch Application SignalsCloud TraceFinding the slow hopOpenTelemetry works with all three
Native infrastructure as code: describe resources in files, deploy repeatablyBicep, ARM templatesCloudFormation, AWS CDKInfrastructure Manager (managed Terraform)Every environmentTerraform/OpenTofu work on all three · review the plan/what-if before apply
Policy guardrails: block or flag non-compliant resourcesAzure PolicyAWS Config rules, SCPsOrganization PolicyAllowed regions, no public IPs, tagsStart in audit mode, then deny
Cost management: see, allocate and cap spendMicrosoft Cost Management, budgetsCost Explorer, AWS BudgetsCloud Billing reports, budgetsShowback per team, anomaly alertsTag everything (owner, cost centre, env)
Advisor: recommendations for cost, security and reliabilityAzure AdvisorTrusted AdvisorActive Assist (Recommender)Quick wins, idle resourcesReview monthly

Corrected from the PDF: its "Resource Manager" (Azure) is the control plane that every tool talks to; the templates you write are Bicep / ARM. Its GCP entry, Deployment Manager, has been retired (below).

🔄 Renamed / retired (checked Oct 2026)

  • Google Cloud Deployment Manager reached end of support on 31 March 2026; new users are blocked and it shuts down after 30 June 2027. Use Infrastructure Manager (Terraform) or Terraform directly. (docs.cloud.google.com)
  • Azure.Monitor.Query is deprecated on nuget.org; use Azure.Monitor.Query.Logs for log queries.
  • Security: send logs to a central, write-once store owned by security. Limit who can delete logs or change alerts.
  • Cost: log ingestion and retention often beat compute on the bill. Use basic/cheaper log tiers for noisy logs and keep debug logging off in production.
  • Pattern: instrument with OpenTelemetry once, export to any backend. Everything in IaC, deployed from a pipeline, with policy checks before apply.
How to implement it
CloudPackagesUse them for
AnyOpenTelemetry.Extensions.Hosting + OpenTelemetry.Exporter.OpenTelemetryProtocolTraces, metrics and logs via OTLP to any backend or collector
AzureAzure.Monitor.OpenTelemetry.AspNetCore, Azure.Monitor.Query.Logs, Azure.ProvisioningUseAzureMonitor() sends OpenTelemetry to Application Insights; run KQL from code; describe resources in C# and emit Bicep
AWSOpenTelemetry.Instrumentation.AWS, AWS.Distro.OpenTelemetry.AutoInstrumentation, AWSSDK.CloudWatch, AWS.Logger.AspNetCore, Amazon.CDK.LibTrace AWS SDK calls; zero-code instrumentation; custom metrics; logs to CloudWatch; AWS CDK infrastructure in C#
Google CloudGoogle.Cloud.Diagnostics.AspNetCore3, Google.Cloud.Logging.Console, Google.Cloud.Monitoring.V3Logging, tracing and error reporting; structured JSON console logs that Cloud Run and GKE pick up; custom metrics

16.12 DevOps & developer tools Added

Where code lives, how it's built and tested, where packages and images are stored, and how releases reach production. Many teams use GitHub on every cloud; these are the native options. Section 15 covers the practices.

Capability (online definition)AzureAWSGCPUse it forRemember (security · cost · pattern)
Git repositories: hosted source control with pull requestsAzure Repos (Azure DevOps), GitHubCodeCommitSecure Source ManagerSource code, IaCBranch protection + required reviews · secret scanning
CI build: build and test on every changeAzure Pipelines, GitHub ActionsCodeBuildCloud BuildBuild, test, image creationBilled per build minute · cache NuGet packages
CD / release: promote builds through environments with approvalsAzure Pipelines environments, GitHub environmentsCodePipeline, CodeDeployCloud DeployStaged rollouts, canary, blue-greenSame artifact in every stage · automated rollback
Package registry: private NuGet/npm/Maven feedsAzure ArtifactsCodeArtifactArtifact RegistryInternal libraries, upstream cachingProxy public feeds to block typo-squatting

🔄 Renamed / retired (checked Oct 2026)

  • AWS CodeCommit closed to new customers in July 2024, then returned to full general availability on 24 November 2025. It is open to new customers again. (aws.amazon.com, docs.aws.amazon.com)
  • Google Cloud Source Repositories has not been available to new customers since 17 June 2024. Google points to Secure Source Manager. (docs.cloud.google.com)
  • Security: pipelines log in to clouds with OIDC federation (no stored keys), run on least-privilege identities, and sign what they publish.
  • Cost: hosted build minutes add up. Cache dependencies, run only affected tests on PRs, and use spot-backed self-hosted runners for heavy builds.
  • Pattern: one CI/CD tool for all clouds (often GitHub Actions or Azure Pipelines) beats three native ones. Keep native registries close to each runtime.
How to implement it
CloudPackagesUse them for
Anybuilt-in dotnet test, dotnet publish /t:PublishContainerTest and build images the same way in every pipeline
AzureMicrosoft.TeamFoundationServer.ClientAzure DevOps REST client: query builds, work items and pull requests from tools
AWSAWSSDK.CodeBuild, AWSSDK.CodePipeline, AWSSDK.CodeCommitStart builds, check pipeline state, manage repositories
Google CloudGoogle.Cloud.CloudBuild.V1, Google.Cloud.Deploy.V1, Google.Cloud.ArtifactRegistry.V1Trigger builds, create releases and rollouts, manage repositories

16.13 Choosing a cloud (or multi-cloud) Added

Most organisations pick one primary cloud, add a second for specific strengths or regulation, and keep some systems on-prem. Choose on skills, services, compliance and commercials, then build a landing zone before the first workload.

Decision factors

🧑‍💻 Skills & ecosystem

A Microsoft shop (.NET, Microsoft 365, Entra ID) often lands on Azure. All three run .NET 10 well, so skills matter more than language.

🌏 Regions & residency

All three have Sydney and Melbourne regions; Azure also has Canberra. Check that every service you need exists in-region.

🧩 Key services

Pick on the services that set you apart (data, AI, mainframe integration). Commodity compute and storage are similar everywhere.

🛡️ Compliance

Check IRAP assessments for the services you'll use. Banks must meet APRA CPS 234 (information security) and CPS 230 (operational risk, material service providers).

💰 Commercials

Enterprise commit discounts, credits, support plans and licence reuse (Azure Hybrid Benefit for Windows Server and SQL Server).

🚪 Exit & lock-in

Data gravity and egress fees are the real lock-in. Containers, PostgreSQL, Kafka, OpenTelemetry and Terraform keep options open.

Landing zones: the foundation before workloads

AzureAWSGCP
OfferingAzure landing zones (Cloud Adoption Framework)AWS Control Tower (+ Landing Zone Accelerator on AWS)Landing zone design guidance + enterprise foundations blueprint (Terraform)
StructureManagement groups; platform subscriptions (identity, management, connectivity) + one subscription per app landing zoneOrganizations OUs; log archive and audit accounts + one account per workload and environmentOrganization → folders → projects; Shared VPC host projects
GuardrailsAzure Policy initiativesControl Tower controls, SCPsOrganization Policy constraints
Network hubHub-and-spoke VNets or Virtual WANTransit GatewayShared VPC, Network Connectivity Center
Vending new environmentsSubscription vending (Bicep/Terraform modules)Account Factory (Account Factory for Terraform)Project factory (Terraform)

Multi-cloud vs hybrid

☁️☁️ Multi-cloud

  • + Best service per job, negotiating leverage, meets "no single provider" concentration concerns
  • − Double the skills, tooling and security baselines; egress between clouds
  • Tip: split by workload, not by tier. Avoid one app straddling two clouds

🏢☁️ Hybrid

  • + Keep mainframes, low-latency or data-sovereign systems on-prem while modernising the rest
  • − You still run hardware; private links and consistent ops needed
  • Tip: manage both from one control plane (below)
NeedAzureAWSGCP
Manage servers and Kubernetes anywhere from the cloudAzure ArcEKS Hybrid Nodes, Systems Manager hybrid nodesGKE attached clusters and fleets (the former Anthos features, now part of GKE)
Cloud-run hardware in your data centreAzure Local (formerly Azure Stack HCI)AWS OutpostsGoogle Distributed Cloud (connected or air-gapped)
Run the cloud's Kubernetes on your own hardwareAKS enabled by Azure ArcEKS AnywhereGoogle Distributed Cloud
  • Security: one identity provider for people, one baseline of guardrails per cloud, and central logging before any production workload.
  • Cost: multi-cloud splits your commit discounts and adds egress. Have a clear reason (a service, a regulator, an exit plan) for each extra cloud.
  • Pattern: landing zone first, workloads second. Retrofitting networking and policy later costs far more.
  • Exit plan: regulators expect one for material providers. Portable tech (containers, PostgreSQL, Terraform) makes it believable.

"We're going multi-cloud" is a strategy only if you can say why 🧭

🎯 Good reasons: a service you can't get elsewhere, a regulatory concentration concern, a real exit plan

💸 Hidden costs: double skills, double guardrails, split discounts, egress between clouds

🏗️ Landing zone first: Azure landing zones · AWS Control Tower · Google Cloud enterprise foundations

🏢 Hybrid tools: Azure Arc · AWS Outposts / EKS Anywhere · Google Distributed Cloud

Split by workload, not by tier. Is your organisation multi-cloud by design or by accident?

#MultiCloud #CloudStrategy #Azure #AWS #GoogleCloud

16.14 FinOps and cloud cost optimisation Added

FinOps makes engineering, finance and product share ownership of cloud spend, so cost becomes an engineering metric measured per unit of business value.

How it works

LeverWhat to doWatch out
TaggingRequired tags: owner, cost centre, app, env. Enforce with policyShared costs need a split rule
Showback / chargebackShowback reports cost to teams; chargeback bills it to their budgetStart with showback
Unit economicsCost ÷ business volume, e.g. cost per 1,000 paymentsThe trend matters more than the number
RightsizingMatch size to real p95 use; delete idle resourcesCheck memory, not just CPU
Autoscaling, scale to zeroScale on demand; serverless and container apps scale to zero; dev off at nightCold starts
CommitmentsAzure Reservations, savings plan for compute · AWS Savings Plans, RIs · GCP CUDsCommit only to the proven baseline, after rightsizing
SpotAzure Spot VMs · EC2 Spot · GCP Spot VMsCan be reclaimed: restartable work only
Storage tieringHot → cool/cold → archive with lifecycle rulesMinimum days and retrieval fees
EgressKeep compute next to data; cache at the edge; avoid chatty cross-region callsInternet, cross-region and (on AWS) cross-zone traffic is billed per GB
Budgets, anomaliesAlerts at % of budget and on forecast; anomaly detectionBudgets alert; they don't stop spend unless you automate it

Order of attack

Delete idle
→
Rightsize
→
Scale & schedule
→
Commit baseline
→
Spot for burst

Native cost tools (checked Oct 2026)

NeedAzureAWSGCP
Explore costsMicrosoft Cost Management (cost analysis)AWS Cost ExplorerCloud Billing reports
BudgetsCost Management budgetsAWS BudgetsCloud Billing budgets and alerts
AnomaliesCost anomaly alertsAWS Cost Anomaly DetectionCost anomaly detection
RecommendationsAzure AdvisorCost Optimization HubRecommender (Active Assist)
Raw exportCost Management exports (incl. FOCUS)Data Exports (CUR 2.0, FOCUS)Billing export to BigQuery

FOCUS (FinOps Open Cost and Usage Specification) is one schema for billing data from every cloud, so multi-cloud showback doesn't need custom mapping.

Trade-offs

ChoiceGainCost
Chargeback over showbackStrong ownershipDisputes over shared costs
3-year commitmentDeepest discountLock-in if the design changes
SpotCheapest computeEvictions; needs checkpointing
Scale to zeroPay nothing when idleCold-start latency
Archive tierCheapest storageHours to read, early-delete fees
  • FinOps is a loop: Inform → Optimise → Operate, owned by engineering, finance and product together.
  • No tags, no allocation. No allocation, no accountability.
  • Report unit cost (per payment, per customer), not just the total bill.
  • Rightsize first, then commit to the steady baseline; spot only for restartable work.
  • Egress and log ingestion are the hidden costs. Design data placement early.
How to implement it
CloudPackagesUse them for
AzureAzure.ResourceManager.CostManagement (1.0.x), Azure.IdentityQuery cost by tag or service; budgets, exports, alerts
AWSAWSSDK.CostExplorer, AWSSDK.BudgetsCost and usage queries, forecasts; create budgets
Google CloudGoogle.Cloud.Billing.Budgets.V1Manage budgets; query costs via the BigQuery billing export
Anybuilt-in System.Diagnostics.Metrics + OpenTelemetryCount business units (payments) so cost ÷ volume becomes a dashboard
// Month-to-date actual cost per "app" tag, for a showback report
var arm = new ArmClient(new DefaultAzureCredential());   // needs Cost Management Reader
var scope = new ResourceIdentifier($"/subscriptions/{subscriptionId}");

var dataset = new QueryDataset();
dataset.Aggregation["totalCost"] = new QueryAggregation("PreTaxCost", FunctionType.Sum);
dataset.Grouping.Add(new QueryGrouping(QueryColumnType.TagKey, "app"));

var query = new QueryDefinition(ExportType.ActualCost, TimeframeType.MonthToDate, dataset);
QueryResult result = (await arm.UsageQueryAsync(scope, query)).Value;

// Column names are in result.Columns; divide by payments processed for unit cost
foreach (var row in result.Rows)
    Console.WriteLine(string.Join(" | ", row));

Cost data lags by hours (often up to a day), so use it for daily reports and alerts, not real-time decisions. Query rates are throttled (HTTP 429): cache results.

The cloud bill isn't a finance problem. It's a design problem 💸

🏷️ Tag everything: no tags, no ownership

📊 Track cost per payment or per customer, not just the total

✂️ Delete idle, rightsize, then commit to the baseline

🎲 Spot for restartable work; scale to zero for quiet services

🌐 Egress is the hidden tax: keep compute next to data

Does your team know its cost per transaction?

#FinOps #CloudCost #Azure #AWS #GoogleCloud

⚡ Quick-fire Q&A

What's the biggest networking difference between the three clouds?

A GCP VPC is global, with regional subnets, so one network can span regions. Azure VNets and AWS VPCs are regional, so multi-region designs need peering or a hub (Virtual WAN, Transit Gateway).

How does an app call cloud APIs without storing a secret?

It uses the platform's workload identity: a managed identity on Azure, an IAM role on AWS, an attached service account on GCP. The SDK gets a short-lived token from a local endpoint. CI systems use OIDC federation the same way.

Reservations vs savings plans vs committed use discounts?

All trade a 1- or 3-year commitment for a lower price. Reservations and resource-based CUDs lock to a resource type and region. Savings plans and spend-based CUDs commit to an hourly spend and are more flexible. Commit only to your proven steady baseline.

What is the AWS or GCP equivalent of Azure Service Bus?

There is no exact twin. On AWS: SQS (FIFO for ordering) plus SNS for topics, or Amazon MQ if you need AMQP/JMS. On GCP: Pub/Sub with ordering keys and dead-letter topics, or Cloud Tasks for simple work queues. Check sessions, transactions and ordering needs.

Which old service names should you stop using in interviews?

Azure AD (now Microsoft Entra ID), Azure Cognitive Services (Foundry Tools), Azure AI Foundry (Microsoft Foundry), Vertex AI (Gemini Enterprise Agent Platform), Cloud Functions (Cloud Run functions), Container Registry (Artifact Registry), Dataproc (Managed Service for Apache Spark) and Deployment Manager (retired; use Infrastructure Manager or Terraform).

Why is egress so important in multi-cloud designs?

Data going into a cloud is mostly free, but data leaving it is billed per GB. An app in one cloud that reads a database in another pays on every call and adds latency. Keep each workload and its data in the same cloud and region.

What is FinOps, and where do you start?

A practice where engineering, finance and product share ownership of cloud spend, run as a loop: Inform (tag, allocate, show unit cost), Optimise (delete idle, rightsize, commit to the baseline, spot, storage tiers) and Operate (budgets, anomaly alerts, policy, regular reviews). Start with tagging and showback: you can't optimise what nobody owns.

Showback vs chargeback?

Showback reports each team's cloud cost to them for awareness. Chargeback actually bills that cost to the team's budget. Chargeback drives stronger ownership but needs trusted tagging and agreed rules for shared costs, so most organisations start with showback.

← 15 · DevOps & Observability