I figure the correct way is that you build for "the cloud" aka someone else's computer. This means that don't use their proprietary offerings to do so unless absolutely necessary.
If you don't use their proprietary offerings, you lose most of the benefit of going to the cloud over being on prem.
If all you're doing is hosting a bunch of VMs on the cloud, what's the point?
Yes, be mindful as a developer I do take a few common sense steps...
1. ElastiCache uses the Memcached protocol so you're really not tying yourself to anything.
2. Lambda - think the "ports and adapters" pattern. Treat your Lambda function as a controller and keep all of your business logic separate.
3. Logging - all of our logging that goes to CloudWatch goes through Serilog. We can switch out the sink easily enough to anything.
4. Simple Queueing System - don't have calls to SQS all over your code, have it in one central module (in our case a Nuget package).
5. Autoscaling - have a shutdown method and wrap the calls that check when your instance is being shut down as events.
6. AWS KMS - We use Hashicorp's Vault and use AWS as a "backend".
7. Cognito - authentication. It's just Middleware for .Net Core that creates a principal before every request. It would be quite easy to add another piece of middleware.