HerokuのDyno(アプリケーションを実行するコンテナ)のIPアドレスは動的で、再起動などのタイミングで変更される可能性があります。これは一般的なWebアプリケーションの運用では問題になりませんが、連携先の外部APIがセキュリティ上の理由でIPアドレスによるアクセス制限を行っている場合、接続が許可されず問題となります。
本記事では、Herokuのアドオンを使い、アプリケーションから静的IPアドレスで外部APIにアクセスする方法を紹介します。
目次
- QuotaGuard Staticアドオンをインストールする
- 静的IPアドレスを確認し、ホワイトリストに登録する
- プロキシ経由でリクエストを送信する
- まとめ
1. QuotaGuard Staticアドオンをインストールする
Herokuには様々なアドオンがありますが、今回はアウトバウンド通信(内から外へのアクセス)のIPアドレスを固定する QuotaGuard Static アドオンを使用します。
まず、Heroku CLIを使って以下のコマンドを実行し、アドオンをアプリケーションに追加します。
# Bash (Heroku CLI)
heroku addons:create quotaguardstatic:starter
アドオンがインストールされると、プロキシサーバーの情報が QUOTAGUARDSTATIC_URL という環境変数に自動で設定されます。以下のコマンドで、その内容を確認しておきましょう。
# Bash
heroku config:get QUOTAGUARDSTATIC_URL
=> http://user:pass@proxy.quotaguard.com:9292
2. 静的IPアドレスを確認し、ホワイトリストに登録する
次に、アプリケーションに割り当てられた静的IPアドレスを確認します。ブラウザでHerokuの管理ダッシュボードを開き、対象アプリケーションの「Resources」タブにアクセスします。アドオン一覧に「QuotaGuard Static IP’s」が追加されているので、クリックしてQuotaGuardの管理画面に移動します。
ダッシュボードに表示されている「Your Static IPs」セクションに、2つのIPアドレスが記載されています。これが、お使いのアプリケーションに割り当てられた固定IPアドレスです。

この2つのIPアドレスを、接続したい外部APIのIPホワイトリストに登録してもらいます。(具体的な登録方法は、連携先サービスのドキュメント等をご確認ください。)
3. プロキシ経由でリクエストを送信する
注意点として、アドオンをインストールしただけでは、アプリケーションからの通信は静的IPアドレスを使いません。静的IPを利用するには、先ほど確認した QUOTAGUARDSTATIC_URL の値をプロキシとして指定し、リクエストを送信する必要があります。
以下は、RubyのHTTPクライアントライブラリ Faraday を使った実装例です。
# Ruby
require 'faraday'
# 環境変数に設定されたプロキシURLを指定してインスタンスを作成
conn = Faraday.new(proxy: ENV["QUOTAGUARDSTATIC_URL"])
# このリクエストは静的IPを経由して送信される
response = conn.get('https://api.example.com/data')
# これで無事にレスポンスが返ってくれば成功です!
うまくいかない場合の切り分け方法
もし外部APIへの接続に失敗する場合は、以下の手順で問題の原因を切り分けましょう。
- リクエスト先を、アクセスログが確認できる自分のサーバー(別のHerokuアプリやテスト用サーバーなど)に変更してリクエストを送ってみます。
- サーバーのアクセスログを確認し、記録された送信元IPアドレスが、ステップ2で確認した静的IPアドレスと一致するかを確認します。
- 一致している場合: アプリケーション側のプロキシ設定は正常です。問題は、連携先のIPホワイトリスト設定の不備(IPアドレスの登録漏れや反映の遅延など)である可能性が高いです。
- 一致していない場合: アプリケーション側の設定に問題があります。お使いのHTTPクライアントライブラリのプロキシ設定方法が正しいか、ドキュメントなどを再確認してください。
4. まとめ
HerokuのDynoは動的なIPアドレスを持ちますが、QuotaGuard Static アドオンを利用することで、簡単に静的IPアドレスからのアウトバウンドリクエストを実現できます。
外部サービスとの連携でIPアドレスの固定が必要になった際には、本記事で紹介した方法をぜひお試しください。
