🗻

Mountpoint for Amazon S3をEarthlyでビルドする

2023/03/28に公開

はじめに

Mountpoint for Amazon S3が公開されたので、簡単に利用するためのビルド方法を紹介する。

https://aws.amazon.com/jp/about-aws/whats-new/2023/03/mountpoint-amazon-s3/

Mountpoint for Amazon S3

Mountpoint for Amazon S3はAWSのマネージドサービスではなく、オープンソースのファイルクライアントであり、平たくいうとS3をマウントするためのツールである。

https://github.com/awslabs/mountpoint-s3

s3fsやgoofysを使った「S3のネットワークマウント」は長らく非推奨とされていたが、いわば満を持して公式からクライアントが登場した。

現時点ではLinuxのみ・書き込み不可、という制約はあるものの、公式のツールである意義は大きい。

ビルドが成功しない

Mountpoint for Amazon S3だが、アルファリリースだからか手元でのビルドが必要だ。
しかし、公式の手順通りにビルドするも、どうにも上手くいかない。rust/cargoの知見がないのもあり、様々な依存関係をクリアして、ようやく上手くいった……

複雑なビルドは何度もやりたくないが、この為にCIサーバを立てるのも面倒である。下の記事にならってdockerに入れて操作する手もあるが、ホストマシンでそのまま実行したい。

https://qiita.com/hayao_k/items/e76f947cf6ff2c18ae67

こういう用途こそEarthlyを使うべきでは?と気付き、本題に入る。

Earthly

Earthlyはシンプルな構文で書けるビルドツールだ。専用のファイル形式であるEarthfileのコンセプトは、一言でいうとMakefile + Dockerfileと理解すればよい。学習コストの低さが魅力である。

https://earthly.dev

Makefile/Dockerfile/シェルスクリプトで頑張ると、どうしてもオレオレワークフローになりがちだが、Earthlyで代替えすることでシンプルにまとめられる。また、生成物のローカル出力などの固有の構文もあるので今回紹介する。

今回はホストでしか使っていないが、CI/CDツールとしてGithub ActionsやCodeBuildにも対応しており、汎用性を考えても便利なビルドツールだ。

https://docs.earthly.dev/ci-integration/vendor-specific-guides/gh-actions-integration

https://docs.earthly.dev/ci-integration/vendor-specific-guides/codebuild-integration

ビルド手順

Earthly のインストール

https://earthly.dev/get-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といった趣きの書き方で記述できる。

Earthfile
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"で環境変数を設定している。
  • gitmakeを明示的に導入するため、yum updateyum 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