I am new to Ansible and I bit confused if I can better use Vagrant to create VM instances (on EC2 and local virtual boxes) and use Ansible only for provisioning or if I can/should use Ansible to create EC2 instances and local virtual boxes.
Vagrant is a Virtual Machine Manager - I would use that for creating and managing your VM's. Ansible is intended for Configuration Management of machines - virtual or otherwise.
You could use Ansible to create VM's, then provision them, I suppose - Ansible has a shell module that you can use for anything - or use something like this. But Vagrant is a special purpose tool which does a huge amount of the VM housekeeping work for you - you would essentially end up manually recreating some of this tool in your Ansible playbooks.
I would strongly suggest using the best tool for each job. in this case that would mean using Vagrant to manage your VM's (VirtualBox, EC2, VMWare, whatever) - and then have Vagrant kick-off Ansible to configure them.