如何在 Linux 上本地挂载 S3 存储桶

在许多方面,S3 存储桶的作用类似于云硬盘驱动器,但只是“对象级存储”,而不是像 EBS 或 EFS 那样的块级存储。但是,可以将存储桶挂载为文件系统,并通过读写文件直接访问它。
S3 作为文件系统的优点和局限性
使整个设置工作的魔法是一个名为 s3fs-fuse
的实用程序。 FUSE 代表用户空间中的文件系统,它创建一个挂载的虚拟文件系统。 s3fs
与 S3 交互,并支持大量 POSIX 子集,包括读取、写入、创建目录和设置文件元数据。
与传统存储相比,使用 S3 的一大好处是它非常可以长期存储单个对象,并且对总存储桶大小没有任何限制。您可以在 S3 中存储 10 张照片或 1000 万张照片,其工作原理大致相同。在需要大(且便宜)磁盘的应用程序中,S3 很有意义,如果您要集成的应用程序需要文件访问,这是连接两者的好方法。
当然,它并非没有限制。虽然它在存储和检索整个文件时的性能方面与 S3 API 相当,但它显然不会完全取代更快的网络附加块存储。 AWS 不正式支持这种配置是有原因的——您会遇到多个客户端使用文件的并发问题,尤其是当您有不同区域的客户端访问同一个存储桶时。当然,S3 也有这个限制,它不会阻止您连接多个客户端,但当 FUSE 似乎为您提供“直接”访问时,它会更加明显。事实并非如此,您必须牢记这一限制。
AWS确实有类似的服务——Storage Gateway,它可以充当本地NAS,提供由S3支持的本地块存储。然而,这更像是一个企业解决方案,它需要一个完整的物理服务器来部署 VMWare 映像。另一方面,s3fs
是一个简单的单服务器解决方案,尽管它没有做太多缓存。
因此,如果您可以将应用程序转换为使用 S3 API 而不是 FUSE,那么您应该这样做。但是,如果您接受一些 hacky 解决方案,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