9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【小ネタ】AWS Transfer Family サーバー(FTP)の前に NLB を置く場合のヘルスチェックは すべてポート21に向けよう

Last updated at Posted at 2025-11-11

はじめに

AWS Transfer Familyを使ってFTPサーバーをPrivateLinkで別のVPCからアクセスさせたことはありますか?

私はあります。

その際に遭遇した問題と解決策についてご紹介します。

figure01.png

結論

FTPのパッシブモード用ポート81928200に対するNLBのターゲットグループのヘルスチェックは、すべてポート21宛に設定しましょう。

何故なら、ヘルスチェックをポート81928200に向けていた場合、ヘルスチェックのタイミングで、それらのポートを利用したデータ通信と競合し、通信を切断してしまうからです。

遭遇した問題

実際に私が遭遇した問題は以下のようなものでした。

  • FTP接続は確立できる
  • しかし、数キロバイトのファイルをPutしたにもかかわらず0バイトのファイルがTransferFamilyサーバー上に作成される
  • 数キロバイトのファイルが存在していて、そのファイルを指定してGetしたにもかかわらず、0バイトのファイルがダウンロードされる
  • 再現性が低く、時々しか発生しない

当初は稀なネットワーク不調かなと思っていましたが、調査を進めるとNLBのヘルスチェックとFTPのデータ転送が同じポートで競合していることが判明しました。

原因

FTPパッシブモードでは以下のポートが使用されます。

  • ポート21
    • コントロールコネクション(コマンドのやり取り)
  • ポート8192~8200
    • データコネクション(実際のファイル転送)

そして、問題発生に至る過程の一つに、次が考えられます。

  1. クライアントがファイル転送を開始
  2. Transfer Familyがポート8192~8200のいずれかでデータコネクションを確立
  3. NLBのヘルスチェックが同じポートに送信される
  4. データ転送のコネクションが切断される
  5. ファイル作成自体は完了するものの、中身が転送されず0バイトになる

ヘルスチェックのタイミングとデータ転送のタイミングが重なった場合のみ発生するため、原因の特定に時間がかかりました。

正しい設定

NLBのターゲットグループ設定

すべてのリスナーに対してポート21でヘルスチェックを設定します。
ポート21をヘルスチェックに使ってもデータ転送を妨げることはありません。

リスナー       ターゲットポート    ヘルスチェックポート
ポート21       ポート21           ポート21
ポート8192     ポート8192         ポート21  ← これ!
ポート8193     ポート8193         ポート21  ← これ!
...
ポート8200     ポート8200         ポート21  ← これ!

私が遭遇した当時はドキュメントに明記されていませんでしたが、現在は公式に推奨される設定となっていました。

For an NLB, use port 21 for health checks, instead of ports 8192-8200.

誰かのお役に立てれば幸いです。

We Are Hiring!

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?