I have a scenario similar to what you described.
I also use AWS cloud, and the only differences from what you intend to do is that instead of remote DB services, I’m using AWS RDS (for mysql) and AWS DynamoDB instead in Mongo.
To have a high availability environment, you need to have at least 2 availability zones running your entire infrastructure, and to be scalable you need to separate the application layers into standalone services.
Speaking of DF, you need to divide it into at least 4 layers to keep it scalable horizontally (pre-requisite for high availability)
1 - Databases (AWS RDS / DynamoDB)
2 - Internal cache (AWS ElastiCache)
3 - Filesystem (AWS S3)
4 - Web application (AWS EC2 / ECS)
Each layer has the ability to scale independently, and doing so with AWS managed services, makes it easy to make each layer available in a multi AZ scenario, and saves setup and management work.
The Mysql Database in RDS has vertical / horizontal scaling capability (read replicas) and full support for multi zones with auto failover. The same occurs with ElastiCache (Redis / Memcached) and with S3 (storing frontend static and user files). In this way, your web application (PHP) will be free to scale without worrying about layers of persistence, having fully ephemeral instances. DreamFactory is perfect for this, the standard JWT tokens that it uses makes this work a lot easier.
Finally, you should configure the AWS ELB (Elastic Load Balance) optionally with Launch Configurations
and Auto Scaling Groups to maintain and split the web load between your EC2 / ECS instances.
I also recommend that you consider putting the AWS CloudFront (CDN) in front of your ELB, being the public layer of your DF API. This reduces the latency in the delivery of requests, reduces your internal traffic and improves the experience of your users.
If you have any further questions, post to us.