はじめに
AWS Transfer Familyを使ってFTPサーバーをPrivateLinkで別のVPCからアクセスさせたことはありますか?
私はあります。
その際に遭遇した問題と解決策についてご紹介します。
結論
FTPのパッシブモード用ポート8192~8200に対するNLBのターゲットグループのヘルスチェックは、すべてポート21宛に設定しましょう。
何故なら、ヘルスチェックをポート8192~8200に向けていた場合、ヘルスチェックのタイミングで、それらのポートを利用したデータ通信と競合し、通信を切断してしまうからです。
遭遇した問題
実際に私が遭遇した問題は以下のようなものでした。
- FTP接続は確立できる
- しかし、数キロバイトのファイルをPutしたにもかかわらず0バイトのファイルがTransferFamilyサーバー上に作成される
- 数キロバイトのファイルが存在していて、そのファイルを指定してGetしたにもかかわらず、0バイトのファイルがダウンロードされる
- 再現性が低く、時々しか発生しない
当初は稀なネットワーク不調かなと思っていましたが、調査を進めるとNLBのヘルスチェックとFTPのデータ転送が同じポートで競合していることが判明しました。
原因
FTPパッシブモードでは以下のポートが使用されます。
-
ポート21
- コントロールコネクション(コマンドのやり取り)
-
ポート8192~8200
- データコネクション(実際のファイル転送)
そして、問題発生に至る過程の一つに、次が考えられます。
- クライアントがファイル転送を開始
- Transfer Familyがポート8192~8200のいずれかでデータコネクションを確立
- NLBのヘルスチェックが同じポートに送信される
- データ転送のコネクションが切断される
- ファイル作成自体は完了するものの、中身が転送されず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!
