I want to emphasize that I don't normally use counts, it's just one tool in the toolbox. Normally I try to isolate env specific apps to their own stack and I simply don't have a workspace for the env they're not deployed in. Assuming a traditional 3 tier env setup (which I don't do either -- I only have 2) it might look like:
Workspaces:
- PROD-us-east-1-All-the-VPC-stuff
- NAT count = 3
- PROD-us-west-2-All-the-VPC-stuff
- NAT count = 3
- PROD-us-east-1-Enterprise-Network-Tool
- var instance count = 2
- PROD-us-west-2-Enterprise-Network-Tool
- var instance count = 2
- STAGE-All-the-VPC-stuff (us-east-1)
- NAT count = 3
- STAGE-Enterprise-Network-Tool (us-east-1)
- var instance count = 1
- DEV-All-the-VPC-stuff (us-east-1)
- NAT count = 0 (maybe since we don't have the network tool we're transit vpcing or something else in dev)
It's a little contrived but the idea is that normally workspaces align to these borders:
- Env
- Cloud region (not always -- and the cross region ones are usually called out)
- Loosely de-coupled app border
Workspaces provide really easy "manholes" for servicing your IaC quickly when there's a mistake. They don't encourage you to manually change resources, but rather work in a smaller area and reduce blast radius. The issue I see with a lot of teams is when they're not sure how to handle cross-stack references or what they should output. I think that's an area for training and leveling up in TF.