Answer
Postgres starts a process for each connection, so thousands of app instances should share a small number of connections through a pooler such as PgBouncer.
Also accepted: RDS Proxy, pgpool for PgBouncer.
Why
Each Postgres connection costs memory, and past a few hundred, throughput drops as connections compete. A pooler hands a real connection to a client only for the length of a transaction.