[Heroku] Guzzleを使用してProximo経由で接続する

Herokuにて、外部APIに接続する際に固定IPにて接続したいことはたまにある。
以前、QuotaGuard Staticを使用してのやり方は書いたけれど、今回はProximoを利用した際に少しハマったのでメモ。

Proximo

Proximoは一番下のプランでも$5/月かかる有料アドオンとなっている。

Guzzle

以前の記事ではCURLで接続していたが、今回はGuzzleを使って接続してみる。

proxy経由で接続

ドキュメントを確認すると、以下の方法でプロキシを指定可能、とのこと。
http://docs.guzzlephp.org/en/stable/request-options.html#proxy

1
$client->request('GET', '/', ['proxy' => 'tcp://localhost:8125']);

ProximoをHerokuに追加すると、環境変数に自動的にプロキシのURLが追加される。

1
PROXIMO_URL=http://proxy:your-password-here@proxy-xx-xxx-x-xxx.proximo.io

上記URL内の、xx-xxx-x-xxxの部分の数字が固定IPとなる。
(ダッシュボードからも確認可)

これをそのままproxyのURLとして指定してやればOK…だと思ったのだが、エラーが出てしまった。

cURL error 56: Proxy CONNECT aborted

QuotaGuard Staticのアドオンを追加した際に取得出来るURLを同じように指定してやったところ、問題なくアクセス出来たので、Guzzleは悪くなさそう。
ProximoだとURLをパースしたりとかが必要なのか…など悩んでいて、URLを見比べていると、ProximoのURLにはポート番号がついてないことに気付く。

改めてドキュメントを確認してみると、ポート番号は80で固定、とのこと。

If you’d rather use Proximo as a standard HTTP proxy, use PROXIMO_URL on port 80.
https://devcenter.heroku.com/articles/proximo#using-the-proximo-http-proxy

よって、環境変数に追加されたURLの最後に :80 とポート番号を追加してやると、無事、アクセスすることが出来た。

1
2
3
4
5
6
$proxy_url = env('PROXIMO_URL') . ':80';
$res = $client->request('GET', 'http://ip.jsontest.com/', [
  'proxy' => $proxy_url
]);
$res_body = json_decode($res->getBody(), true);
var_dump($res_body);

Proximoの固定IPがJSON内に返ってきたらOK。

ポート番号がデフォルトでは入っていないため、少しハマってしまった。

参考

   このエントリーをはてなブックマークに追加