ITエンジニアによるITエンジニアのためのブログ

Herokuアプリから静的IPで外部APIにアクセスする方法

HerokuのDyno(アプリケーションを実行するコンテナ)のIPアドレスは動的で、再起動などのタイミングで変更される可能性があります。これは一般的なWebアプリケーションの運用では問題になりませんが、連携先の外部APIがセキュリティ上の理由でIPアドレスによるアクセス制限を行っている場合、接続が許可されず問題となります。

本記事では、Herokuのアドオンを使い、アプリケーションから静的IPアドレスで外部APIにアクセスする方法を紹介します。

目次

  1. QuotaGuard Staticアドオンをインストールする
  2. 静的IPアドレスを確認し、ホワイトリストに登録する
  3. プロキシ経由でリクエストを送信する
  4. まとめ

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への接続に失敗する場合は、以下の手順で問題の原因を切り分けましょう。

  1. リクエスト先を、アクセスログが確認できる自分のサーバー(別のHerokuアプリやテスト用サーバーなど)に変更してリクエストを送ってみます。
  2. サーバーのアクセスログを確認し、記録された送信元IPアドレスが、ステップ2で確認した静的IPアドレスと一致するかを確認します。
  • 一致している場合: アプリケーション側のプロキシ設定は正常です。問題は、連携先のIPホワイトリスト設定の不備(IPアドレスの登録漏れや反映の遅延など)である可能性が高いです。
  • 一致していない場合: アプリケーション側の設定に問題があります。お使いのHTTPクライアントライブラリのプロキシ設定方法が正しいか、ドキュメントなどを再確認してください。

4. まとめ

HerokuのDynoは動的なIPアドレスを持ちますが、QuotaGuard Static アドオンを利用することで、簡単に静的IPアドレスからのアウトバウンドリクエストを実現できます。

外部サービスとの連携でIPアドレスの固定が必要になった際には、本記事で紹介した方法をぜひお試しください。