主旨
タイトルの通り、AWS Batch の Docker のネットワークモードはデフォルトで host になっており、変更不可らしいです。気をつけましょう。気をつけます。
経緯
現象
AWS Batch を利用してバッチ処理をしています。
コンテナの中で、特定のポートでサービスを立ち上げ、それを使いつつ処理をするものになっています。
ある日、その処理が正常に行われませんでした。
どうやらその処理に必要なサービスが起動していなかった様子。
ログを確認してみると、
Adress already in use
と出ています。
つまり、そのポートは既に別のサービスが使っているのでサービスを立ち上げられませんよ、ということ。
そこで、
ss -ltunp
してポートの様子を確認したり、ps aux
して立ち上がってるプロセスを確認したり、数秒 sleep
してみたり、nc -z
でポートがlistenしてるかチェックしたり…
いろいろやってみますがいまいちよくわかりません。
それからこの挙動、起こったり起こらなかったりします。
もうわけわからん! となっていたそのとき、こちらの記事に出会うのです。
一括メール送信のバッチ処理をAWS Batchで構築した時につまずいたこと
ジョブを2つ同時に実行したところ、片方のジョブが「fatal: bind 127.0.0.1 port 12345: Address already in use」というエラーが出力され、メールを送信できませんでした。
・・・
コンテナのネットワークモードがhostになっていたため、コンテナ間でポートの競合が発生していました。
これか!?
ネットワークモードが host ???
結論
ということで、結論こういうことみたいです。
- Dockerのネットワークモードがhostだと、コンテナ内のポートはインスタンスのポートとイコールになるため ("ポート番号が" ではなく "ポートが" です)、他のコンテナが既にこのポートを使っているとき重複してそのポートでサービスを立ち上げることはできない
- この挙動が起こるときは、同じサービスを起動している別のコンテナが既に同じインスタンス上にいるとき
ネットワークモードhost についてはこちらの記事が参考になりました。
Docker の bridge と host ネットワークについて勉強する
とりあえず、同じポートを利用するコンテナが並列で動かないようにスケジュール設定をすることで今回の問題は解消されました。もっと本質的な改修は必要そうですが…
念のためAWSさんにお伺いしたところ、
たしかに AWS Batch の Docker のネットワークモードはデフォルトで host になっていて、ユーザーが変更することはできないみたいです。
また変更できるように改修する予定は今のところないが、要望は上がっているそうです。
まとめ
AWS Batchを利用する場合、というより Docker のネットワークモードhostを利用する場合、
Dockerのよさである "Run anywhere" 性が失われてしまうので注意が必要ですね。
それからどこかで読んだと思うのですが、AWS Batch がネットワークモードを host にしているのは、
bridge のように仮想ブリッジを用意したりする必要がなく、行いたい処理に対してできるだけ多くの計算リソースを割くことができるから、ということかもしれません。
もともと大規模な計算向けのサービスですから、考えられた結果 host に設定されているのでしょう。
これまで Docker のネットワークモードを意識する機会があまりなかったので勉強になりました。
精進いたします。