TL;DR
The "No preference (default subnet in any Availability Zone)"
is only available for the Default VPC (and only for AWS accounts that do not support EC2-Classic). This option is not available for non-Default VPCs.
The reason is for legacy compatibility with EC2-Classic (even if your AWS account does not support it).
Detailed Explanation:
When you launch an EC2 instance (whether by command line, SDK, or GUI), the ec2:RunInstances
command takes as input a subnet ID (and not a VPC ID). In the AWS Management Console, you do select a VPC, but that's only to filter the subnet selection control. The VPC selected does not make its way to the ec2:RunInstances
command.
In the past, the subnet ID was optional, and if omitted, would launch the new EC2 instance in EC2-Classic (ie. outside of any VPC). So in the past, if you wanted the instance launched in a VPC, you must specify a subnet ID.
With newer AWS accounts, AWS has removed support for EC2-Classic and replaced it with the "Default" VPC. To keep software/scripts/etc. backward-compatible with EC2-Classic accounts, omitting the subnet ID is still permitted in newer AWS accounts and would launch the EC2 instance in the Default VPC in a default subnet.
But aside from all that, they want you to specify a subnet ID when launching in an VPC.