ウェブサイト検索

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 s3fs

IAMユーザーを作成し、マウントしたいバケットにアクセスするための権限を付与する必要があります。最後に、シークレットアクセスキーが得られます:

これらを標準の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

関連記事: