See it as a diagram
Everything below, as a diagram you can edit. Describe yours and see it in seconds.
No account needed · Editable canvas, not a picture
The three tiers are not three subnets
A tier is a logical layer: presentation, application logic, data. A subnet is a placement decision. They correlate but they are not the same axis, and conflating them produces the diagram where a reader cannot tell whether the middle box is a subnet, a service, or a team.
The layout that survives review is a grid. Tiers are the rows, availability zones are the columns. The web tier row holds CloudFront and the load balancer, the application row holds the compute in private subnets, the data row holds the database in isolated subnets with no route to the internet gateway. Each private row appears once per availability zone, which is exactly how the resiliency question gets answered without a sentence.
Two availability zones is the right default for the diagram even when you run three. The point of drawing more than one is to show that the subnets, the Auto Scaling group, and the database standby are spread; a third identical column adds width and no information. If you run three, say so in a label on the VPC zone.
The icon for every box
Front door: Route 53 for DNS, CloudFront for the CDN, AWS WAF attached to the distribution or the load balancer, and AWS Certificate Manager for the TLS certificate. Certificate Manager is worth drawing on the listener rather than floating in a corner, because where TLS terminates is a real architectural fact.
Web and application tier: Elastic Load Balancing for the ALB, EC2 for instances, EC2 Auto Scaling for the group, and Fargate or ECS instead of EC2 when the compute is containers. S3 holds the static assets that CloudFront serves, which is why S3 appears in the web tier and again in the data tier on plenty of real systems.
Data tier: RDS or Aurora for the relational store, ElastiCache in front of it when there is a cache, and Secrets Manager beside the application tier for the database credentials. Network plumbing has its own icons: VPC, internet gateway, NAT gateway, and route tables, all of which ship in the AWS set as resource icons rather than service icons.
Datadef carries 439 AWS icons inside a library of 2,098 files, so every service named above resolves by typing its name. Type the abbreviation instead and results get less reliable: the index stores aliases per icon, so sqs and vpc land exactly, while a bare s3 falls through to name similarity and offers S3 on Outposts. If you only need the file, the AWS icon collection has it, and the per-service pages like the EC2 icon carry the naming variants people actually search.
Service icons and resource icons are different things
Answer the four questions reviewers always ask
Where does TLS terminate. Put the certificate on the listener and label the listener port. If TLS terminates at CloudFront and the origin connection is also HTTPS, draw both legs and say so, because the alternative implies plaintext inside your own network.
Can the database be reached from the internet. Show the database subnets with no internet gateway route and no public IP, and draw egress for the application tier through the NAT gateway rather than through the database row. A route table label does this better than a paragraph in a wiki.
What happens when one availability zone fails. The Auto Scaling group spanning both columns and the RDS standby in the second column answer it visually. If the standby is a read replica rather than a Multi-AZ standby, label it, because failover behaviour differs and readers will assume the safer one.
Where do secrets live. One Secrets Manager node next to the application tier, with an arrow to the database, closes a whole class of review questions about hardcoded credentials.
Draw it once, then stop redrawing it
Describe the stack in a sentence and Datadef places the real icons, the subnets, and the availability zone columns on an editable canvas. Move nodes, rename them, add the pieces the description missed, then export to PNG or JPEG for the deck.
If the stack is defined in Terraform, connect the repository instead. Read-only access to GitHub, GitLab, or Azure DevOps, a branch or a tag, and every .tf file is parsed as text: no terraform init, no state file, no cloud credentials. Directories of .tf files become module units, a unit nobody references as a module source is a root stack, and references inside expressions resolve to the resources they reach, which is the edge set of the real architecture. Variables and locals are followed rather than evaluated, so the parser chases what a value is wired to and never tries to compute it.
Three of those behaviours matter specifically for a three-tier diagram. Multiplicity is resolved rather than ignored: a subnet resource with count over a list of availability zones comes back as a real number, and where a for_each is driven by a variable bound differently per environment the node carries the honest per-environment count, drawn as "per subnet_cidrs (DEV 2, QUAL 1)" instead of a single misleading box. IAM roles, policy attachments and security group associations are classified as wiring and never become nodes, because on a three-tier stack they outnumber the tiers. And a subnet points at its VPC through a container attribute, so containment is drawn as nesting rather than as an arrow. See repo to diagram for the rest of the parse.
One markdown line puts the live image in the service README, so the picture in the repo is the current one rather than a screenshot from launch week.
FAQ
Should a three-tier AWS diagram show subnets?
Which icon do I use for an Application Load Balancer?
How many availability zones should the diagram show?
Do the internet gateway and NAT gateway belong on the diagram?
What is the difference between an AWS service icon and a resource icon?