My strategy is as follows. In addition to considering what works and what doesn't, my practice is based on minimal future client interaction. You do not want to have to contact hundreds or even dozens of clients to have them coordinate some kind of change.
When not at the apex of a zone, I have a domain name I use specifically for this purpose. Let's assume my domain name that I used for these purposes is network.example.org
.
I have the client create a CNAME. If the hostname for the new site is client.example.com
then I have the client create a CNAME pointing to client.example.com.network.example.org
. Then, in Route 53, I create the client.example.com.network.example.org
hostname as an A-record alias to my ELB endpoint, or to CloudFront, or just an A-record to an elastic IP. (Or, I could make it another CNAME if I had some reason to. They do cascade.)
The significance of this configuration, again, is that I never have to ask the client to reconfigure anything. No matter how my network might change -- I need to move them to a different ELB, migrate them to a different region, etc., I can make the change in Route 53.
For zone apex, this is off the table, since CNAMEs are out of the question, but usually when a client wants to point a zone apex at my systems, the client isn't using that domain for anything else, anyway. If they were, they would probably not have pointed the apex at me... so I create the hosted zone in Route 53 and give them the 4 assigned name servers. In the event the client needs additional records, I add them in as a courtesy. (You can also create a Reusable Delegation Set in Route 53 using the API or CLI, for white-label DNS servers, giving the client ns1...ns4.example.org, instead of the "awsdns" hostnames, but this is probably not ideal if you're planning to do any geo/latency-based routing.)
When I explain to clients that my DNS is integrated with the rest of my platform, and allowing me to host their DNS provides me with the ability to automatically mitigate against outages and DDoS attacks by dynamically updating their DNS records, this is almost always an easy sell. I host the DNS and throw in MX records, of whatever they might need, which is rarely anything.
In one exceptional situation where the client was adamant about not only retaining control of the DNS, the site was at the apex, but also where the web site in question was to be accessible to their employees behind a firewall -- so they wanted the site to have a fixed IP address anyway -- I solved this dilemma with an EC2 instance with an Elastic IP address, which is a t2.micro running HAProxy and forwards the traffic to my back-end systems. HAProxy is so insanely well-written that this $10 machine served 896,392 http requests in the prior 24 hours and never exceeded 6% CPU utilization. (And it was also dynamically compressing text, css, and js on the fly, at that.) The customer created an A record pointing to the Elastic IP, which I can still re-map within the region if the circumstances require.
Of course, at the zone apex, if the client was using a DNS provider that supported some kind of "A-Name" record (like CloudFlare's "CNAME flattening") then I would revert to the "not at the apex" configuration and give them a destination in my domain named with their domain as a prefix, so I would retain the ability to modify the configuration without their intervention... but this has never come up.