Linux上でS3バケットをローカルにマウントする方法
多くの点で、S3バケットはクラウドハードドライブのように機能しますが、EBSやEFSのようなブロックレベルストレージではなく、「オブジェクトレベルストレージ」です。ただし、バケットをファイルシステムとしてマウントし、ファイルを読み書きすることで直接アクセスすることが可能です。
S3をファイルシステムとして使用する際の利点と限界
この全体のセットアップを機能させる魔法は、「次の文」を呼ぶユーティリティです。
s3fs-fuse. FUSEはUserspaceにおけるFilesystemの略で、マウントされた仮想ファイルシステムを作成します。s3fsはS3とインターフェースし、読み取り、書き込み、ディレクトリの作成、ファイルメタデータの設定を含む大規模なPOSIXのサブセットをサポートしています。
従来のストレージに対するS3の大きな利点の一つは、個々のオブジェクトを長期的に保存するのに非常に効果的で、バケットの総サイズに制限がないことです。S3に10枚の写真または1000万枚の写真を保存することができ、ほとんど同じように機能します。大容量(かつ安価な)ディスクが必要なアプリケーションでは、S3は理にかなっており、統合しているアプリケーションがファイルアクセスを必要とする場合、これが両者をつなぐ良い方法です。
もちろん、制限がないわけではありません。全体のファイルを保存および取得する際のパフォーマンスに関してはS3 APIにかなり比較的な動作をしますが、ネットワークに接続されたブロックストレージの遥かに速いものを完全に置き換えるわけではありません。この構成がAWSによって公式にサポートされていない理由があります─特に異なる地域にいるクライアントが同じバケットにアクセスする場合、ファイルを使用する複数のクライアントとの間で競合の問題が発生します。もちろん、S3にもこの制限がありますが、複数のクライアントの接続を妨げることはありません。しかし、FUSEが「直接」アクセスを提供しているように見える場合、それがより顕著になります。それはそうではなく、この制限を念頭に置いておく必要があります。
AWSにはこれに似たサービスがあり、Storage GatewayはローカルNASとして機能し、S3によってバックアップされるローカルブロックストレージを提供します。しかし、これはより企業向けのソリューションで、VMWareイメージをデプロイするために物理サーバー全体が必要です。一方、s3fsはシンプルな単一サーバーソリューションですが、あまりキャッシングは行いません。
ですので、アプリケーションをFUSEではなくS3 APIを使用するように変換できるのであれば、それを行うべきです。しかし、若干ハッキーな解決策でも構わないのであれば、s3fsは役に立つかもしれません。
s3fs-fuseの設定
ハッキーな割には、設定が驚くほど簡単です。
s3fs-fuseほとんどのパッケージマネージャから入手可能ですが、一部のシステムでは単にs3fsと呼ばれる場合があります。UbuntuのようなDebianベースのシステムでは、次のようになります:
sudo apt install s3fsIAMユーザーを作成し、マウントしたいバケットにアクセスするための権限を付与する必要があります。最後に、シークレットアクセスキーが得られます:
これらを標準のAWSクレデンシャルファイル~/.aws/credentialsに貼り付けることができますが、異なるキーを使用したい場合は、s3fsはカスタムパスワードファイルをサポートしています。アクセスキーIDとシークレットの両方を/etc/passwd-s3fsに次の形式で貼り付けてください:
echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > /etc/passwd-s3fsこのキー ファイルの権限が適切に設定されていることを確認してください、さもないとエラーが発生します。
chmod 600 /etc/passwd-s3fs次に、以下のコマンドでバケットをマウントできます:
s3fs bucket-name /mnt/bucket-name
それがうまくいかない場合は、いくつかの追加フラグを使ってデバッグ出力を有効にすることができます:
-o dbglevel=info -f -o curldbgこれをブート時にマウントしたい場合は、次のように/etc/fstabに追加する必要があります:
s3fs#bucket-name /mnt/bucket-name fuse _netdev,allow_other,umask=227,uid=33,gid=33,use_cache=/root/cache 0 0
