s3tftpd v0.5.0

s3tftpdのv0.5.0をリリースした.使っているAWS SDK GoをV2にアップデートして,Amazon EKSなどweb identity tokenでAWSクレデンシャルが渡ってくる環境で何も設定をせずに動くようになった.

TFTPというファイル転送プロトコルは,ネットワーク機器のファームウェア更新などに使われている.送信側が1パケット送るごとに受信側からACKが返ってくるのを待つ素朴な作りなので,高々\text{blocksize} / \text{rtt}の転送速度しか出ない(既定のブロックサイズは512 Bだから,RTTが5 msなら0.8 Mbpsだ).そういうわけでTFTPサーバはクライアントからできるだけ近いところにあるのが望ましいのだけれど,いろんなところにファイルをコピーするのは面倒だ.だいいちファイルサーバほどオンプレで管理したくないものはない.s3tftpdを使うとクライアントからはTFTPのリクエストを受けて,実際にはAmazon S3からファイルを取ってきたりS3にファイルを書いたりできる.

そういう課題を解決したくて作ったけれど,いまだとMountpoint for Amazon S3とふつうのtftpdを組み合わせれば同じようなことができるはず.設定の簡潔さではまだs3tftpdにも存在意義があるか.

Web identity tokenをうまく扱えないらしいのは,RubyKaigi 2023で使う機材をキッティングしてたときにCisco WLCのファームウェアをアップデートしようとしてた人が見つけてくれたのだけど,s3tftpdをEKSに置いてインターネットVPN越しにファームをダウンロードしようとするものだから永遠に終わらない……と泣いていてそりゃそうだと笑った(WLCのアップデートパッケージは500 MB弱ある).

ちなみに,TFTPはクライアント側がRFC 2348の拡張に対応していれば,サーバとネゴシエーションしてブロックサイズを伸ばすことができる.裏技: サーバ側がクライアントからのACKを待たずに次のパケットを送りつける脱法的な荒業によってダウンロードを加速できることも知られていて,s3tftpdは--anticipateというオプションで実装している.

中で使っているGoのtftpサーバライブラリにバグがある雰囲気がしているのだけれど,コンカレンシーがなにやらこんがらがっておりデバッグ困難でつらい.もともとは実装がシンプルになるように設計されていたはずのプロトコルを違法に拡張したせいで複雑になっているのであった.