apt-transport-s3をGoに移植した

apt-transport-s3をGoに移植してapt-transport-s3-goを作った。

github.com

これは何?

aptのリポジトリとしてS3を利用できるようにするやつ。 すでにapt-transport-s3が存在しているのだがあまりメンテナンスされている様子がなく、またpythonpython-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以外でのクレデンシャルのロードは、現状やっていない。

aws.github.io

おまけ: 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現在)リリースも滞っている感じ