← Workshops · Articles
Reference · Infrastructure

The AWS Services Behind a Production Platform

Forty-five services, grouped by the job they do, each linked to its official developer guide — and the method for building an inventory you can actually trust.

HR
Hector Reyes Platform & Infrastructure · Sep 2026 · 12 min read

Ask any engineering team which AWS services they use and you will get a list. Ask them to prove it and the list changes. Some entries were decommissioned two years ago. Some were never wired up — someone granted the IAM permission during a spike and the code never followed. And several services the platform genuinely depends on will be missing entirely, because nobody thinks of Parameter Store or STS as a service; they think of them as plumbing.

This page is the corrected version of that list for a four-system production estate: three serverless platforms built on Lambda and SAM, and one container platform on ECS Fargate. Forty-five services, each linked to its official developer guide, grouped by the job it does rather than by the order AWS announced them.

It is worth saying up front how it was built, because the method matters more than the list. Nothing here came from memory or from an architecture diagram. Every entry is backed by something a machine can find in the repository.

MethodInventory from evidence, not recall

An accurate service inventory is a search problem, and the trick is knowing that a service leaves several independent kinds of fingerprint. Grep for only one and you will miss a third of the estate. Six signals, run across every repository:

# 1 — declared infrastructure (SAM / CloudFormation)
rg 'Type: AWS::(\w+)::' -o --no-filename | sort -u

# 2 — declared infrastructure (Terraform)
rg 'resource "aws_(\w+)"' -o --no-filename | sort -u

# 3 — runtime SDK calls (Python)
rg 'boto3\.(client|resource)\(' -o --no-filename | sort -u

# 4 — runtime SDK calls (JavaScript / TypeScript)
rg '@aws-sdk/client-[\w-]+' -o --no-filename | sort -u

# 5 — IAM policy statements (catches the aspirational ones)
rg '"?(s3|ssm|sqs|events|bedrock):[A-Z]\w+' -o --no-filename | sort -u

# 6 — CI/CD steps (deploy targets never appear in app code)
rg 'aws-actions/' .github/workflows/

Each signal catches something the others miss. Declared infrastructure finds what exists but not what the code actually calls. SDK calls find the reverse — plenty of services are used without ever being declared, because they belong to a shared platform account and the application only holds a permission to reach them. IAM statements are the most interesting signal of all, because they catch intent: a permission is granted at the moment someone plans to use a service, which is rarely the moment the code ships.

The gap between "we have an IAM grant for it" and "we call it in production" is where every stale architecture diagram is born.

Run all six and you get two lists rather than one: services in use, and services merely referenced. Both are worth writing down. The second is shorter, more embarrassing, and considerably more useful.

Contents · forty-five services by job
01Compute & containers — five services 02Application integration — the event backbone 03Storage & databases — six, and the one that saves you 04Networking & delivery — two front doors 05Security, identity & config — the invisible seven 06Observability — seven services, one hard lesson 07AI & documents — Textract and Bedrock 08Delivery, email & governance — six services 09Referenced but not in use — the honest section RecapThe Through-Lines — what the shape of the list tells you

01 · Five servicesCompute & containers

The premise: most of the estate is serverless, and the one exception exists for a specific, defensible reason.

Lambda is the default compute everywhere. The single container platform runs a long-lived Node service that holds WebSocket connections open — a workload functions handle badly, and the clearest signal you will get for when to reach for a container instead. That one decision pulls in ECS, Fargate and a load balancer, none of which the serverless systems need at all.

AWS LambdaThe default compute. Every API handler, every event consumer, every scheduled job. Amazon Elastic Container Service (ECS)Orchestrates the one containerised service, deployed from CI by re-registering a task definition. AWS FargateThe launch type for those tasks — containers without managing the instances underneath. Amazon Elastic Container Registry (ECR)Holds both the ECS image and the container-image Lambdas — an easy dependency to forget you have. Amazon EC2Never as instances for application code — as NAT gateways, elastic IPs, security groups and a database bastion.

02 · Five servicesApplication integration & eventing

The premise: services announce facts; they do not call each other.

This group is the architecture. EventBridge carries every domain event, SQS gives each consumer a buffer and a dead-letter queue, and Firehose forwards the same stream into search so the events that drive the system double as its audit trail. If you read one group as a description of how the platform is put together, read this one.

Amazon API GatewayREST and HTTP APIs with custom domains and base-path mappings in front of the Lambdas. Amazon EventBridgeThe backbone — a bus per service, rules that subscribe by pattern, archives for replay. Amazon Simple Queue Service (SQS)Work queues, and a dead-letter queue on every consumer. The DLQ is not optional. Amazon Simple Notification Service (SNS)Alarm fan-out and notification topics — the thing CloudWatch shouts into. Amazon Data FirehoseBuffers the event stream into OpenSearch, with an S3 copy so a failed delivery is never a lost event.

03 · Six servicesStorage & databases

The premise: "the database" is rarely one thing, and the interesting entry is the connection pool.

Relational Postgres is the system of record. The entry worth dwelling on is RDS Proxy: Lambda's concurrency model and Postgres's connection limit are fundamentally incompatible, and a proxy is how you reconcile them without rewriting the application. Discovering you need it at two in the morning, under load, is a rite of passage best skipped.

Amazon Simple Storage Service (S3)Documents, static site hosting, infrastructure state, stream backup. Four unrelated jobs, one service. Amazon RDSManaged Postgres as the system of record, plus one SQL Server instance inherited from a legacy integration. Amazon RDS ProxyConnection pooling between hundreds of concurrent functions and a database with a hard connection ceiling. Amazon DynamoDBKey-value workloads that do not want a relational schema — and, separately, infrastructure state locking. Amazon ElastiCacheRedis behind the WebSocket layer, so a socket server can scale past a single task. Amazon TimestreamTime-series data that would bloat Postgres — request volumes and reference lookups over time.

04 · Seven servicesNetworking & content delivery

The premise: the network is the part nobody documents and everybody debugs.

Two different front doors live here, and the difference is the clearest architectural fault line in the estate: serverless traffic arrives through API Gateway and CloudFront, container traffic through an Application Load Balancer. Everything else — DNS, certificates, the VPC, cross-account routing — is shared underneath both.

Amazon Virtual Private Cloud (VPC)Private subnets for functions and tasks, with flow logs on. The base every other network service sits in. AWS Transit GatewayCross-account VPC attachments, so workload accounts can reach shared platform resources. Elastic Load Balancing (ALB)The front door for the container platform — health checks, target groups, TLS termination. Amazon CloudFrontCDN in front of the S3 origins that serve the web portals. Amazon Route 53Hosted zones and records for every API and portal domain, in every environment. AWS Certificate Manager (ACM)TLS certificates for CloudFront, API Gateway custom domains and the load balancer listener. Amazon API Gateway VPC LinkPrivate routing from API Gateway to a service inside the VPC — see the honest section below.

05 · Seven servicesSecurity, identity & configuration

The premise: this is the group people leave off the list, and the group that runs everything.

Parameter Store deserves special mention. It is not glamorous, but it is the mechanism by which stacks discover each other: shared infrastructure publishes every identifier it creates to a well-known parameter path, and each service template resolves those at deploy time instead of hardcoding an ARN. That one convention is what makes it safe to delete a service stack without taking a database down with it.

AWS Identity and Access Management (IAM)Execution roles, task roles, and CI deploy roles federated through GitHub OIDC — no long-lived keys. Amazon CognitoUser pools, app clients, resource servers and scopes behind every portal sign-in. AWS Secrets ManagerDatabase credentials and third-party API keys — the things that have to rotate. AWS Systems Manager Parameter StoreHow stacks find each other. Shared infrastructure publishes ids; service templates resolve them at deploy. AWS Key Management Service (KMS)Customer-managed keys, principally for cross-account database and object backups. AWS Security Token Service (STS)Every cross-account hop in CI and in the monitoring jobs. Invisible until it fails. AWS AppConfigFeature flags, with consumers that fail closed — a missing flag reads as off, never as on.

06 · Seven servicesObservability & operations

The premise: in a multi-account estate the hard problem is not collecting telemetry — it is looking at all of it in one place.

Metrics, logs and traces are per-account by default, which means an incident spanning two accounts means two browser tabs and a lot of clock arithmetic. CloudWatch's cross-account observability links solve this properly: workload accounts share telemetry into one monitoring account, and you investigate without account boundaries. It is the least-known service on this list and the one that changes an on-call shift the most.

Amazon CloudWatchAlarms and dashboards on every service. The alarms route to SNS, which routes to humans. Amazon CloudWatch LogsA log group per function and per container task, with retention set deliberately rather than by default. CloudWatch cross-account observabilityLinks workload accounts into one monitoring account. Investigate an incident without switching accounts. AWS X-RayDistributed tracing across the function chain — the only way to see where the latency actually went. Amazon OpenSearch ServiceThe searchable event archive Firehose feeds. Audit trail and analytics from the same stream. AWS CloudTrailThe account-level API audit trail. The record of who changed what, when nothing else has it. AWS ConfigConfiguration recorder and delivery channel — resource state over time, for drift and compliance.

07 · Two servicesAI & document processing

The premise: two very different shapes of AI workload, and the boring one earns more.

Textract is the unglamorous, high-value one: structured extraction from documents, running as an ordinary step in an ordinary pipeline. Bedrock covers the two cases Textract cannot — reasoning over extracted content, and a low-latency bidirectional speech model behind a voice interface. Notably, both are called as plain SDK operations from services that already existed. Neither required a new architecture.

Amazon TextractOCR and structured field extraction from invoices and shipping documents. Amazon BedrockModel inference for document understanding, and bidirectional streaming for a voice assistant.

08 · Six servicesDelivery, email & governance

The premise: how code reaches production, how the platform reaches people, and who is allowed to do either.

The split between Terraform and CloudFormation is deliberate, and covered at length in the infrastructure part of the workshop series: shared and stateful belongs to Terraform; per-service compute belongs to SAM. SES sits here rather than under integration because in practice it is a delivery concern — and because it does inbound as well as outbound, receiving mail into an ingestion pipeline through receipt rules.

Amazon Simple Email Service (SES)Outbound notification mail, and inbound receipt rules that turn an email address into an ingestion endpoint. AWS CloudFormationUnder every SAM stack, and the bootstrap stack that creates the state bucket and the OIDC roles. AWS Serverless Application Model (SAM)The deployment path for every Lambda service — one template, one build, one deploy command. AWS OrganizationsThe landing-zone account structure that separates management, shared services and workloads. AWS Resource Access Manager (RAM)Shares the transit gateway across accounts, so networking is defined once rather than per account. AWS Cost ExplorerQueried by API from a scheduled job, so the daily operations report carries yesterday's spend.

09 · The honest sectionReferenced but not in use

This is the part most inventories omit, and the part most worth writing. Several entries turned up with a fingerprint but no pulse — an SDK dependency with no call site, an IAM grant with no code behind it, a resource declared and then orphaned when the design moved on.

Why this matters more than the main list. Every one of these reads, to the next engineer, as a deliberate decision. A permission implies a plan. A dependency in package.json implies a call site. Someone will eventually build on the assumption and be wrong.

They cost something real, too: a standing grant nobody uses is access to a service nobody monitors.

The patterns are worth recognising, because yours will look the same:

The fix is not to delete them in a panic. It is to write them down, in the same document as the real inventory, so the ambiguity stops costing the next person an afternoon.


The Through-Lines

Read the list as a shape rather than as forty-five entries and a few things stand out:

  1. The plumbing outnumbers the product. Seven services in security and configuration, seven in observability, six in delivery — twenty of forty-five before a single line of business logic runs. Budget for this.
  2. One workload decided an entire group. A single long-lived socket server is why ECS, Fargate, a load balancer and Redis appear at all. Service groups follow workloads, not preferences.
  3. Managed glue beats custom glue. Parameter Store as a service registry, EventBridge as the integration layer, OIDC instead of stored keys. Each replaces something a team would otherwise hand-roll and then own forever.
  4. Boring services carry the most risk. Nobody draws Parameter Store or STS on the architecture diagram. Either one takes the whole estate down.
  5. An inventory needs a date and a method. Without both it is folklore. With them, the next person re-runs six searches and sees precisely what changed.

If a service on this page is new to you, the link next to it goes to the official developer guide — the one AWS maintains, not a blog post about it. That is the entire point of the format.

Want this done properly on your estate?

Inventories, landing zones, event-driven backends and the CI/CD to ship them. If you'd like a hand — or a production build done right — reach out.

✉️ Get in touch ← Back to workshops