Herokuアプリも固定IPしたい
外部システムへ接続する際、「特定のIPアドレスからのアクセスのみ許可する」といったセキュリティ条件を提示されることがあります。
Herokuアプリケーションは通常、OutboundIPアドレス(外部システムから見ると接続元IPアドレス)は固定されません。
Enterprise契約してPrivate Space利用するという方法もありますが、(既にEnterpriseな場合を除くと)敷居が高いのではないでしょうか。
そこで Proximo というアドオンを利用して、カジュアルに固定IPを実現します。
Proximoについて
- 公式ページ
- 導入
- 使い方は下記の記事を参考にさせて頂きました
- アプリ全体で使う場合は、Proximoラッパーを
Procfile
に記述すればよいようです。 - アクセス先のアドレスが特定できるのであれば、
PROXIMO_MASK
指定で Proximoを経由するかどうか選択できそうです。
Python3で使う
https://devcenter.heroku.com/articles/proximo にPythonのサンプルも載っていて、urllib2
を urllib.request
に読み替えれば動きます。
が、せっかくなので urllib3
を使ったサンプルを作ってみました。
urllib3 を使ったサンプル
- 環境変数
PROXIMO_URL
は、下記のように認証情報を含んだURL形式で設定されます。
http://proxy:password@proxy-12-34-45-56.proximo.io
-
urllib3.ProxyManager
は認証情報(上記のproxy:password
部分)を解釈してくれないようなので、自力でBASIC認証ヘッダを付けて利用します。 -
PROXIMO_URL
が設定されていない場合は直接アクセスするようにしています。
import os
import urllib3
from urllib3.util.url import parse_url
from urllib3.util import make_headers
def get_http():
proximo_url = os.environ.get('PROXIMO_URL')
proxy_headers = make_headers(proxy_basic_auth=parse_url(proximo_url).auth)
if proximo_url:
return urllib3.ProxyManager(proxy_url=proximo_url, proxy_headers=proxy_headers)
else:
return urllib3.PoolManager()
if __name__ == '__main__':
r = get_http().request('GET', 'http://checkip.amazonaws.com/')
print(r.status)
print(r.data)
requests を使ったサンプル
- 上記urllib3を使ったサンプルと同じ動作を
requests
を使って実現 - httpアクセスモジュール色々ありますね
import os
import requests
def get_proxies():
proximo_url = os.environ.get('PROXIMO_URL')
if proximo_url is None:
return {}
return {'http': proximo_url, 'https': proximo_url}
if __name__ == '__main__':
r = requests.request('GET', 'http://checkip.amazonaws.com/', proxies=get_proxies())
print(r.status_code)
print(r.content)