Mountpoint for Amazon S3を触ってみる
ライフイズテックのサービス開発部・インフラ/SREグループふ〜みんです。
ちょっと時期的には遅い感もありますが、女子サッカーワールドカップ、日本惜しかったですね。後半の終了前に1点返したあたりから、手のひらから血が出そうなくらい握りしめて応援してました!そんなサッカー大好き人間です。
前回のNoteで書いた「Google re:Workから「効果的なチーム」を学ぶ」とは打って変わって、技術的な「やってみた系」を書いてみようかなと思います。
* タイトル画像の "01" には「やってみたシリーズ」を作成する決意を込めてみましたw
さて、本題に入る前に
SREであるが故にストレージと向き合う機会は大変多いです。また、ライフイズテックの各プロダクトではAWSを採用しているので、ストレージに関しても色々な選択肢があります🤩
現状、ライフイズテック レッスンでは
Amazon FSx for OpenZFS
Amazon EFS
Amazon S3
の3つを用途(コンテナやインスタンスでの利用、静的ファイルやログストレージ、etc…)によって使い分けをしています。特にライフイズテック レッスンでは教材の特性上、小さいサイズの素材ファイルを非常に多く取り扱うので、ここには Amazon FSx for OpenZFS を適用しています。こちらの話は 弊社のあさっちが記事にしてくれていますので、ご興味のある方はご覧ください。
とはいえ、プロダクトの色々な取り組みが進む上で要件や現状の状況を踏まえると、
「EC2やECSにS3がマウントできたらどれだけ楽だろう」
と思うことがちょいちょいあります。そんな夢を叶えてくれそうなのが、今回試してみた Mountpoint for Amazon S3 です。
Mountpoint for Amazon S3
概要
Mountpoint for Amazon S3はS3のサービスではなく、EC2インスタンスやECSコンテナ(ECS on EC2のみ)からS3をマウントしてファイルへアクセスできるようにするクライアントツールのことで、GitHubに awslabs/mountpoint-s3 として公開されています。
今までも s3fs-fuseやgoofys といったツールはあったのですが、パフォーマンス面であまり実用的でなく、過去のAWS Black Belt Online Seminerでも
とされている経緯もあり、なかなか実用途では使いずらい感じでした。ただ、今回のMountpoint for Amazon S3 は AWSの公式ツールという事もあり安心感がある事も◎ですね!
まずはさくっとREADMEの最初に書いてある概要らしき文章を読んでみよっかなということで翻訳してみました。
一応、ざっくりREADMEを翻訳しましたが、一番重要なのは「あまり適していないパターン」の箇所かなと思います。ここはPOSIX準拠のファイルシステムではない (*1、という事とイコールです。
S3でサポートしていないディレクトリ名のリネームやシンボリックリンクを扱うこと
ファイルをインプレースで扱う(S3のストレージ内でそのまま編集しちゃうようなファイル操作)こと
→ ここではGitやSQLiteが挙げられていますが、いずれもファイルの編集・削除、その他ファイル操作を行なっているためです。
要は簡単にS3のファイルを参照したりする分には、なんら問題なさそうなので、何かファイルをS3から読み込んだり、S3へファイルをコピーして貯めていくようなアプリケーションだったりは適していそうです。
シンプルなファイルストレージとしてS3を利用したい場合には良さそうですね〜。
テスト環境の作成
ではでは、今回はEC2インスタンスからS3をマウントしアクセスできることを試してみちゃいましょ。
あってもなくても良いぐらいなのですが、構成図も書いてみたので参考にしていただければと思います。
S3バケット
S3バケットには特別な設定は不要です。既存のバケットをそのままお使いになるなり、新規にバケットを作成するなりしていただければと思います。逆に言うとS3側には特に制限はないという事ですね!
と書いちゃいましたが1点だけ制限があります。それはS3バケットの暗号化についてです。S3で標準的に利用できるAWS提供の暗号化方式の
Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
AWS Key Management Service キーを使用したサーバー側の暗号化 (SSE-KMS)
AWS Key Management Service キーを使用したデュアルレイヤーサーバー側の暗号化 (DSSE-KMS)
はサポートしていますが、ユーザが作成したキーによる暗号化には対応していません。(まぁ、この辺は全然許容範囲かと思います)
EC2インスタンス
こちらも普通に作ってOKですが、S3をマウントする際にEC2のIAMインスタンスプロファイルにマウントしたいバケットへのS3FullAccessの権限が必要です。
EC2のインスタンスプロファイルを使用しない場合は、インスタンス内でAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYを環境変数として設定する必要があります。
さっそく作ってみましょ〜、といっても極々普通に作成するだけですが、1つだけ設定しておきたいのが、先ほど書いたEC2のIAMインスタンスプロファイルです。
EC2からS3へFullAccessの権限あるロールがない方は新規で作成をして割り当ててください!
作成方法は簡単にスクリーンショットしておきましたので、参考にしていただければと思います😀
*今回は簡易的にS3のバケット全体にS3FullAccessの権限を与えていますが、実際に利用する場合は必ず必要なバケットにのみ権限を付与してください。
これでポリシーを作成したら、EC2のIAMインスタンスプロファイルとして割り当ててインスタンスを作成します
mountpoint-s3のインストールとS3バケットのマウント
いよいよmountpoint-s3のインストールですが、これ、めちゃめちゃ簡単です。mountpoint-s3のREADMEにあるGetting Startedを読みながら実行していきます。
Amazon Linux系であればrpmパッケージ、debian系であればdebパッケージが用意されていますので、それを適当なディレクトリでダウンロードし、各OSのパッケージマネージャーのインストールするだけです。今回はx86_64系のインスタンスを使っているので、パッケージもx86_64を指定していますが、Gravitonインスタンスを使っている場合はarm64を指定してください〜
$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
$ sudo yum install -y ./mount-s3.rpm
いえい!🎉
これだけインストールは完了です!はちゃめちゃ簡単ですね!
さて、いよいよS3バケットをマウントしていきます。
まずは適当なディレクトリ配下に、S3バケットをマウントするためのディレクトリを作成します。
今回は ${HOME} 配下に ex_mount_dir という名前のディレクトリを作成します。
$ mkdir ~/ex_mount_dir
$ ls -F
ex_mount_dir/
ここでマウントします。READMEのサンプルコマンドには
$ mount-s3 DOC-EXAMPLE-BUCKET /path/to/mount
とありますが、DOC-EXAMPLE-BUCKETにはS3のバケット名、/path/to/mount にはEC2インスタンスでマウントするディレクトリを指定してください
今回S3バケット名はfumin-bucket、EC2インスタンスでマウントするディレクトリは ${HOME}/ex_mount_dir なので、これを使います!
$ mount-s3 fumin-test ${HOME}/ex_mount_dir
bucket fumin-test is mounted at /home/ec2-user/ex_mount_dir
お〜マウントできました!🎉🎉
一応バケット内に確認用のディレクトリやファイルを作成しておいたので、見れるか確認します。
こんな感じにバケット内のフォルダとファイルを作成してあります。
EC2インスタンスからはこう見えます。そのまま見えてますね!ファイルが0バイトなのは空ファイルだからです💧
$ tree .
.
`-- ex_mount_dir
|-- aaaa
|-- bbbb
`-- ccccc
`-- dddd
$ ls -lR ./ex_mount_dir/
./ex_mount_dir/:
total 0
drwxr-xr-x 2 ec2-user ec2-user 0 Aug 18 07:34 aaaa
-rw-r--r-- 1 ec2-user ec2-user 0 Aug 18 07:36 bbbb
drwxr-xr-x 2 ec2-user ec2-user 0 Aug 18 07:34 ccccc
./ex_mount_dir/aaaa:
total 0
./ex_mount_dir/ccccc:
total 0
-rw-r--r-- 1 ec2-user ec2-user 0 Aug 18 07:36 dddd
EC2インスタンスからS3バケットのマウントを外す
普通の umount でOKです!
$ sudo umount ${HOME}/ex_mount_dir
制限
とはいえ、POSIX準拠ではない事もあり、普通のファイルストレージとは勝手が違う事もあります。
ファイルに追記できない
ファイル・ディレクトリの削除ができない
ファイル・ディレクトリのリネームができない
ただし、1. 2. については S3バケットのマウント時に下記のように --allow-delete オプションをつける事で削除が可能になります。
$ mount-s3 fumin-test ${HOME}/ex_mount_dir --allow-delete
またファイルへの追記に関しても いったんファイルを削除し、新規に作成する、という方法をmountpoint-s3がバックグラウンドで行ってくれることで実現されます(結構力技…)
ただしパフォーマンスは良くないので、あくまで「出来るようになる」ぐらいの認識でとどめておくのが良さそうです。
まとめ
めちゃめちゃ簡単にS3をマウントできましたね!今までの葛藤はなんやったんや….
簡単に済ませるつもりがちょっと丁寧めに書くと結構長くなってしまいました。だれかの参考になると幸いです!
参考:Amazon Web Services ブログ
ライフイズテック サービス開発部では、月毎に気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!
この記事が気に入ったらサポートをしてみませんか?