タグ別アーカイブ: Private Space

Heroku Enterprise版 Private Spaceへの移行

この度Heroku Common RuntimeからPrivate spaceへの移行案件があり、移行手順を統括的に説明した記事が少なかったように見受けられたのでまとめてみました。

Private Spaceとは

Heroku Enterprise版の機能のひとつでその名の通りプライベートのランタイム環境にて動作できるようになるというものです。
AWSのVPCを利用してその内部にコンテナを展開する仕様となります。

Private Spaceのメリット

1.東京リージョンが選択可能

大幅なレイテンシーの向上が見込めます。
また、日本国内での稼働になるため企業コンプライアンスにより海外サーバでのサービスを制限している企業でも使用できるようになります。

2.Heroku Postgres Private Planの利用

Common Runtimeで利用するHeroku Postgresはインターネット上に公開しており、データベース名、ユーザー名、パスワードを知っている人であれば容易にアクセスできますが
Heroku Postgres Private PlanではデータベースをPrivate Spaces内に設置することになるため直接データベースにアクセスすることはできなくなります。

3.Private Dynoの利用

Common Runtimeで利用するDynoは同じ実行環境に配置されている他のユーザーとの共有になりますが、Private Spacesで使用するDynoはすべて専有型となります。

4.Salesforceとのデータ連携

Heroku Connectを使用することによりSalesforceとHeroku Postgresを双方向にデータ同期することができるようになります。
企業がPrivate Spaceを導入する理由として一番大きなもの(らしいです。)

Private Spaceの導入

・Heroku Enterprise版の契約

その名の通り、Salesforceと法人契約を結ぶことになります。
(利用者も法人である必要があります。)
Salesforceと年間契約し、契約期間も決まっており契約するには直接お問い合わせし、お見積りを取ります。

・Enterprise版のセットアップ

晴れて契約が完了するとご契約者様宛にEnterpriseの契約がスタートしたメールが届きます。
契約されたメールアドレスでもう既にherokuアカウントをお持ちなら紐付けがされているのでログインいただくとEnterprise版のTeamにアクセスできるようになります。

・appsの移動

既存のアカウントで作成したappsをEnterpriseアカウントに移動させる必要があります。
初回だとTeamTOP画面にTransfer existing appsというのがあるのでこちらで一発で移行でき、特にダウンタイムもなく一瞬で反映されます。
丸々移行させるため、この時点では特にAdd-onも再設定する必要はありませんが、Enterprise版になると支払い方式が変わるのでエラーが発生する可能性があります。
Enterprise版はお問い合わせが充実しているので、20分悩んでわからない場合サポートに確認したほうがよいでしょう。
このあたりはさすがherokuといったところでCommonRuntime契約同様にサクサク作業できます。

・Private Spaceの作成

TeamのSpace画面のCreate a spaceからSpaceをクリックで10分ほどでSpaceが完成します。
Space Nameに一意の名前を付けます。
今回はもちろんSpace Regionを東京に設定したわけですが、さすが東京リージョンといったところで結果として大幅なレイテンシーの向上が確認できました。

Shieldの設定については今回DBを日本で管理するというのが目的のためOFFで作成しました。
Private SpaceのShieldを設定することで、様々な業界の規制準拠を担保してくれるよというものです。
仕組みとしてはShield Private SpaceではShieldタイプのdyno、HerokuPostgres、Apache Kafka on Herokuプランを使用することにより
よりより厳格なTLSを使用、監視を実行することで通常では保存規制のあるデータや通信をクリアするらしいです。

・Private Space内でのapp作成

Private Spaceが完成しましたら次にappを作成します。
ここもHerokuらしくサクサク作成できます。
Space名をクリックし、Create a spaceをクリック
App Nameに一意の名前を付ける
App owner Enterprise版のTeamを選択
Choose a region or a Private SpaceでPrivate spaceを選択
でapp作成完了です。

あとはProcfile含めたデータをデプロイし、DBをリストアしたらこちらで一通り移行は完了です。

Heroku Postgresへのアクセス

ここで一つ、common runtimeのやり方では対応できないことがあります。
Private SpaceのHeroku Postgresはセキュリティ上heroku pg:psqlでは接続できません。

アクセス方法としては3つあります。

・Trusted IP Ranges アクセス元のIPアドレスホワイトリスト登録

SpaceのダッシュボードにあるタブのNetworkからIPアドレスを登録できるのですが、
This is a beta feature. Open a ticket at help.heroku.com to request to have Trusted IPs for data products enabled.
と記述があり、
https://devcenter.heroku.com/articles/private-spaces#trusted-ip-ranges-for-data-services
ドキュメントにも穴を開けてほしかったら申請してくださいね
との記載があるように推察ではありますがheroku側としてもあまり使用してほしくない機能なのかなと思ってます。
そのことから本番環境ではあまり使用しないほうが良さそうです。
固定IPでないとIPが変わったら都度都度申請しないといけないことになりそうですし。

・PrivateLink Amazon PrivateLink で接続

Amazon VPCをすでに利用していればこちらが良いでしょう。
Heroku Private Space 側に PrivateLink のエンドポイントを作成し、
作成されたエンドポイントへ Amazon VPC 側から接続するというやり方です。
今回はクライアント様もオペレーション上、DBに接続する必要がありAWSの把握も必要になるので却下しました。

・MTLS アクセス元からTLS証明書で接続

IPアドレスのホワイトリストを作成し、そのIPからアクセスするというのは上記で説明したTrusted IP Ranges for data servicesと同じですが、
クライアント証明書を使用し相互TLSによりアクセスします。
Shield Postgresへも接続ができ、手元のDB管理端末からpsqlコマンドで接続することも可能なため本番環境ではこちらを使用するのが良さそうです。

今回はこちらのドキュメントを参照しながら進めました。
https://devcenter.heroku.com/articles/heroku-postgres-via-mtls#configuring-mutual-tls-and-whitelisting-your-ip

mtlsのインストール

$ heroku plugins:install mtls

mtlsを有効にします。

$ heroku data:mtls:create DATABASE_NAME --app APP_NAME

DATABASE_NAMEは接続しているpostgresの名前
Enabling Mutual TLS will allow external access to this restricted data service. This action will be logged. Continue?
と出るのでyesを選択
「相互TLSを有効にするには、通常5〜10分かかります。」
とのことで、

$ heroku data:mtls DATABASE_NAME --app APP_NAME

で進捗確認できますが、
完了になったらメールが届くのでコーヒでも飲みながら待ちましょう。
postgresの管理画面にSecure External Access is enabledと表示されるようになります。
(赤文字で表示されるのでちょっとドキっとします笑)

外部IPの許可リストを作成

$ heroku data:mtls:ip-rules:create DATABASE_NAME --app APP_NAME --cidr CIDR_BLOCK --description "DESCRIPTION"

CIDR_BLOCKに許可IP
DESCRIPTIONに説明(”でくくる)
通常、外部IPの許可リストを作成するには数分とのことで、次のコマンドで進行状況を追跡できます。

$ heroku data:mtls:ip-rules:get DATABASE_NAME --id IP_RULE_ID --app APP_NAME

IP_RULE_IDは作成後に発行されるID

$ heroku data:mtls:ip-rules DATABASE_NAME --app APP_NAME

で許可されているIPを確認できる

削除は下記コマンドで実行できました。

$ heroku data:mtls:ip-rules:delete DATABASE_NAME --id IP_RULE_ID --app APP_NAME

(削除も若干時間がかかりそう)
使わなくなったIPは削除するようにしましょう

クライアント側の証明書の設定
postgresのクライアント側証明書を表示

$ heroku data:mtls:certificates DATABASE_NAME --app APP_NAME

Postgresにアクセスするための必要な証明書をダウンロード

$ heroku data:mtls:certificates:download DATABASE_NAME --id CERTIFICATE_ID --prefix PREFIX --dir DIRECTORY --app APP_NAME

PREFIXはダウンロードするファイルの接頭辞
DIRECTORYはファイルをダウンロードするディレクトリ(相対パスでいけました。)
クライアント証明書はIP違えどすべて同じものを使用できます。

環境変数を設定する(Windowsはset)

$ export DATABASE_URL=heroku config:get DATABASE_URL -a APP_NAME
$ export PGSSLCERT=DIRECTORY/PREFIXpostgresql.crt
$ export PGSSLKEY=DIRECTORY/PREFIXpostgresql.key
$ export PGSSLROOTCERT=DIRECTORY/PREFIXroot.crt

PostgreSQLのSSLサポートについてはこちら
https://www.postgresql.jp/document/9.4/html/libpq-ssl.html

こちらでMTLS接続設定は完了です。
psql postgres:〜
で接続できるか試してみましょう。

ここまでがPrivate Spaceでの立ち上げの流れになります。
今回Enterprise版含めたPrivate Spaceには初めて触ることになったのですが、
Herokuらしく面倒な設定はほとんどなく一度フローを把握できれば
すぐ対応できる内容となっています。(Addonの追加には若干手間取りましたが。。)

通常のheroku操作に慣れた方は理解も早いかと思います。
これだけの機構がそろった環境をアンマネージドで構築しようとしたら
なかなかの労力(構築もそうですが、検証や申請などもあるでしょう)なので、信頼性を担保できる環境があるPrivate Spaceは
ひとつの選択肢かなと実感しました。