CF does have a lot of quirks (especially stacks locking up for various reasons, or rollbacks taking hours).
I find it easiest to run migrations when an application is first starting up (with an appropriate transaction lock so other instances won't cause the migration to run more than once), this way you don't have to do a lot of devops magic for it to work.