[Heroku]外部接続時に固定IP化する2つの方法[Proximo]


Heroku は、ご存じのとおりどこの Dynoで実行されるか不明のため、IPアドレスは一切固定化されていません。その為、外部システムとの接続において、「IPアドレスを固定化して欲しい」や「設定した複数のIPアドレスしか許可できません」といった場合、その対処の方法がありません。

では、Heroku から外部へ接続したい、という時に IPアドレスを固定化することはできないのでしょうか。否、次の 2つの方法があります。

1. Private Spaces を利用する
2. `Proximo` Add-on を利用する

## Private Spaces を利用する

単純簡単にお金で解決する方法です。`Heroku Enterprise` 契約では、`Private Spaces`を利用することができるようになります。これにより、US/EU以外の、たとえば Tokyo Region を利用することができたり、AWS VPC上に配置されるため、よりセキュアに制御可能になったりとします。利用可能なDynoや Private Spaces内で稼働する Add-on については制限はありますが、企業が、よりセキュアにHerokuの環境を持ちたいという際には、こちらがオススメです。

さて、 **Private Spaces** を利用すると、VPCに配置されるだけではなく、複数の固定IPアドレスも付与されます。次の Heroku Dev Center の記述通り、outbound の固定IPが4つまで割り振られます。

> All organization members can view the list of stable outbound IP addresses for a Private Space.
> 
> All outbound traffic from apps in a Private Space will originate from a small, stable list of IP addresses that are dedicated to the space. This allows you to use IP whitelisting to secure services being accessed by apps in the space. For example, you can configure a web services gateway in your corporate data center to only allow access from the IP addresses assigned to the Private Space. By using this in combination with TLS and application level authentication tokens, you get an extra level of security for protecting resources in your corporate data center.
[Heroku Private Spaces - Stable outbound IP addresses](https://devcenter.heroku.com/articles/private-spaces#stable-outbound-ip-addresses) 

## **Proximo** を利用する

すいません、`Heroku Enterprise` 契約は... という場合、[Proximo](https://elements.heroku.com/addons/proximo) という選択肢もあります。これは、Heroku 用のアドオンで、`Forward Proxy` 機能を提供します。金額によって、接続回数や帯域が制限されますが、最低料金は $5/Month からです。この場合では、2,000回/月 500MB/月までの制限になります。

使い方はアドオンを追加して、Proximo 経由で起動するように設定するだけです。

### **Proximo** アドオンの追加

追加する方法は二つあります。GUI か CUI かです。

#### Heroku Dashboard から

Heroku Dashboard から導入する場合は、`Resources` から、`Add-ons` に "Proximo" と入力しますと、次のようにプルダウンで表示されますので、そちらをクリックします。

![Screen_Shot_2016-10-02_at_12_39_15.png](https://qiita-image-store.s3.amazonaws.com/0/37263/9586bde5-7c99-2a7e-eeaf-bf8226b1d2e6.png "Screen_Shot_2016-10-02_at_12_39_15.png")

その後は、導入画面になりますので、`Plan name` からプランを選択して、`Provision` するのみです。カンタン。

 ![Screen_Shot_2016-10-02_at_12_39_33.png](https://qiita-image-store.s3.amazonaws.com/0/37263/0f267355-f9e1-e128-2d7d-122d0f608862.png "Screen_Shot_2016-10-02_at_12_39_33.png")

#### Heroku コマンドから

コマンドはもっと楽です。が、プラン名を調べてくる必要がありますね。下のサンプルでは、`Development`プランを指定しています。

```bash:heroku
$ heroku addons:create proximo:development
```

### **Proximo** を利用する

`Proximo` アドオンが追加できたら、それを利用するプログラムを指定するか、プログラム内で利用するかの二つの方法があります。

#### **Procfile** で起動方法を指定する

外部接続を積極的に行うアプリケーションは、`Worker Dyno` で開発されることが多いと思いますが、その Worker Dyno を起動する指示詞を、`Procfile` に追記してあげるだけで、その Worker Dyno は自動的に `Proximo` の割り当てた固定IPアドレスを利用します。

```ruby:Procfile
worker: bin/proximo bundle exec ruby bridge.rb
```

このケースでは、`bridge.rb` という Ruby アプリケーションを `Proximo` 経由で実行するように指定しています。`worker:` 指示詞のあとにある「 **bin/proximo** 」が「Proximo経由で実行しますよ」という合図です。今お使いの `Procfile` にこれを追加するだけです。

> Modify your Procfile to prepend bin/proximo to any command whose connections you would like to forward through your proxy:
> 

```ruby:Procfile
web: bin/proximo [your existing command]
```

> [Using the Proximo wrapper](https://devcenter.heroku.com/articles/proximo#using-the-proximo-wrapper)

#### プログラム内で利用する

アドオンを導入すると `PROXIMO_URL` 環境変数が自動的に設定されるので、各言語処理系にあわせて、Forward Proxy を、この環境変数で指定すれば良いだけです。例えば、`Ruby` ではこのように書きます。

```ruby:sample
require "rest-client"
RestClient.proxy = ENV["PROXIMO_URL"] if ENV["PROXIMO_URL"]
res = RestClient.get("http://api.someservice.com/endpoint")
```


こちらのリンク先に、各言語での指定方法のサンプルがありますので、参考になさってください。

> If you’d rather use Proximo as a standard HTTP proxy, use PROXIMO_URL on port 80. You can send HTTP or HTTPS requests through this proxy.
[Using the Proximo HTTP Proxy](https://devcenter.heroku.com/articles/proximo#using-the-proximo-http-proxy)