Cloud platforms

AWS, Azure and Google Cloud, building block by building block

The three big clouds, Amazon Web Services (AWS), Microsoft Azure and Google Cloud, solve the same problems with different names and a few real differences. This page maps their networks, security rules, load balancers, private access, identity and hybrid links side by side, and shows how a packet really moves through each one.

  • Regions and zones
  • VPC and VNet
  • Security groups
  • NAT
  • Load balancers
  • Private endpoints
  • Hybrid links
  • IAM
AWS, Azure and Google Cloud side by side Three cloud networks sit side by side. In each one, traffic from the internet arrives at a load balancer and passes to a virtual machine, and traffic from an on premises data centre arrives over a private connection: Direct Connect, ExpressRoute or Interconnect. The names differ, the pattern is the same. AWSAzureGoogle Internet ALB App Gateway Cloud LB VMEC2 VMAzure VM VMCompute Engine Direct Connect ExpressRoute Interconnect On premises
Live view · three clouds, one pattern
Regions and zones

Where the network lives in each cloud

All three clouds group data centres into regions, and split each region into zones with separate power, cooling and networking. The biggest difference is scope. An AWS VPC (virtual private cloud) and an Azure VNet (virtual network) live in one region, while a Google Cloud VPC is global. That one fact changes how I design addressing, routing and resilience on each platform.

How networks and subnets map to regions and zones A region holds three zones with a virtual machine in each, and traffic flows between the zones. In AWS the VPC covers one region and each subnet sits in a single zone. In Azure the VNet covers one region and a subnet spans every zone. In Google Cloud the VPC is global, so another region joins the same network with its own subnet, and each subnet spans the zones of its region. VPC network · global AWS region · London Azure region · UK South Google Cloud region · London VPC · this region only VNet · this region only Availability Zone aAvailability Zone bAvailability Zone c Zone 1Zone 2Zone 3 VM VM VM Subnet10.0.1.0/24Subnet10.0.2.0/24Subnet10.0.3.0/24 One subnet across all three zones10.1.1.0/24 Regional subnet across all three zones10.2.1.0/24 Another regionneeds its own network Another region, same VPCits own regional subnet One subnet per zone: spread across three Pin each VM to a zone, not the subnet Regions joined inside one VPC

Swipe sideways to see the whole diagram.

AWS. A VPC belongs to one region, and every subnet sits in exactly one Availability Zone. For resilience I create a subnet in each of three zones for every tier, and spread instances and load balancer nodes across them. Another region needs its own VPC, joined by peering or a Transit Gateway.

Azure. A VNet belongs to one region, but its subnets are not tied to a zone. Zone resilience comes from placing each virtual machine (VM), disk and zone redundant service in a zone, not from the subnet. Not every Azure region has availability zones, so I check before I promise zone resilience.

Google Cloud. A VPC network is global and subnets are regional. Instances in different regions on the same VPC reach each other on internal addresses with no peering, which makes multi region designs simpler. The flip side is that one VPC's routes and firewall rules now reach across the world, so I control them centrally.

Animation
Hierarchy and network scope in each cloud
ItemAWSAzureGoogle Cloud
Top of the hierarchyOrganization, with organisational unitsMicrosoft Entra tenant, with management groupsOrganization, with folders
Unit of isolation and billingAccountSubscription, holding resource groupsProject
Private network scopeVPC, one regionVNet, one regionVPC network, global
Subnet scopeOne Availability ZoneThe region, across zonesThe region, across zones
Smallest subnet/28/29/29
Addresses kept by the provider5 per subnet: network, router, DNS (Domain Name System), one reserved, broadcast5 per subnet: network, gateway, two for DNS, broadcast4 per primary range: network, gateway, second to last, broadcast

Plan addresses once

Every VPC and VNet takes address space from one plan that covers on premises and all three clouds. Overlapping ranges are the most expensive mistake to undo, as anyone who has merged two companies knows. Subnetting is on the Internet Protocol (IP) addressing page.

Three zones by default

A zone can fail. I place every production tier in at least two zones, and three where the service supports it, and test that the load balancer really drains a failed zone.

Landing zones first

Accounts, subscriptions and projects are created by a landing zone with guardrails already applied. That design is on the cloud architecture page.

Building blocks

The same idea, three different names

Once you know which service does which job, moving between clouds gets much easier. Filter the map by job, then step through one application built three times.

Equivalent services in AWS, Azure and Google Cloud
JobAWSAzureGoogle Cloud
Private networkAmazon VPCVirtual Network (VNet)VPC network
RoutingRoute tables on subnetsSystem routes plus route tables (user defined routes)Routes on the VPC, scoped by priority and network tags
Shared network across teamsVPC sharing through AWS Resource Access ManagerA hub VNet that spokes peer withShared VPC from a host project
Route to the internetInternet gatewayBuilt in, with no gateway objectDefault internet gateway route
Outbound NAT (network address translation)NAT gateway, zonal or regionalNAT Gateway on the subnetCloud NAT
Fixed public addressElastic IP addressStandard public IP addressStatic external IP address
Filter at the instanceSecurity group: stateful, allow rules onlyNetwork security group (NSG) on the NIC (network interface card): stateful, allow and denyVPC firewall rules and policies: stateful, aimed by tag or service account
Filter at the subnetNetwork ACL (access control list): stateless, allow and deny, numbered orderNetwork security group on the subnetNo separate layer; rules apply across the VPC, plus hierarchical policies
Managed firewallAWS Network FirewallAzure FirewallCloud Next Generation Firewall
Web application firewall (WAF) and DDoS (distributed denial of service) protectionAWS WAF and AWS ShieldAzure Web Application Firewall and Azure DDoS ProtectionGoogle Cloud Armor
Layer 7 load balancerApplication Load BalancerApplication GatewayApplication Load Balancer
Layer 4 load balancerNetwork Load BalancerAzure Load BalancerNetwork Load Balancer
Global front doorAmazon CloudFront and AWS Global AcceleratorAzure Front DoorGlobal external Application Load Balancer
DNSRoute 53 public and private hosted zones, Resolver endpointsAzure DNS, private DNS zones, DNS Private ResolverCloud DNS public and private zones, forwarding
Private access to a servicePrivateLink interface endpoints, gateway endpoints for S3 and DynamoDBPrivate Link with private endpoints, and service endpointsPrivate Service Connect and Private Google Access
Network peeringVPC peering, not transitive, also between regionsVNet peering, not transitive, also between regionsVPC Network Peering, not transitive, global
Transit hubTransit Gateway, AWS Cloud WAN (wide area network)Virtual WAN, or a hub VNet with Azure Firewall and Route ServerNetwork Connectivity Center
VPN (virtual private network)Site to Site VPN, two tunnels per connectionVPN Gateway, active activeHA (high availability) VPN, two interfaces for a 99.99% service level
Private connectionAWS Direct ConnectAzure ExpressRouteCloud Interconnect, Dedicated or Partner
BGP (Border Gateway Protocol) with on premisesVirtual private gateway or Transit Gateway, Direct Connect gatewayVirtual network gateway, Azure Route ServerCloud Router
IdentityIAM (identity and access management) and IAM Identity CenterMicrosoft Entra IDCloud Identity or Google Workspace, with Cloud IAM
PermissionsIAM policies written in JSON (JavaScript Object Notation), attached to identities or resourcesAzure role based access control, assigned at a scopeIAM roles granted to principals on a resource
GuardrailsService control policies and resource control policiesAzure PolicyOrganization Policy
Identity for workloadsIAM roles for EC2 (Elastic Compute Cloud) and LambdaManaged identitiesService accounts
Virtual machinesAmazon EC2Azure Virtual MachinesCompute Engine
KubernetesAmazon EKS (Elastic Kubernetes Service)Azure Kubernetes Service (AKS)Google Kubernetes Engine (GKE)
ServerlessAWS LambdaAzure FunctionsCloud Run and Cloud Run functions
Object storageAmazon S3Azure Blob StorageCloud Storage
Block and file storageAmazon EBS (Elastic Block Store), EFS (Elastic File System) and FSxManaged Disks, Azure Files, Azure NetApp FilesPersistent Disk, Hyperdisk, Filestore
Relational databaseAmazon RDS (Relational Database Service) and AuroraAzure SQL DatabaseCloud SQL, AlloyDB, Spanner
Flow logsVPC Flow LogsVirtual network flow logsVPC Flow Logs
Path checkingReachability AnalyzerNetwork WatcherConnectivity Tests
MonitoringAmazon CloudWatchAzure MonitorCloud Monitoring
Infrastructure as codeCloudFormation and the AWS Cloud Development Kit (CDK)Bicep and Azure Resource Manager (ARM) templatesInfrastructure Manager, which runs Terraform

One application, built three times

A three tier application on AWS, Azure and Google Cloud Users look up the application in DNS, then reach a layer 7 load balancer, which passes requests to a web tier. The web tier reads a managed database, reaches object storage through a private endpoint and goes out to the internet through NAT. A hybrid connection links the network to on premises. The service names change with each cloud. AWS VPCAzure VNetGoogle Cloud VPC Usersbrowsers Route 53Azure DNSCloud DNS ALBApp GatewayApp LBlayer 7 and WAF Web tierAuto ScalingVM scale setinstance group DatabaseAmazon RDSAzure SQLCloud SQL StorageAmazon S3Blob StorageCloud Storage gateway endpointprivate endpointPSC endpoint NATNAT gatewayNAT GatewayCloud NAT HybridDirect ConnectExpressRouteInterconnect

Swipe sideways to see the whole diagram.

On AWS. Route 53 points the name at an Application Load Balancer with AWS WAF, which sends requests to web instances in an Auto Scaling group across three zones. Security groups allow the web tier only from the load balancer and the database only from the web tier. S3 is reached through a gateway endpoint, and the network joins on premises through Direct Connect.

On Azure. Azure DNS points at an Application Gateway with its web application firewall, in front of a VM scale set spread across zones. Network security groups and application security groups do the filtering. Azure SQL and Blob Storage are reached through private endpoints, and ExpressRoute links the VNet, or its hub, to on premises.

On Google Cloud. Cloud DNS points at an Application Load Balancer with Cloud Armor, in front of a managed instance group. VPC firewall rules aimed at service accounts do the filtering. Cloud SQL and Cloud Storage are reached privately through Private Service Connect, and Cloud Interconnect with a Cloud Router joins on premises.

Animation
Outbound

How a private VM reaches the internet

A server in a private subnet still needs updates and application programming interfaces (APIs) on the internet, but nothing on the internet should be able to start a connection to it. NAT solves both: outbound flows leave with a shared public address, and only their replies come back. Each cloud builds it differently.

Outbound internet access from a private subnet A virtual machine with only a private address sends traffic to the internet. On AWS its route table sends it to a NAT gateway in a public subnet, then out through the internet gateway. On Azure a NAT Gateway attached to the subnet gives it a public address directly. On Google Cloud the route points at the default internet gateway and Cloud NAT translates the address inside the network. Replies return the same way. AWS VPCAzure VNetGoogle Cloud VPC Private subnet Public subnet VM10.0.1.10, private 0.0.0.0/0 to NAT gatewaySubnet uses the NAT Gateway0.0.0.0/0 to internet gateway NAT gatewayElastic IP NAT Gatewaystatic public IPs Cloud NATset on a Cloud Router IGWGatewayinternet gwdefault route Internet One per zone, or one regional gateway New VNets: no default outbound No gateway VM to size or patch

Swipe sideways to see the whole diagram.

AWS. The private subnet's route table sends 0.0.0.0/0 to a NAT gateway in a public subnet, and the public subnet's route table sends 0.0.0.0/0 to the internet gateway. The NAT gateway swaps the VM's private address for its Elastic IP. A zonal NAT gateway serves one zone, so I put one in each zone; a regional NAT gateway, available since November 2025, spans zones on its own and needs no public subnet.

Azure. There is no internet gateway object. A NAT Gateway attached to the subnet gives every VM in it static public addresses for outbound traffic, and takes priority over other outbound methods. The old default outbound access, where Azure picked an address for you, is going: virtual networks created with API versions after 31 March 2026 get private subnets by default, so I always design outbound on purpose.

Google Cloud. The default route points at the default internet gateway, and Cloud NAT translates addresses inside Google's software defined network. There is no NAT appliance to size, patch or make highly available. Cloud NAT is configured on a Cloud Router, which only holds the settings and carries none of the traffic.

Animation

Replies only

NAT keeps a table of each flow the VM started, so only replies come back in. Nothing on the internet can open a connection to a VM that has no public address.

Fixed addresses

Partners often allow my traffic by source address. NAT with fixed public addresses gives them one short list to trust, which is much easier than a public address per VM.

Not for cloud services

Sending storage or database traffic through NAT costs a processing charge per gigabyte and crosses the public edge. Private endpoints, further down this page, keep it inside.

Load balancing

How a request reaches the application

Users never reach a web server directly. DNS sends them to a load balancer, which ends the TLS (Transport Layer Security) session, checks the request and passes it to a healthy server in a private subnet. Step through one request.

An inbound request through a cloud load balancer A user resolves the application name in DNS and gets the load balancer's address. The load balancer ends TLS and a web application firewall checks the request. Health checks keep track of which servers in two zones are healthy. The request goes to a healthy server, whose security rule only allows the load balancer, and the reply returns through the load balancer. VPC or VNet Zone 1 · private Zone 2 · private Userbrowser DNSalias to LB Load balancerTLS, WAFhealth checks Web serverhealthy Web serverhealthy Web serverfailed check allows LB only app.example.com to LB Certificate and WAF at the edge Zone 2 server taken out Client address in a header

Swipe sideways to see the whole diagram.

Step 1
  1. The user looks up the name, and DNS returns the load balancer's address. On AWS I use a Route 53 alias record, because a load balancer's addresses can change. Global load balancers on Azure Front Door and Google Cloud answer from many locations at once.

  2. The load balancer ends the TLS session with a managed certificate, and a web application firewall checks the request: AWS WAF, the Azure WAF on Application Gateway or Front Door, or Google Cloud Armor. Bad requests stop at the edge.

  3. The load balancer probes every server on a health check path. A server that fails is taken out of rotation, so users never reach it. Here the zone 2 server has failed, and all traffic goes to zone 1.

  4. The request goes to a healthy server in a private subnet. Its security group or NSG allows traffic only from the load balancer, never from the internet, so the server itself needs no public address.

  5. The reply returns through the load balancer. A layer 7 load balancer is a proxy, so the server sees the load balancer's address, and the user's address arrives in the X-Forwarded-For header for logs and rules.

Load balancer types in each cloud
TypeAWSAzureGoogle CloudWhen I use it
Layer 7, one regionApplication Load BalancerApplication GatewayRegional Application Load BalancerWeb apps and APIs: routing by host or path, TLS, WAF.
Layer 4Network Load BalancerAzure Load BalancerNetwork Load Balancer, proxy or passthroughNon web protocols, very high throughput, fixed addresses.
Global layer 7CloudFront in front of an ALB (Application Load Balancer). Global Accelerator is the layer 4 anycast optionAzure Front DoorGlobal external Application Load BalancerUsers worldwide, failover between regions, edge caching.
DNS basedRoute 53 routing policiesTraffic ManagerCloud DNS routing policiesSteering between regions or clouds by health, weight or location.
Appliance insertionGateway Load BalancerGateway Load BalancerThird party appliances behind an internal load balancerSending traffic through a scaled set of firewalls.
Security rules

Stateful and stateless, and why it matters

A stateful filter remembers each connection, so a reply is allowed back automatically. A stateless filter judges every packet on its own, so the reply needs its own rule. On AWS a request passes the subnet's network ACL (NACL), which is stateless, and then the instance's security group (stateful). Change the rules and watch where the packets stop.

A request and its reply through a network ACL and a security group A client on the internet sends an HTTPS request across the subnet's network ACL and the instance's security group to a web server. The reply travels back through both. The security group lets the reply out because it remembers the request. The network ACL needs an outbound rule for the reply's port, from 1024 to 65535, or it drops the reply. Subnet RequestReply Clientinternet NACLsubnet SGinstance Web serverport 443 port 443port 50432 statelessstateful

Swipe sideways to see the whole diagram.

Animation

Rules



The page loads. The request passes both filters. The security group remembers it and lets the reply out, and the NACL has an outbound rule for the reply's port.

Cloud packet filters compared
FilterApplies toStatefulRulesOrder and defaults
AWS security groupEach network interfaceYesAllow only. Can refer to other security groups.All rules are considered together. New groups allow all outbound and no inbound.
AWS network ACLA subnetNoAllow and denyNumbered, lowest first, first match wins. The default ACL allows all; a new custom ACL denies all.
Azure network security groupA subnet, a NIC, or bothYesAllow and deny, with service tags and application security groupsPriority 100 to 4096, lowest first. Default rules allow the VNet and the Azure load balancer, and deny other inbound.
Google Cloud firewall rules and policiesInstances, chosen by network tag or service accountYesAllow and denyPriority 0 to 65535, lowest number first. Implied rules allow all egress and deny all ingress. Hierarchical policies from the organisation apply first.

Least privilege by tier

The security group or NSG on each workload is my main control. The web tier accepts HTTPS (Hypertext Transfer Protocol Secure) from the load balancer only, and the app tier only from the web tier, by referring to the group rather than to addresses. NACLs stay broad.

Inspect between networks

These rules see addresses and ports only. Traffic between spokes and out to the internet goes through a central firewall: AWS Network Firewall, Azure Firewall, Cloud Next Generation Firewall, or an NVA (network virtual appliance), a vendor firewall running as a VM.

Rules as code

Every rule lives in Terraform, Bicep or CloudFormation and is reviewed before it merges. Policy as code blocks rules that open management ports to the whole internet, and flow logs go to central logging.

Private access

Reaching cloud services without the public edge

Storage, databases and other platform services listen on public endpoints by default. A private endpoint puts the service on an address inside my network, so traffic stays on private addresses and the public endpoint can be switched off. The part people miss is DNS.

How a private endpoint and private DNS keep service traffic inside At first a virtual machine reaches a storage service through NAT and the public internet. A private endpoint is then created in the subnet with a private address. A private DNS zone answers the storage name with that private address, so the virtual machine connects to it directly and the traffic stays on the provider's network. On premises users reach it too, through the hybrid link and a DNS resolver. Finally the service's public access is turned off. VPC or VNet VM10.0.1.10 NATpublic edge Endpoint10.0.2.50 Private DNS zonename to 10.0.2.50 Storage servicepublic access onpublic access off On premisesvia DNS resolver public path closed Leaves the network, NAT charges An interface in my subnet Same name, private answer Private from cloud and on premises Only the endpoint is accepted

Swipe sideways to see the whole diagram.

Step 1
  1. Without private access, the VM reaches the storage service's public endpoint through NAT. It works, but the traffic leaves the private network, pays NAT processing charges and needs the service open to the internet.

  2. A private endpoint gives the service a private address in my subnet. AWS PrivateLink interface endpoints and Azure private endpoints are network interfaces. A Private Service Connect endpoint on Google Cloud is an internal forwarding rule. For S3 and DynamoDB, AWS also offers free gateway endpoints that work through the route table instead.

  3. Clients still use the service's normal name, so a private DNS zone must answer that name with the private address. On Azure that means zones such as privatelink.blob.core.windows.net, linked to every VNet that needs them. Most broken private endpoints I see are DNS faults.

  4. The VM now connects straight to the endpoint, and the traffic stays on the provider's network. On premises clients use the same endpoint over the private connection, as long as their DNS forwards the zone to a cloud resolver such as Route 53 Resolver or Azure DNS Private Resolver.

  5. With private access proven, I turn off public network access on the service, or restrict it to the endpoint with a policy. Now the data has no path to the internet even if a key leaks.

Joining networks

Peering, hubs and hybrid links

Few workloads live in one network. Teams get their own VPCs or VNets, which then need to talk to each other and to on premises sites. Peering is simple but does not scale; a transit hub does. The full hybrid design, with resilient private connections, is on the cloud architecture page.

Peering, a transit hub and hybrid connections Three networks, A, B and C. With peering, A is peered with B and B with C, but A cannot reach C through B because peering is not transitive. With a transit hub, every network attaches to the hub, which routes and inspects traffic between them and on premises. In the hybrid view, on premises connects to the hub over two private connections in two locations, with a VPN as backup. Network A10.10.0.0/16 Network B10.20.0.0/16 Network C10.30.0.0/16 Transit hubTGW, vWAN hub, NCC On premisesdata centres and sites location 1location 2VPN backup A cannot reach C through B Full mesh: 10 networks need 45 peerings One place to route and inspect BGP prefers the private links

Swipe sideways to see the whole diagram.

Peering. Two networks exchange routes directly, with no gateway in the path and no bandwidth bottleneck. But peering is not transitive: if A peers with B and B with C, A still cannot reach C. A full mesh grows quickly, with ten networks needing 45 peerings, so peering suits a handful of networks, not a hundred. Address ranges must not overlap.

Transit hub. Every network attaches once to a hub: an AWS Transit Gateway, an Azure Virtual WAN hub or hub VNet, or a Google Cloud Network Connectivity Center hub. The hub's route tables decide who can reach whom, and a firewall in the hub can inspect traffic between networks. This is my default beyond a few networks.

Hybrid. On premises joins the hub over private connections: AWS Direct Connect, Azure ExpressRoute or Google Cloud Interconnect, in two locations, with BGP choosing the path and a VPN over the internet as the last resort. On Google Cloud, Cloud Router runs the BGP sessions. On AWS and Azure the private connection's BGP peers are the provider's edge routers, and the VPN's BGP ends on the cloud gateway.

Animation
Hybrid connection options in each cloud
OptionAWSAzureGoogle Cloud
VPN over the internetSite to Site VPN: two tunnels per connection, to different endpointsVPN Gateway, with active active instancesHA VPN: two interfaces and two tunnels for a 99.99% service level
Private connectionDirect Connect: dedicated ports of 1, 10, 100 or 400 Gbps, or hosted connections from 50 Mbps to 25 Gbps through partnersExpressRoute through a provider, or ExpressRoute Direct ports straight into MicrosoftDedicated Interconnect at 10, 100 or 400 Gbps per link, or Partner Interconnect
Where BGP runsOn each virtual interface, with the AWS Direct Connect router. Routes attach to a virtual private gateway or, through a Direct Connect gateway, a Transit Gateway. VPN BGP ends on the gateway itselfExpressRoute: with the Microsoft Enterprise Edge (MSEE) routers, and the ExpressRoute gateway learns from them. VPN: on the VPN gateway. Azure Route Server for appliancesCloud Router, for Interconnect and HA VPN
HubTransit Gateway, or Cloud WAN for global networksVirtual WAN, or a hub VNetNetwork Connectivity Center
Direct link to another cloudAWS Interconnect (multicloud), generally available with Google Cloud since April 2026A partner fabric, or ExpressRoute and the other cloud's private link meeting in one colocation siteCross-Cloud Interconnect to AWS, Azure, Oracle Cloud Infrastructure and Alibaba Cloud

Overlapping ranges

When two networks already overlap, routing alone cannot join them. Either I publish the one service that is needed through PrivateLink, Private Link or Private Service Connect, or I translate addresses. That means a private NAT gateway on AWS, Private NAT on Google Cloud, and NAT rules on the VPN gateway or a firewall on Azure.

Packet size on every path

The MTU (maximum transmission unit) depends on the path. Inside an AWS VPC, instances use 9001 byte jumbo frames, but an internet gateway or VPN carries 1,500 bytes and a Transit Gateway 8,500. Azure starts at 1,500. Google Cloud networks default to 1,460 and can go up to 8,896. I set the smallest value on the path, or clamp the TCP maximum segment size.

IPv6

All three run dual stack networks with IPv4 and IPv6 (Internet Protocol version 6). On AWS, IPv6 addresses are globally routable, so an egress only internet gateway gives private subnets outbound IPv6 while blocking connections in. I plan IPv6 prefixes in the same address plan as IPv4.

Identity

Who can do what, and where

In the cloud, identity is the first control, ahead of any network rule. Every API call is checked against who is asking and what they are allowed to do on that resource. The three clouds build this from the same parts: a hierarchy, identities, roles, guardrails and identities for workloads.

How cloud identity and permissions flow An organisation holds groups for production and non production, which hold accounts or subscriptions or projects, which hold resources such as a database. An engineer signs in once through an identity provider. On Azure and Google Cloud, a role granted on the production group is inherited by everything below it; on AWS only the guardrails are inherited. A guardrail set at the top denies some actions whatever the role allows. An application server reaches the database with an identity issued by the platform, with no stored keys. Organisationroot of everything Productiona grouping Non productiona grouping Paymentsan account Sharedan account Testan account Sandboxan account Database App serverworkload identity Identity providersingle sign on, MFA Roleread the database Guardraildeny, whatever the role Engineersigns in once

Swipe sideways to see the whole diagram.

Step 1
  1. Everything sits in a tree. AWS uses an Organization with organisational units and accounts. Azure uses a Microsoft Entra tenant, management groups, subscriptions and resource groups. Google Cloud uses an Organization, folders and projects. Policies set high in the tree flow down to everything below.

  2. Engineers sign in through one identity provider with MFA (multi factor authentication): IAM Identity Center on AWS, Microsoft Entra ID on Azure, Cloud Identity or Google Workspace on Google Cloud, often federated with the company directory. No long lived personal keys.

  3. On Azure and Google Cloud, a role granted at a level is inherited by everything beneath it. Here a read only database role on Production reaches the database in the Payments account. AWS works differently: IAM Identity Center assigns permission sets account by account, and only the guardrails are inherited down the tree. I grant roles to groups, never to individuals, and at the lowest level that works.

  4. Guardrails set at the top deny actions whatever a role allows: service control policies on AWS, Azure Policy, and Organization Policy on Google Cloud. Typical rules keep data in approved regions and stop anyone turning off logging.

  5. Applications get their own identities from the platform: IAM roles for EC2 and Lambda, managed identities on Azure, service accounts on Google Cloud. The platform issues short lived tokens, so no passwords or keys sit in code.

Services

Compute, serverless and the network underneath

Virtual machines sit in my subnets, so they follow every rule on this page. Managed services and serverless functions run in the provider's network instead, and need a deliberate path into mine to reach private data. Who looks after which layer is set out in the shared responsibility model on the cloud architecture page.

How a serverless function reaches a private database A client calls an API gateway, which invokes a serverless function running in the provider's network. To reach a database with only a private address, the function connects into the customer network through a provider specific attachment, then reaches the database. My VPC or VNet Provider network Clientapp or user API GatewayAPI Managementauth, rate limits AWS LambdaAzure FunctionsCloud Runserverless code ENISubnetEgressin my subnetdelegateddirect VPC Databaseprivate only Function attached to private subnets VNet integration on a supported plan Direct VPC egress or a connector

Swipe sideways to see the whole diagram.

AWS Lambda. A function attached to a VPC reaches it through network interfaces that Lambda creates in the chosen private subnets, under the function's own security group. Once attached, it reaches the internet only through a NAT gateway, so I plan that path too.

Azure Functions. VNet integration on the Flex Consumption, Premium or App Service plans sends the function's outbound traffic into a subnet delegated to it. Inbound access can be made private with a private endpoint on the function app.

Cloud Run. Direct VPC egress places the service's outbound traffic straight onto a subnet, or a Serverless VPC Access connector carries it. Firewall rules and routes then treat it like any other traffic in the VPC.

Animation

VMs follow my rules

EC2 instances, Azure VMs and Compute Engine instances live in my subnets, so routing, filtering and NAT apply to them directly. Patching the operating system stays my job.

Managed services need a path

Databases, storage and queues are reached through private endpoints, or through a peering that the provider sets up, as with Google Cloud's private services access for Cloud SQL.

Containers add a layer

EKS, AKS and GKE give each pod an address, often from the VPC itself, which can use up subnets faster than expected. I size pod address ranges before the first cluster goes live.

Functions behind an API

An API gateway terminates TLS, checks who is calling, limits request rates and routes each path to a function. A function idle for a while starts cold, so the first call is slower. Where that matters I keep instances warm: provisioned concurrency on Lambda, always ready instances on Azure Functions, minimum instances on Cloud Run.

Data transfer

Where the network adds to the bill

Compute is easy to price. Network charges surprise people, because they depend on where data goes. The patterns are the same in all three clouds, though the rates differ and change, so I always check the current price lists.

Which data flows cost money Data arriving from the internet is usually free. Data going out to the internet is charged per gigabyte. Traffic between zones in a region is charged on AWS and Google Cloud. Traffic between regions is charged. NAT gateways and private endpoints add a processing charge for each gigabyte that passes through them. Region 1 Zone A Zone B Region 2 Internet VMzone A VMzone B NAT VMregion 2 In from the internet: usually free Out to the internet: charged per GB Between zones: charged on AWS and Google Cloud Between regions: charged per GB NAT and endpoints: per GB processed

Swipe sideways to see the whole diagram.

Inbound. Data arriving from the internet is usually free, which is why it is easy to fill a cloud and harder to leave it.

To the internet. Data leaving to the internet is charged per gigabyte, getting cheaper in volume. A content delivery network in front of busy content usually costs less per gigabyte and is faster for users.

Between zones. AWS and Google Cloud charge for traffic between zones in the same region, in both directions on AWS. Azure removed that charge. Resilience across zones is worth paying for, but chatty tiers that talk constantly across zones can quietly cost more than the servers.

Between regions. Replication and backups to another region are charged per gigabyte. I size disaster recovery copies with that in mind, and compress or send only changes where I can.

NAT and endpoints. NAT gateways and private endpoints charge per hour and per gigabyte processed. Sending large storage traffic through NAT is a classic waste: an S3 gateway endpoint carries it for free.

Animation
Troubleshooting

Finding faults in a cloud network

There is no cable to trace in the cloud. I check configuration in the order a packet meets it: name resolution, security rules, the route table, the gateway or peering, then the destination and its way back. Each cloud has tools that check this path for me. Pick a symptom.

Where common cloud network faults sit A packet leaves its source, passes the security rules, follows the route table, crosses a gateway or peering and reaches its destination, which must be able to reply. For each symptom, the packet stops where the fault usually is. Sourcename lookup Security rulesSG, NSG, NACL Route tableeffective routes GatewayNAT, peer, VPN Destinationand its reply Name resolves to the public address Rule does not allow the load balancer or health checks No default route to NAT, or NAT in the wrong subnet Peering is up but a route is missing on one side BGP is not advertising the range, or the range overlaps The reply takes a different path, or a NACL drops it Check in the order a packet meets the configuration

Swipe sideways to see the whole diagram.

The private endpoint is not used. I run nslookup or dig on the client. If the name returns a public address, the private DNS zone is missing, not linked to this network, or on premises DNS is not forwarding the zone to the cloud resolver.

Users cannot reach the app. The load balancer shows unhealthy targets. The server's security group or NSG must allow the load balancer's own address range or security group, and Google Cloud health checks come from fixed Google ranges that need a firewall rule.

A VM cannot reach the internet. I check the subnet's effective routes for 0.0.0.0/0. On AWS it must point at a NAT gateway. A zonal NAT gateway must sit in a public subnet with a route to the internet gateway. A regional NAT gateway needs no public subnet, but the VPC still needs an internet gateway. On Azure I check the NAT Gateway is attached to this subnet. On Google Cloud I check Cloud NAT covers this subnet and region.

A peered network is unreachable. Peering being active is not enough. Both sides need routes to each other's ranges, the security rules must allow the traffic, and peering never carries traffic onwards to a third network.

On premises cannot connect. I check the BGP session on the cloud gateway, which prefixes are advertised and received each way, and route propagation into the subnets' route tables. Overlapping address ranges between cloud and site are a common, painful cause.

It works one way only. A stateless NACL without a rule for the reply's ports, or a reply that leaves by a different path and meets a stateful firewall that never saw the request. Flow logs on both ends show where the reply disappears.

Animation
Cloud network troubleshooting tools and commands
CheckAWSAzureGoogle Cloud
Can this source reach that destination?Reachability Analyzer: aws ec2 create-network-insights-path, then start-network-insights-analysisNetwork Watcher connection troubleshoot and IP flow verify: az network watcher test-ip-flowConnectivity Tests: gcloud network-management connectivity-tests create
Which route wins?The subnet's route table: aws ec2 describe-route-tablesEffective routes on the NIC: az network nic show-effective-route-table, or next hopgcloud compute routes list, and the route analysis in Connectivity Tests
Which rule allowed or blocked it?Security groups and NACLs: aws ec2 describe-security-groupsEffective security rules: az network nic list-effective-nsgFirewall rules logging and gcloud compute firewall-rules list
What really flowed?VPC Flow LogsVirtual network flow logs, which replace NSG flow logsVPC Flow Logs
Packet captureVPC Traffic MirroringNetwork Watcher packet capturePacket Mirroring

From inside a VM, the usual tools still work: curl -v, nc -vz host 443, traceroute -T and dig. My general method is on the troubleshooting page.

Engagement

How I run a cloud platform engagement, from first workshop to steady running

Whether the work is a new landing zone, a migration or tidying up an estate that grew by accident, I follow the same path. I agree the outcome, find out what really exists, design the network and identity foundations, prove them, then hand over a platform the operations team can run and keep current.

How an engagement runs, from first conversation to lifecycle Seven stages from left to right: engage (outcomes), requirements (what and how), discovery (facts first), design (on paper), build and test (as code), support (handover), lifecycle (keep current). For each stage the panel shows who I work with and what comes out of it. After the lifecycle stage the loop returns to the start. Engageoutcomes Requirementswhat and how Discoveryfacts first Designon paper Buildas code Supporthandover Lifecyclekeep current Step 1 · EngageWhy cloud, and for which workloadsWho I work withWhat comes outCloud and platform leadsSecurity and riskFinance and cost ownersGoals and success measuresScope: clouds, regions, workloadsConstraints: data, residency, costDecision log and who owns what Step 2 · RequirementsWhat the platform must do, and how wellWho I work withWhat comes outApplication ownersSecurity architectsOperations teamsWorkload and connectivity needsAvailability and recovery targetsSecurity and compliance controlsRequirements traced to tests Step 3 · DiscoveryWhat exists today, measuredWho I work withWhat comes outApplication teamsNetwork and security teamsExisting cloud ownersInventory and dependency mapIP address plan and overlapsCurrent spend and data flowsRisks and quick wins Step 4 · DesignLanding zone, network and identityWho I work withWhat comes outDesign authorityCloud securityProvider architectsLanding zone and account designHub, routing and address planIdentity, roles and guardrailsLogging, backup and recovery design Step 5 · Build and testBuilt as code, proved by testsWho I work withWhat comes outPlatform engineersPilot application teamChange advisory boardLanding zone deployed as codeConnectivity and failover testsPilot workload liveMigration waves with rollback Step 6 · SupportOwnership, alerts and cost controlWho I work withWhat comes outCloud operationsSecurity operationsFinOps teamRunbooks and known errorsAlerts, logs and dashboardsCost reports and budgetsHypercare exit criteria Step 7 · LifecycleServices, versions and costs reviewedWho I work withWhat comes outProvider account teamsProcurementDesign authorityService retirement registerQuarterly cost and usage reviewGuardrail and policy updatesCommitment renewal plan

Swipe sideways to see the whole diagram.

Step 1
  1. I start with the reason: a data centre exit, faster delivery, resilience or a new service. I agree how success will be measured, such as cost per workload, recovery time or release frequency, and who decides what, including where data may live.

  2. Functional requirements cover what must connect to what, which services are allowed, and how teams get accounts or subscriptions. Non functional ones set availability, recovery, latency, residency, security and cost targets, each with a number I can test.

  3. I map what is really running: servers and their dependencies, current cloud accounts, address ranges, flows and spend. Overlapping address ranges, public storage and forgotten accounts show up here, long before they cause an outage or a breach.

  4. I design the hierarchy and guardrails, the hub and routing, the address plan, private access, hybrid connectivity, identity and logging. The design authority reviews it, and decisions go into the decision log with the reasons.

  5. Everything is built as code, usually Terraform, through a pipeline with policy checks. I test routes, security rules, private DNS and hybrid failover, then move a pilot workload before the migration waves start, each with a rollback plan.

  6. Before the first workload moves, I agree who owns the platform, the network and each application. Alerts, flow logs and cost reports are live from day one, and hypercare ends only when alerts are tuned and runbooks are proven.

  7. Cloud services change every month: features retire, defaults change and prices move. I track retirement notices, review cost and use each quarter, keep guardrails current and plan savings commitments before they renew. The 2026 change to Azure default outbound access is an example: new networks built from old templates get no default internet access.

Functional requirements

What it must do.

  • Give each team its own accounts, subscriptions or projects, created from a template with guardrails applied.
  • Connect workloads to each other, to on premises and to the internet only through approved paths.
  • Reach platform services privately, with private DNS that works from the cloud and from on premises.
  • Publish applications through load balancers with TLS and a web application firewall.
  • Sign in people through one identity provider, and give workloads platform issued identities.
  • Log every API call and network flow to a central, protected location.

Non functional requirements

How well it must do it, with a number wherever one can be agreed.

Availability
Production across at least two zones, with 99.95% or better for tier 1 services.
Recovery
Recovery point and recovery time agreed per tier, with backups held in another region and account.
Performance
Latency between tiers and to users measured, with a hybrid path sized for peak plus headroom.
Security
Least privilege roles, guardrails at the top of the hierarchy, no public storage, encryption everywhere.
Compliance
Data kept in approved regions, logs retained for the agreed period, controls mapped to the standards that apply.
Operability
Everything built as code, drift detected, and changes through a pipeline with approvals.
Cost
Budgets and alerts per team, with tags that show who spends what.

These are typical starting targets for a cloud landing zone. The client sets the final numbers, and each one is checked by a test or by a policy in code.

Projects

Where I have worked across clouds

My cloud work has always been part of wider network, security and data centre programmes, which is why I care so much about how each platform really moves packets.

Certification

AWS Solutions Architect Professional

My cloud architecture certification. I have also trained in Microsoft Azure and Google Cloud Platform.

XIDA · 2025 to now

Multi cloud transformation

Led network and security transformation from discovery to provisioning across Cisco Nexus, Catalyst SD-WAN, SD-Access and AWS, Azure and Google Cloud environments.

XIDA · 2021 to 2024

Modernisation, discovery to handover

Lead architect on network, cloud and data centre modernisation programmes, from discovery to operational handover, across several client environments.

iSystems Integration · three engagements, 2015 to 2019

Three clouds and disaster recovery

Directed architecture and delivery across AWS, Google Cloud, Azure, disaster recovery, Catalyst SD-WAN, SD-Access and security, and led and mentored a team of 4 engineers.

AVEVA · 2020 to 2021

Industrial data to the cloud

Shaped network security for AVEVA Historian and, during the OSIsoft acquisition, the PI System, moving process data securely to data centre and cloud.

Toolset

How I build it

Hybrid and multi cloud design, built as code with Terraform, Ansible and Python.

Backed by AWS Certified Solutions Architect Professional. I have also trained in Microsoft Azure and Google Cloud Platform. See all credentials