参考 - https://devcenter.heroku.com/articles/quotaguardstatic
まずは無料プランをProvisionしてみる
C:\>heroku addons:create quotaguardstatic:starter
Creating quotaguardstatic:starter on ⬢ <アプリ名>... free
Your static IPs are [<IPアドレスその1>, <IPアドレスその2>]
Created quotaguardstatic-XXX as QUOTAGUARDSTATIC_URL
Use heroku addons:docs quotaguardstatic to view documentation
C:\>heroku config | find "QUOTAGUARDSTATIC_URL"
QUOTAGUARDSTATIC_URL: http://<ユーザ名>:<パスワード>@<リージョン?>-static-XXX.quotaguard.com:<ポート番号>
上記のQUOTAGUARDSTATIC_URLにブラウザでアクセスするとThis is a proxy server. Does not respond to non-proxy requests.
と表示された
ということはOutbound通信時に通すProxyかな(そうであればProximoから乗り換えできるかな)
Herokuのアプリ画面のアドオン一覧からQuotaGuard Staticの管理画面(※1)に進むとPrivacy Agreementへの同意を求められる
(管理画面には heroku addons:open quotaguardstatic でも行ける)
AgreeにチェックしてSave押下するとDashboard画面が表示される
<IPアドレスその1><IPアドレスその2>にブラウザでアクセスすると「アプリが見えると思った?もうちょっと設定が必要だよ」的なメッセージが表示される
以後、heroku addons:docs quotaguardstatic
でドキュメントを読みながら作業
先日ProximoでOutbound通信はできるようになっていた( https://qiita.com/pilot/items/35675c6a50ba9cc364ee )し、URLの形式も末尾にポート番号がつく以外は同じなので、参照する環境変数をPROXIMO_URLからQUOTAGUARDSTATIC_URLに変えてアプリを動かしてOutbound通信(Salesforce API呼出)をしてみたところ、Salesforce側のログイン履歴に<IPアドレスその1>または<IPアドレスその2>からのアクセスが表示されたのでうまく行った模様
QuotaGuard StaticのInbound ProxyはMicro以上のプランでないと使えないのでまた後日試す
以下、MicroプランでのInbound Proxy確認結果
https://dashboard.heroku.com/apps/<アプリ名>/resources にて、QuotaGuard StaticのModify PlanでMicroを選択してアップグレード実行
QuotaGuard Staticの管理画面(※1)にて右上のSettingsドロップダウンからSetupに進んで左側のInboundを押下、Create Inbound Proxyを押下(※2)、
Forwarding URL欄に現在のHerokuアプリのURL(※3)を入力( https://<アプリ名>.herokuapp.com ) してSaveを押下すると、Inbound ProxyのURL(※4)とそれをHerokuに伝えるためのheroku domains:addコマンド(※5)と「That Works For Me」ボタン(※6)が表示される
Windowsのコマンドプロンプトにてheroku domains:addコマンド(※5)を実行、
表示されたheroku domains:waitコマンドを実行 ※Windowsなのでシングルクォートをダブルクォートに書き換えた上で
しかし何故か「ACM is failing for 1 domain name (Incorrect DNS Settings)」とのエラーになるので、結局heroku domains:removeコマンドで削除してしまったが、動作に問題なし
ブラウザでInbound ProxyのURL(※4)にアクセスするとアプリの画面(※7)が見える
ただし、Create Inbound Proxyを押下(※2)してすぐだとまだ駄目なので、ちょっと時間をおいてから(最大10分)アクセスすればアプリの画面が見える
既存のURL(※3)でもアクセス可能
nslookupコマンドでInbound ProxyのURL(※4)内のドメインのIPアドレスを調べると、無料プランで発行されたアドレス2個と一致した
アプリ画面が見えたので「That Works For Me」ボタン(※6)を押しておく
以上
<追加1>
実はこの時点で見えたアプリの画面(※7)は https://qiita.com/pilot/items/11efce99be33f17f5bc3 による接続元IPアドレスチェックに引っかかったことによるエラー画面
QuotaGuard StaticのInbound Proxyを経由した場合、
request.getRemoteAddr()ではQuotaGuard Staticのアドレスが取得できるだけ
本当の接続元IPはX-Forwarded-Forヘッダで取得する
なので、接続元IPアドレスチェックを「X-Forwarded-ForヘッダがあればそのIPをチェック」と変更した
<追加2>
QuotaGuard StaticのInbound ProxyはSession Affinityと一緒に使用できない!
(Session Affinity用のSet-CookieヘッダにDomainとしてXXX.herokuapp.comが指定されているため。Domainの書き換えには対応できないとのこと。こねくり回してなんとなく動かしたがいまひとつ)
<追加3>
iPadで写真(2MBほど)を撮ってアプリにアップロードしようとするとエラー
https://qiita.com/pilot/items/9badd3e94fe48af1adb5 で調べるとどうもQuotaGuard Static Inbound Proxyのnginxから413 Request Entity Too Largeが返っている
nginxのリクエストサイズ制限はデフォルトで1MB
Herokuサポートにチケットで制限緩和を依頼したら512MBに設定変更してくれてエラーは解消した