Skip to main content

AWS Parity Design Reference

Source: Marc Mercer (SRE Lead) — sre-iac repository, Rev 1.0, 2026-02-24

This document maps AWS services to their OpenStack equivalents. OpenStack is the production platform — this reference preserves future optionality and reduces onboarding friction for engineers with AWS background. AWS migration is not an immediate goal.

Core Service Mapping

Compute

AWS ServiceOpenStack EquivalentCompatibilityNotes
EC2Nova95%VM provisioning and management
Auto Scaling GroupsHeat Autoscaling85%Instance scaling based on metrics
Elastic IPsNeutron Floating IPs90%Static IP address assignment
Placement GroupsNova Server Groups80%Instance placement control
Dedicated HostsNova Aggregates70%Host isolation and affinity
EKSEKS Anywhere99%Same Kubernetes distribution, same APIs
ECS / FargateN/AUse EKS Anywhere / Kubernetes pods instead

Instance type → Nova flavor mapping:

t3.micro: { vcpus: 1, ram: 1024, disk: 8 }
t3.small: { vcpus: 1, ram: 2048, disk: 20 }
t3.medium: { vcpus: 2, ram: 4096, disk: 30 }
t3.large: { vcpus: 2, ram: 8192, disk: 40 }
m5.large: { vcpus: 2, ram: 8192, disk: 40 }
m5.xlarge: { vcpus: 4, ram: 16384, disk: 80 }
c5.xlarge: { vcpus: 4, ram: 8192, disk: 40 }
r5.xlarge: { vcpus: 4, ram: 32768, disk: 40 }
p3.xlarge: { vcpus: 4, ram: 16384, disk: 40, gpu: 1 }

Storage

AWS ServiceOpenStack EquivalentCompatibilityNotes
EBSCinder + Ceph RBD90%Block storage with SSD and HDD tiers
EFSManila + CephFS85%Shared NFS-compatible filesystem
S3Ceph RadosGW95%Full S3 API compatibility
GlacierCeph HDD pool70%Archive storage tier

EBS type → Ceph pool mapping:

gp3: # General Purpose SSD → ssd_general pool
io2: # High IOPS SSD → ssd_high_iops pool
st1: # Throughput HDD → hdd_throughput pool
sc1: # Cold HDD → hdd_cold pool

Networking

AWS ServiceOpenStack EquivalentCompatibilityNotes
VPCNeutron Networks90%Virtual private clouds with subnets
SubnetsNeutron Subnets95%Public/private subnet patterns
Internet GatewayNeutron Router90%External connectivity
NAT GatewayNeutron Router85%Outbound internet for private subnets
Security GroupsNeutron Security Groups95%Instance-level firewall rules
NACLsNeutron Network Policies80%Subnet-level access control
ALB/NLBOctavia Load Balancer85%App and network load balancing
Route53Designate + external-dns70%DNS management and service discovery

Subnet pattern — identical in both environments:

public_subnets: ["10.100.0.0/20", "10.100.16.0/20", "10.100.32.0/20"]
private_subnets: ["10.100.48.0/20", "10.100.64.0/20", "10.100.80.0/20"]
database_subnets: ["10.100.96.0/20", "10.100.112.0/20", "10.100.128.0/20"]
elasticache_subnets: ["10.100.144.0/20", "10.100.160.0/20", "10.100.176.0/20"]
intra_subnets: ["10.100.192.0/20", "10.100.208.0/20", "10.100.224.0/20"]

Database

AWS ServiceOpenStack EquivalentCompatibilityNotes
RDS PostgreSQLTrove PostgreSQL80%Managed PostgreSQL instances
RDS MySQLTrove MySQL80%Managed MySQL/MariaDB instances
ElastiCache RedisTrove Redis75%Managed Redis instances
DynamoDBN/AUse PostgreSQL or MongoDB
AuroraN/AUse PostgreSQL with HA configuration

Security and Identity

AWS ServiceOpenStack EquivalentCompatibilityNotes
IAMKeystone + RBAC60%Basic user/role management
Secrets ManagerInfisical85%Self-hosted; Kubernetes operator integration
KMS / BarbicanBarbican40%Basic key management only
Security GroupsNeutron Security Groups95%Network access control
CognitoAuthentik75%Already running Authentik for SSO

Management and Monitoring

AWS ServiceOpenStack EquivalentCompatibilityNotes
CloudWatchPrometheus/Grafana70%Metrics, alerting, and dashboards
CloudTrailKeystone Audit50%API call auditing
Systems ManagerAnsible60%Configuration management
CloudFormationHeat75%Infrastructure orchestration
note

Prometheus/Grafana provides deeper Kubernetes-native monitoring than CloudWatch offers for EKS. The 70% compatibility rating understates practical monitoring capability — the gap is primarily in automatic service-level integration that CloudWatch provides natively.

Terraform Portability

OpenStack Provider

terraform {
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.53.0"
}
}
}

provider "openstack" {
cloud = "staging" # From clouds.yaml
}

resource "openstack_networking_network_v2" "main" {
name = "main-network"
admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "private" {
name = "private-subnet"
network_id = openstack_networking_network_v2.main.id
cidr = "10.100.48.0/20"
ip_version = 4
}

Portability Patterns

Pattern 1: Conditional Providers

variable "environment" {
description = "Target platform: openstack or aws"
type = string
}

provider "openstack" {
count = var.environment == "openstack" ? 1 : 0
cloud = "staging"
}

provider "aws" {
count = var.environment == "aws" ? 1 : 0
region = "us-east-1"
}

Pattern 2: Environment-Specific Modules

module "infrastructure" {
source = var.environment == "openstack" ?
"./modules/openstack" :
"./modules/aws"

vpc_cidr = "10.100.0.0/16"
name = "my-app"
}

Pattern 3: Application Configuration

openstack:
storage:
class: "cinder-ssd"
endpoint: "https://rgw.staging.anshinhealth.net"

aws:
storage:
class: "gp3"
endpoint: "s3.amazonaws.com"

S3 API Compatibility (RadosGW)

Same client code works against both AWS S3 and RadosGW with only an endpoint URL change:

import boto3

s3_client = boto3.client(
's3',
endpoint_url='https://rgw.staging.anshinhealth.net',
aws_access_key_id='ACCESS_KEY',
aws_secret_access_key='SECRET_KEY'
)

# Standard S3 operations work identically
response = s3_client.list_buckets()
s3_client.put_object(Bucket='my-bucket', Key='my-key', Body=b'data')

Supported: bucket management, object CRUD, multipart uploads, pre-signed URLs, bucket policies, versioning. Partially supported: S3 Select, S3 Inventory, some advanced lifecycle configurations.

Performance Reference

ServiceAWSOpenStackNotes
gp33,000-16,000 IOPS2,000-12,000 IOPSCeph SSD pool
io2Up to 64,000 IOPSUp to 40,000 IOPSHigh-performance SSD
st1Up to 500 MB/sUp to 400 MB/sHDD throughput
VPC bandwidthUp to 100 GbpsUp to 12 GbpsLACP bonding limit on ML350 G9

Services with No Direct OpenStack Equivalent

AWS ServiceRecommended Alternative
LambdaKubernetes Jobs / CronJobs (or OpenFaaS, Knative)
API GatewayKong or Kubernetes Ingress
SQS/SNSRabbitMQ or Redis pub/sub (Kubernetes services or Trove)
Elasticsearch ServiceSelf-managed OpenSearch on Kubernetes
CloudFrontNginx/Varnish caching, or external CDN
SESExternal transactional email provider
Step FunctionsArgo Workflows or Temporal
WAFModSecurity at ingress controller level

Known Limitations vs. AWS

These are accepted trade-offs for data sovereignty, cost control, and operational independence:

  1. IAM complexity — Keystone provides project-level RBAC but lacks AWS IAM's fine-grained policy language. Mitigated by FreeIPA group-based access and Infisical for secrets.
  2. Single site/single AZ — No multi-region HA. Acceptable for staging; would require architectural changes for production PHI handling.
  3. Managed service depth — Fewer managed services; most non-DB services are self-hosted on Kubernetes.
  4. Compliance programs — AWS provides pre-certified HIPAA BAA, SOC 2 reports. OpenStack requires self-assessment. Anshin Health's controls align with these frameworks but are not yet formally certified.

Document Control

RevDateAuthorDescription
1.02026-02-24Marc MercerInitial release