Because your projects are automated and reproducible via IaaC an environment could be simply considered a "version" of your projects.

Usual common environments naming are: dev, staging, preprod & prod, but really those are just common names, and could be of any kind.

So an environment, will be a call to your IaaC with different parameters; for example if you were to call our public Magento stack you might want in dev to make your environment smaller than the production one. In this terraform sample you would not enable multi-az on RDS, you would put only one front server, maybe with less storage too; whereas you would enable those in production and if you were to improve this stack, we could imagine an AWS Cloudfront component for content delivery, that would be enabled only for production too.

This highlights the concept of env shifting mentioned in IaaC, you could still have some for economic or technical reasons, but those would be much better controlled.