cdk-lambda-ruby v0.2.0

Rubyで書いたAWS Lambda関数をデプロイするAWS CDK用のライブラリcdk-lambda-rubyを,夏頃でてたRuby 3.2ランタイムに対応させた.cdk-lambda-rubyは,ダウンロードしたgem,gemの展開,ネイティブ拡張のビルドをBundlerの機能を使ってキャッシュするのでcdk synthが早くなる.

RubyにバンドルされてるBundlerのバージョンが上がっていて,bundle install時に環境変数で指定していたオプションが自動的に.bundle/configに書かれなくなった変更の対応が必要だった.あとはCIにSAM CLIを使ったインテグレーションテストを足したりとか.

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

executile v0.1.1

executileのv0.1.1をリリースした.#include不足でコンパイルできないバグを2年くらい前に修正したのにタグを切り忘れていた.

executileは,systemdからソケットアクティベーションされることを期待してるプログラムをsystemd以外の環境(コンテナとか)で実行するためのヘルパープログラム集にしたいと思って名前をつけた.「集」と言っても今のところinet-listen-socketというプログラムひとつしかない.これはTCP/UDPソケットをリスンして,チェインされたプログラムにsystemdのsd_listen_fds規約で渡すだけの機能を持っている.要はinetdとかtcpserverみたいな立ち位置のやつ.

systemdの代わりをするユーティリティが当時は意外と存在しなくて作ったけど,いまはRust製のとかがあるらしい(見たことがあるけど名前を思い出せない)(当時も見つけられなかっただけかもしれない).executileはC/C++の標準ライブラリにしか依存していないので,コンパイルしてコンテナイメージにぽいっと放り込めば動く.また,executile自身もzlibライセンスなので,再頒布にあたって著作権表示のいっさい必要のないバイナリを生成することができるようになっている.RustやGoのプログラムを静的リンクしても,コンテナイメージに入れてバイナリで配布しようとするとそのへんをちゃんとやるのが面倒になってしまうことが多い.