「heroku run」で発生するETIMEDOUTの原因と解決方法について

Macのローカル環境でRailsチュートリアルを進めていると，Herokuでマイグレーションが失敗してしまい，次のエラーが発生してしまいました。

```
〔ターミナル〕
　$ heroku run rails db:migrate
 　▸ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000

〔Herokuログ抜粋〕
　Error R13 (Attach error) -> Failed to attach to process
```

　解決方法は`「heroku run:detached」`を使用することであり，原因も「5000番ポートが使えない」ということであることが，調べると簡単に出てくると思います。

　ただ，「何故使えないのか」という背景が日本語で中々見つからず，このコマンドを使用することの不安感の高まりから，英語に向き合って調べたら安心を得るに至りましたので，同じ不安を抱えている方の参考になれば幸いです。

##＜調査結果＞
#○ 原因
　初めに`「heroku run」`の仕組みは，クライアントの5000番ポートでHerokuに接続することにより，クライアント側のコンソールに対してコマンドの入出力を実行可能にするものである。

　しかし，クライアント側において，ファイアウォール等のローカルネットワークに原因があり，Herokuからクライアントのコンソールに接続できない場合は，当該エラーが発生する。

##○ 解決方法
　`「heroku run:detached」`を使用することにより，コマンドがバックグラウンドで実行されることから，Herokuからの標準出力を受け取らないことで。5000番ポートに接続される必要がなくなるため，本問題が解決される。

　ただし，クライアント側のコンソールに実行結果が出力されなくなることから，正常に実行されたか表示されないため，`「heroku logs」`によりログ情報を確認する必要がある。

```
 〔参考入力結果〕
　$ heroku run:detached rails db:migrate
　　>Running rails db:migrate on ⬢ [Heroku登録のアプリ名]... done, run.5930 (Free)
　　>Run heroku logs --app [Heroku登録のアプリ名] --dyno run.5930 to view the output.
　$ heroku logs --app [Heroku登録のアプリ名] --dyno run.5930
　　>・
　　>・　#「heroku run:detached rails db:migrate」実行結果のログが表示される
　　>・
```
##○ 結論
　`「run:detached」`を使用しても，アプリの本番環境等に影響は無いでしょう。
　注意事項として，ローカルのコンソール上で実行結果が出力されないことにより，失敗時にエラーを見落とす可能性が残りますので，使用後は必ずHerokuのログで実行結果を確認しましょう。

　ただ，この解決方法では，根本の原因を解決しないことになり`「heroku logs」`の追加作業が発生し，解決するには「5000番ポート」の解放か，ファイアウォールの設定か，又はHeroku側の問題なのか…次の原因のための追加調査をする必要があります。
　しかし，追加作業と追加調査の作業労力を比較すると，私の現在の知識では`「run:detached」`を使用する方が費用対効果が高いため，ここで調査を終了します。
　今後，技術知識が増えたら適宜更新したいと思います。

※追伸
　私の英語力及び技術知識不足による言葉の誤用の可能性も考えられますので，記載内容に誤りがありましたら，ご指摘いただけると大変嬉しいです。


#＜参考情報＞
##○ 失敗したログ情報
```
〔コンソールの実行結果〕
　　$ heroku run rails db:migrate
　　　▸ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000
　　$ heroku run bash
　　　▸ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000
　　$ heroku run console
　　　▸ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000
```

```
〔Herokuログ（コマンドに対応したログ情報に加工）〕
　　$ heroku run rails db:migrate
	: Awaiting client
	: State changed from starting to up
	: State changed from up to complete
	: Error R13 (Attach error) -> Failed to attach to process
	: Process exited with status 128

　　$ heroku run bash
	: Awaiting client
	: State changed from starting to up
	: State changed from up to complete
	: Error R13 (Attach error) -> Failed to attach to process
	: Process exited with status 128

　　$ heroku run console
	: State changed from starting to up
	: Awaiting client
	: State changed from up to complete
	: Error R13 (Attach error) -> Failed to attach to process
	: Process exited with status 128
```

##○ 参考サイト
###[・Heroku公式サイト１：R13 - Attach error](https://devcenter.heroku.com/articles/error-codes#r13-attach-error)
　`「heroku run」`で開始されたDynoが，呼び出し側のクライアントに接続できなかった。

###[・Heroku公式サイト２：Timeout awaiting process](https://devcenter.heroku.com/articles/one-off-dynos#troubleshooting)
　`「heroku run」`は5000番ポートで接続するが，ローカルネットワーク等の理由で接続できない場合は，エラーが発生する。
　telnetを使用して5000番ポートで接続することにより，Herokuへの接続をテストできるが，出力が得られない場合，クライアント側でHerokuへのアクセスをブロックしている。
　この問題を解決するには，IT部門，ISP，又はファイアウォールの製造元に連絡することをお勧めする。

###[・Heroku公式サイト３：Running tasks in background](https://devcenter.heroku.com/articles/one-off-dynos#running-tasks-in-background)
　`「heroku run：detached」`を使用することによりバックグラウンドでDynoを実行可能である。 `「heroku run」`とは異なり，これらのdynosはクライアント側に出力する代わりにHeroku側のログに出力を送る。これらのコマンドからの出力を表示するには，`「heroku logs」`を使用する必要がある。

###[・Stack Overflow：Heroku rake db:migrate results in Error R13 (Attach error) -> Failed to attach to process](https://stackoverflow.com/questions/20926403/heroku-rake-dbmigrate-results-in-error-r13-attach-error-failed-to-attach-t)
 ※内容は，概ね公式サイト通りです。