Heroku Private Spaceへの移行

Feb 26, 2019 21:26 · 1830 words · 4 minute read

仕事でHerokuに作成していた既存アプリをPrivate Spaceへ移行した。実際に作業したのは数ヶ月も前であるが、先ほど移行手順が記載されたHerokuのドキュメントを見ようとしたらリンクが切れていたようだったので、ここに移行時のメモを残しておくことにした。

だいたいの手順は以下の通りである。

  1. Private Spaceに既存アプリと同等のものを事前に作成する
  2. PostgresqlとRedisのデータを移行する
  3. カスタムドメインを切り替える

以下で詳細を記載する。

Private Spaceに既存アプリと同等のものを事前に作成する

Migrate apps and data to or from a Private Spaceにも記載されている通り、既存アプリを自動でPrivate Spaceへ移行する機能はないため、事前にPrivate Space上に既存アプリと同等のものを作成する必要がある。Postgresなどのアドオンも同様である。
ただし、Private Spaceでは固定IPが付与されるためProximoが不要になるなど、そのまま全て移行できるわけではない(この場合はProximoを使わなくて済むからむしろ嬉しいものだが)。

PostgresとRedisのデータを移行する

既存アプリをメンテナンスモードにしたら、PorstresとRedisのデータを移行する。
Postgresに関しては、Migrating Heroku Postgres Databases to Private Spacesを参考にした。Private Space上に既存Postgresのfollowerを作成し、全ての修正を取り込んだ後、unfollowしてPrivate Spaceでpromoteする、という流れである。
Redisに関しては、Redis Cloudを使用していたので、既存のRedisのURLをインポート時に指定するだけでデータ移行できた。なお、Heroku Redisについては、ドキュメントMigrating from a premium Redis plan to a private Redis planがあるのでこちらを参考にすると良さそうだった。

カスタムドメインを切り替える

以下、カスタムドメインとAutomated Certificate Management(ACM)を使用するのを前提とする。
Heroku上で同じカスタムドメインを同時に取得できないため、一度既存アプリのカスタムドメインを削除してからPrivate Space上の新アプリでカスタムドメインを取得する必要がある。また、DNSの向き先を新アプリに向けた後にACMは有効になる。これらはメンテナンスページも表示できないダウンタイムが少なからず発生することを意味する。基本的には、ダウンタイムが発生することを考慮の上、上記手順でカスタムドメインを切り替えてから新アプリでACMを設定すればよい。

なお、今回の場合、既存アプリの前段にCloudFrontを使っていたのを利用して、メンテナンスhtmlを配置したS3の静的ウェブサイトにCloudFrontからの全てのアクセスを一旦向けるようにした。また、Let’s EncryptのDNS-01で事前に証明書を取得しておき、それを新アプリに設定しておいた上で、DNSの向き先を新アプリに向けてACMを有効にした。これらによって、少なくともメンテナンスページも表示できないような状態を回避した。

感想

Private SpaceではTokyoリージョンが使えるので、画面表示時のレイテンシを約2, 3秒ほど削減できた。これだけでも、Enterprise契約してPrivate Spaceへ移行してよかったと思った。話はそれるが、Enterprise契約するとCSへの問い合わせを日本語でできるようになる。日本語で問い合わせできるのは気が楽だし、CSの方々はレスポンスが早く回答も的確でとても頼りになるので、CSを積極的に利用するのもおすすめである。
なお、リンクが切れていたのだがPrivate Spaceへの移行手順をまとめたドキュメントがどこかにあるはずなので、実際に移行するとなった場合には問い合わせてそのドキュメントを手に入れるのが良い。

一方、Private Spaceではデプロイ時の挙動が変わっており、この挙動の変化とアプリの食い合わせによっては移行後に別途対応が必要な場合も発生する。ここでは詳細は書かないが、上記を起因としてデプロイ直後にJSやCSSが数分間適用されなくなるといった現象が発生し別途対応を行った、ということがあった。事前にローリングデプロイの挙動などについても確認しておいた方が良いと感じた。