apt-transport-s3をGoに移植してapt-transport-s3-goを作った。
これは何?
aptのリポジトリとしてS3を利用できるようにするやつ。 すでにapt-transport-s3が存在しているのだがあまりメンテナンスされている様子がなく、またpythonやpython-configobjに依存しているのでコンテナから使いづらい。ECSのタスクロールにも対応してなさそう。
あと作ってから気がついたがapt-golang-s3というのもあるが、こちらはソースコードからのインストールがやや手間そう。apt-transport-s3同様にECSのタスクロールに対応していなさそう。
という感じで主に
- GitHub ActionsでのDockerイメージの作成時のパッケージインストール(OIDCのクレデンシャルの利用)
- ECS上のコンテナでのパッケージインストール
にS3を利用するために作成した。
※なおS3のバケットに置くリポジトリのファイルはaptlyなどで作成する必要がある*1
使い方
まずS3のリージョンを設定する。
echo 'Acquire::s3::region ap-northeast-1;' > /etc/apt/apt.conf.d/s3 # リージョンはURIに組み込みたかったが良い文法が思いつかなかった
それからsources.listを作成する。
echo 'deb s3://my-bucket/repo/ xenial main' > /etc/apt/sources.list.d/s3.list
これであとはapt update
apt install
すればS3からパッケージをインストールできる。
なお、LoadDefaultConfig以外でのクレデンシャルのロードは、現状やっていない。
おまけ: APT Method Interface
APT Method Interfaceというaptコマンド?とapt transport?とのインタフェースの仕様があって、これに従ったプロトコルでapt↔apt transportでメッセージをやりとりする。
標準入出力でやりとりする HTTP/1 みたいなテキストのプロトコルで、標準入力から
601 Configuration Config-Item: Acquire::http::Proxy=http://example.com
というメッセージを受け取ったら設定を行い
600 URI Acquire URI: s3://example.com/key Filename:Packages.downloaded
というメッセージを受け取ったらを行い、最後に
201 URI Done URI: s3://example.com/key Filename:Packages.downloaded
というメッセージを返すというなかシンプルなプロトコルでわかりやすかった。
*1:www.aptly.infoが落ちている…(2022/02/26現在)リリースも滞っている感じ