🦅

fly.ioを通してポートの設定に関する理解を深めたお話

2023/05/11に公開1

以前の記事でfly.ioを使ってAPIサーバーを立てたわけだけれども、fly内で動いているアプリ内のポートに関してずぅっと頭を捻っていました
その結果、ちょっとポートに関して理解を深めたので書き記そうと思いたったという次第
要するにコンテナ内とホストを繋ぐポートフォワーディング設定についてのお話です

fly.tml内のポート番号指定箇所

flyの設定ファイルである、fly.tomlにはこんな感じの内容が書いてあります(ポート部分だけ抜粋)

[[services]]
  internal_port = 8080
  protocol = "tcp"
  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

自動生成されたtomlファイルにはポートを指定する場所が3つあって、internal_portと2つのservice.portsのどれをどういじるとどうなるのか?について実際に動かして試しているうちにわかったことをまとめようと思う。そういう記事

internal_portの設定

[[services]]
  internal_port = 8080

service内のinternal_portではコンテナアプリ内でのポートを指定しているらしい。Dockerfileのコマンドでapp.pyコードを走らせる時に、

CMD ["flask", "run", "--port=256", "--host=0.0.0.0"

ってしてあげると、"コンテナアプリ内でapp.pyが256番で待ってるよ"って待機しているので、このinternal_portを256番にする必要があるわけだ。一致していない時は、普通にヘルスチェックで落ちました。設定がダメみたい
名前からして、internal。コンテナ内でのポートだからinternalということらしい。理解した

service.portsの設定

  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

その次の[[service.ports]]では、実際に外部から受け付けるポート番号を設定する。
今回は普通のwebサーバーとしてのアプリケーションなので80番と443番。80番はhttpsに強制リダイレクトをかける感じの設定もしています。
httpでアクセスされた時、80番ポートにアクセスされたうえで、443ポートにリダイレクトされるという寸法。
実際に動いているサーバーでhttpでアクセスしようとしたら見事にhttpsにリダイレクトされました。なるほど

ちなみにポートとハンドラの設定をいじると下表のようにアクセスできたりできなかったりする。

開放するport 使えるhandlers httpによるアクセス httpsによるアクセス
80 [“http”] ×
80 [“tls”] × ×
80 [“http”, “tls”] × ×
443 [“http”] × ×
443 [“tls”] ×
443 [“http”, “tls”] ×

httpハンドラを受け付けるようにしたら、当然80番ポートの解放が必要だし、https通信したかったら443ポートを解放しなければいけない。
80番ポートだけを開放して、無理やりhttps通信を行おうとしても、どうにも動かないらしい
そういうわけで、自動生成される規定のtomlファイルには80番と443番の両方の設定があるわけだ。fly.ioの内部で規定がちゃんとされているんですね

80番ポートでhttpとtlsの両方を設定したときにアクセス不可になるのは、両方の設定が存在する時はhttpsアクセスを優先する設定になっていると思っている。だから80番でhttps接続を要求する形になって、アクセス不可になるんじゃないかしら?

要するにこういうこと

ホストとコンテナ内のポート番号の接続を図にしたものがこんな感じになる

内部で設定している1ポートに対して外部には複数のポートとして接続されている感じ。なるほどぉ
こんな感じにホストマシンのポートとコンテナポートを紐付ける機能をポートフォワーディングというらしい。確かにコンテナ起動時にホストとコンテナのポートを紐づける設定をコマンドオプションで入力してるあれですね

余談だけど、最近はものが増えすぎたせいで、”名前は知らんけどあーあれでみかけたやつね”っていうことが増えた気がする。名前って、ちゃんと意味とか動作を紐づけておかないと覚えづらいよね

おまけ: flyのデプロイができなくって首を傾げたお話

fly.ioで動かしていたアプリケーションのメンテナンスをしようとしたら、”クレジットカード情報を入力してください”という旨のエラーメッセージが出ました
おかしいなぁ?
Free Tireには3つまでのVMが含まれているので、大丈夫なはずなんだけどなぁ?と思ってドキュメントを見たらこんな文字が。

全部のプランでクレジットカード情報の入力が必要です”と。ほう、なるほど、そりゃぁ登録しないでデプロイしようとしたらエラーになるわけだ
(というかすでにデプロイされて動いているものは止めないでいてくれるのは普通に優しいと言えるのかもかしら。うん、やさしい)

Discussion

MelodyclueMelodyclue

fly.tomlをコピペしてデプロイしようとしたところハマっていたのですが、この記事で解決できました!