Mountpoint for Amazon S3をEarthlyでビルドする
はじめに
Mountpoint for Amazon S3が公開されたので、簡単に利用するためのビルド方法を紹介する。
Mountpoint for Amazon S3
Mountpoint for Amazon S3はAWSのマネージドサービスではなく、オープンソースのファイルクライアントであり、平たくいうとS3をマウントするためのツールである。
s3fsやgoofysを使った「S3のネットワークマウント」は長らく非推奨とされていたが、いわば満を持して公式からクライアントが登場した。
現時点ではLinuxのみ・書き込み不可、という制約はあるものの、公式のツールである意義は大きい。
ビルドが成功しない
Mountpoint for Amazon S3だが、アルファリリースだからか手元でのビルドが必要だ。
しかし、公式の手順通りにビルドするも、どうにも上手くいかない。rust/cargoの知見がないのもあり、様々な依存関係をクリアして、ようやく上手くいった……
複雑なビルドは何度もやりたくないが、この為にCIサーバを立てるのも面倒である。下の記事にならってdockerに入れて操作する手もあるが、ホストマシンでそのまま実行したい。
こういう用途こそEarthlyを使うべきでは?と気付き、本題に入る。
Earthly
Earthlyはシンプルな構文で書けるビルドツールだ。専用のファイル形式であるEarthfileのコンセプトは、一言でいうとMakefile + Dockerfileと理解すればよい。学習コストの低さが魅力である。
Makefile/Dockerfile/シェルスクリプトで頑張ると、どうしてもオレオレワークフローになりがちだが、Earthlyで代替えすることでシンプルにまとめられる。また、生成物のローカル出力などの固有の構文もあるので今回紹介する。
今回はホストでしか使っていないが、CI/CDツールとしてGithub ActionsやCodeBuildにも対応しており、汎用性を考えても便利なビルドツールだ。
ビルド手順
Earthly のインストール
に従ってコマンドを実行するだけでインストールできる。
# Installation
sudo /bin/sh -c 'wget https://github.com/earthly/earthly/releases/latest/download/earthly-linux-amd64 -O /usr/local/bin/earthly && chmod +x /usr/local/bin/earthly && /usr/local/bin/earthly bootstrap --with-autocomplete'
# check
earthly -v
前提条件としてGitとDockerが動作することが必要なので、適宜インストールする。(手順外)
Earthfile
EarthlyでビルドするためにはEarthfile
を作成する。まさにMakefile + Dockerfileといった趣きの書き方で記述できる。
VERSION 0.7
FROM amazonlinux:2.0.20230307.0
build:
ENV PATH="/root/.cargo/bin:$PATH"
RUN yum update -y
RUN yum install fuse fuse-devel cmake3 clang-devel git make -y
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
RUN git clone --recurse-submodules https://github.com/awslabs/mountpoint-s3.git
WORKDIR mountpoint-s3
RUN cargo build --release
SAVE ARTIFACT target/release/mount-s3 AS LOCAL ./mount-s3
1行目に記載のVERSIONを削除するとエラーになるので注意だ。
公式のビルド手順との差分、ポイント
変更点は以下の通り。
公式の導入手順
sudo yum install fuse fuse-devel cmake3 clang-devel
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone --recurse-submodules https://github.com/awslabs/mountpoint-s3.git
cd mountpoint-s3
cargo build --release
-
cargo
コマンドのパスを通すために、ENV PATH="/root/.cargo/bin:$PATH"
で環境変数を設定している。 -
git
とmake
を明示的に導入するため、yum update
とyum install
を実施。 - rustupを実行するにあたり、-yオプションで確認プロンプトをスキップし、--default-toolchain stableオプションで安定版を指定している。
- もっと適切な方法があるかもしれない。
- Earthly独自の構文で
SAVE ARTIFACT <SRC> AS LOCAL <DIST>
と書くことで、ビルド成果物をホストマシンに保存できる。非常に便利だ。
ビルド
earthly コマンドでビルドする。
earthly --push +build
- 実施したいコマンドに「+」を付与する。
-
SAVE ARTIFACT
のようにコンテナ外にファイルを出力したい場合は--push
オプションが必要。
ビルド後の使い方と使用方法
ビルドが完了すれば、生成されたファイル mount-s3
にてS3 バケットをマウントできる。
mkdir ~/mnt
./mount-s3 <bucket-name> ~/mnt
これで、S3 バケットがマウントされ、ローカルディレクトリとしてアクセスできるようになった。繰り返しになるが、現時点での制約として、読み取り専用であることに注意が必要である。
まとめ
Build環境はDockerに隔離しつつ、Earthlyで簡単にビルドしたMountpoint for Amazon S3をホストマシンにて動かすことができた。
musl対応やクロスコンパイルは、cargo build
のスキルが足りずにタイムアップしてしまった…… 成功した人は是非教えて欲しい。
Discussion