見出し画像

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でも

s3fsなどのツールを利用してS3をマウントすることは安定性やコストの観点から非推奨としています。共有ファイルシステムが必要であればEFSの利用をご検討ください。

https://aws.amazon.com/jp/blogs/news/webinar-bb-summit-2018/

とされている経緯もあり、なかなか実用途では使いずらい感じでした。ただ、今回のMountpoint for Amazon S3 は AWSの公式ツールという事もあり安心感がある事も◎ですね!

まずはさくっとREADMEの最初に書いてある概要らしき文章を読んでみよっかなということで翻訳してみました。

Mountpoint for Amazon S3は、Amazon S3バケットをローカルファイルシステムとしてマウントするための、シンプルで高スループットのファイルクライアントです。Mountpoint for Amazon S3を使用すると、アプリケーションはopenやreadなどのファイル操作を通じてAmazon S3に保存されたオブジェクトにアクセスできます。Mountpoint for Amazon S3は、これらの操作をS3オブジェクトAPI呼び出しに自動的に変換し、アプリケーションにファイルインターフェースを通じてAmazon S3の弾力的なストレージとスループットへのアクセスを提供します。

Mountpoint for Amazon S3は、大きなオブジェクトへの高い読み取りスループットを必要とするアプリケーション向けに最適化されています。つまり、ファイル・インターフェイスを使用するアプリケーションに最適です:

- ローカルストレージにダウンロードすることなく、S3から大きなオブジェクトを読み込む。
- より大きなデータセットのうち、一部のS3オブジェクトのみにアクセスしたいが、事前にどのオブジェクトか予測できない。
- 出力を直接S3にアップロードするか、cpのようなツールを使ってローカルストレージからファイルをアップロードする。

しかし、おそらく以下のようなアプリケーションには適さないだろう:

-  ディレクトリのリネームやシンボリックリンクなど、S3がネイティブでサポートしていないファイル操作を使用する。
- 既存のファイルをインプレースで編集または追加する(マウントポイントでGitリポジトリやSQLiteデータベースを操作しない😄)。


Mountpoint for Amazon S3はPOSIXファイルシステムのすべての機能を実装しているわけではなく、アプリケーションとの互換性に影響する可能性のある違いがいくつかあります。Mountpoint for Amazon S3の動作とPOSIXサポートの詳細な説明と、それらがあなたのアプリケーションにどのような影響を与えるかについては、Mountpointファイルシステムの動作を参照してください。

https://github.com/awslabs/mountpoint-s3/blob/main/README.md から翻訳

一応、ざっくりREADMEを翻訳しましたが、一番重要なのは「あまり適していないパターン」の箇所かなと思います。ここはPOSIX準拠のファイルシステムではない (*1、という事とイコールです。

  *1 詳しくは https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md を参照

  1. S3でサポートしていないディレクトリ名のリネームやシンボリックリンクを扱うこと

  2. ファイルをインプレースで扱う(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のインスタンス作成画面でIAMインスタンスプロファイルの割り当てをしましょ〜

EC2からS3へFullAccessの権限あるロールがない方は新規で作成をして割り当ててください!
作成方法は簡単にスクリーンショットしておきましたので、参考にしていただければと思います😀

*今回は簡易的にS3のバケット全体にS3FullAccessの権限を与えていますが、実際に利用する場合は必ず必要なバケットにのみ権限を付与してください。

必要なIAMインスタンスプロファイル作成 〜 その 1
必要なIAMインスタンスプロファイル作成 〜 その 2
必要なIAMインスタンスプロファイル作成 〜 その 3

これでポリシーを作成したら、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

お〜マウントできました!🎉🎉

一応バケット内に確認用のディレクトリやファイルを作成しておいたので、見れるか確認します。

こんな感じにバケット内のフォルダとファイルを作成してあります。

S3バケットのなか

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. ファイル・ディレクトリの削除ができない

  3. ファイル・ディレクトリのリネームができない

ただし、1. 2. については S3バケットのマウント時に下記のように --allow-delete オプションをつける事で削除が可能になります。

$ mount-s3 fumin-test ${HOME}/ex_mount_dir --allow-delete

またファイルへの追記に関しても いったんファイルを削除し、新規に作成する、という方法をmountpoint-s3がバックグラウンドで行ってくれることで実現されます(結構力技…)

ただしパフォーマンスは良くないので、あくまで「出来るようになる」ぐらいの認識でとどめておくのが良さそうです。

まとめ

めちゃめちゃ簡単にS3をマウントできましたね!今までの葛藤はなんやったんや….

簡単に済ませるつもりがちょっと丁寧めに書くと結構長くなってしまいました。だれかの参考になると幸いです!


参考:Amazon Web Services ブログ


ライフイズテック サービス開発部では、月毎に気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!

この記事が気に入ったらサポートをしてみませんか?