写点什么

利用 S3fs 在 Amazon EC2 Linux 实例上挂载 S3 存储桶

  • 2019-11-15
  • 本文字数:4912 字

    阅读完需:约 16 分钟

利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶

背景介绍

Amazon S3 是互联网存储解决方案,能让所有开发人员访问同一个具备可扩展性、可靠性、安全性和快速价廉的数据存储基础设施。Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 互联网上的任何位置存储和检索任何数量的数据。开发人员可以利用 Amazon 提供的 REST API 接口,命令行接口或者支持不同语言的 SDK 访问 S3 服务。


对于原来使用本地目录访问数据的应用程序,比如使用本地磁盘或网络共享盘保存数据的应用系统,如果用户希望把数据放到 S3 上,则需要修改数据的访问方式,比如修改为使用 AWS SDK 或 CLI 访问 S3 中存储的数据。为了让用户原来的应用系统能在不做修改的情况下直接使用 Amazon S3 服务,需要把 S3 存储桶作为目录挂载到用户服务器的本地操作系统上。常用的挂载工具有 S3fs 和 SubCloud 等。本文主要介绍如何利用 S3fs 将 S3 存储桶挂载到 Amazon EC2 Linux 实例上。

S3fs 介绍

S3fs 是基于 FUSE 的文件系统,允许 Linux 和 Mac Os X 挂载 S3 的存储桶在本地文件系统,S3fs 能够保持对象原来的格式。关于 S3fs 的详细介绍,请参见:https://github.com/s3fs-fuse/s3fs-fuse

利用 S3fs 挂载 S3 存储桶

一、准备


  1. 使用拥有足够权限的 IAM 账号登录 AWS 控制台。

  2. 创建 S3 存储桶,给存储桶命名如“s3fs-mount-bucket”(如果使用已有存储桶,本步骤可略过)。



3. 创建具有该 S3 存储桶访问权限的 IAM 用户,并为该 IAM 用户创建访问密钥。


a) 关于如何创建 IAM 用户,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console


b) 关于如何为 IAM 用户创建访问密钥,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html


c) 关于如何为 IAM 用户设置权限策略,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html


https://aws.amazon.com/cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/


  1. 创建并启动 Amazon EC2 Linux 实例



具体过程请参见:http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/launching-instance.html


二、安装和配置 S3fs


  1. 安装 s3fs


a) 使用 Amazon EC2 默认用户“ec2-user”和对应的私钥文件登录启动的 Linux 实例(请注意将下边例子中的私钥文件和 ec2 实例域名替换为用户自己的值)


ssh -i /path/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com


b) 安装必要的软件包


sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel


c) 下载,编译并安装 s3fs


git clone https://github.com/s3fs-fuse/s3fs-fuse.git


cd s3fs-fuse


./autogen.sh


./configure


make


sudo make install


d) 检查 s3fs 是否安装成功


[ec2-user@ip-172-31-23-148 s3fs-fuse]$ s3fs


s3fs: missing BUCKET argument.


Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...


[ec2-user@ip-172-31-23-148 ~]$ which s3fs


/usr/local/bin/s3fs


  1. 创建 IAM 用户访问密钥文件


  • IAM 用户访问密钥内容可以写入当前用户默认密钥文件比如“/home/ec2-user/.passwd-s3fs”或者用户自己创建的文件。

  • 命令格式:echo [IAM 用户访问密钥 ID]:[ IAM 用户访问密钥] >[密钥文件名]

  • 命令举例:下面的例子将在当前用户默认路径创建密钥文件


echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /home/ec2-user/.passwd-s3fs


请注意:访问海外 AWS S3 服务和中国 S3 服务使用的是不同的 IAM 账号,对应不同的密钥。


  1. 设置密钥文件只能够被当前用户访问


  • 命令格式:chmod 600 [密钥文件名]

  • 命令举例:下面的例子将设置密钥文件只能被当前用户访问


chmod 600 /home/ec2-user/.passwd-s3fs


三、手动挂载 S3 存储桶


S3fs 挂载存储桶使用的命令是 s3fs


s3fs 的命令格式是:


  • s3fs BUCKET MOUNTPOINT [OPTION]…

  • s3fs [S3 存储桶名] [本地目录名] [OPTION]

  • OPTION 是可选项,格式是 –o <option_name>=<option_value>,常用的 options 有:

  • col 1col 2col 3
    名称含义缺省值
    passwd_file指定挂载的密钥文件
    connect_timeout设置超时连接等待的时间,单位秒300
    url设置访问s3的urlhttp://s3.amazonaws.com
    endpoint设置s3存储桶的endpointus-east-1
    allow_other设置allow_other允许所有用户访问挂载点目录,设置这个选项需要在 /etc/fuse.conf 文件添加user_allow_other选项


手动挂载 AWS 海外区域 S3 存储桶


  • 命令格式:s3fs [S3 存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o endpoint=[区域名]


命令举例:下面的例子将名为“s3fs-mount-bucket”的新加坡区域 S3 存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”。


s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o endpoint=ap-northeast-1


手动挂载 AWS 中国北京区域 S3 存储桶


  • 命令格式:s3fs [S3 存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1

  • 命令举例:下面的例子将名为“s3fs-mount-bucket”的北京区域 S3 存储桶挂载到本地目录“/home/ec2-user/s3mnt”。


s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1


检查挂载结果


  • 挂载操作执行结束后,可以使用 Linux “df”命令查看挂载是否成功。出现类似下面 256T 的 s3fs 文件系统即表示挂载成功。用户就可以进入本地挂载目录去访问存储在 S3 存储桶中的对象。


[ec2-user@ip-172-31-23-148 ~]$ df -h


文件系统 容量 已用 可用 已用% 挂载点


devtmpfs 488M 56K 488M 1% /dev


tmpfs 498M 0 498M 0% /dev/shm


/dev/xvda1 7.8G 1.2G 6.6G 15% /


s3fs 256T 0 256T 0% /home/ec2-user/s3mnt


[ec2-user@ip-172-31-23-148 ~]$ cd /home/ec2-user/s3mnt


[ec2-user@ip-172-31-23-148 s3mnt]$ ls -l


总用量 1


-rw-rw-r-- 1 ec2-user ec2-user 19 10月 18 07:13 a.txt


[ec2-user@ip-172-31-23-148 s3mnt]$


卸载挂载的 S3 存储桶


  • 如果不再需要通过挂载方式访问 S3 存储桶,可以使用 Linux “umount”命令卸载。


[ec2-user@ip-172-31-23-148 ~]$ sudo umount /home/ec2-user/s3mnt


[ec2-user@ip-172-31-23-148 ~]$ df -h


文件系统 容量 已用 可用 已用% 挂载点


devtmpfs 488M 56K 488M 1% /dev


tmpfs 498M 0 498M 0% /dev/shm


/dev/xvda1 7.8G 1.2G 6.6G 15% /


调试


如果遇到手动挂载不成功的问题,请尝试在执行的命令后面添加下面的参数,并检查输出日志中的错误提示信息:


  • 命令格式:[完整的 s3fs 挂载命令] -d -d -f -o f2 -o curldbg

  • 命令举例:下面的例子试图将名为“s3fs-mount-bucket”的 S3 存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”下,并输出挂载过程详细调试日志。


[ec2-user@ip-172-31-23-148 ~]$ s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1 -d -d -f -o f2 -o curldbg


[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [CRT] to [INF]


[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [INF] to [DBG]


[INF] s3fs.cpp:set_moutpoint_attribute(4196): PROC(uid=500, gid=500) - MountPoint(uid=500, gid=500, mode=40775)


FUSE library version: 2.9.4


nullpath_ok: 0


nopath: 0


utime_omit_ok: 0


四、设置开机自动挂载 S3 存储桶


A. 创建全局 IAM 用户访问密钥文件


切换 Linux 系统用户账号到“root”用户,把 IAM 用户访问密钥内容写入/etc/passwd-s3fs 文件中,并限制该文件的访问权限。“/etc/passwd-s3fs”文件是 s3fs 保存 IAM 用户访问密钥的全局默认路径。


请注意:访问海外 AWS S3 服务和中国 S3 服务使用的是不同的 IAM 账号,对应不同的密钥。


sudo su


echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /etc/passwd-s3fs


chmod 600 /etc/passwd-s3fs


B. 修改/etc/fstab 文件


编辑/etc/fstab 文件,添加后面的自动挂载命令。


vi /etc/fstab


B.1 自动挂载海外区域 S3 存储桶


  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse _netdev,allow_other,endpoint=[区域名] 0 0

  • 命令举例:添加下面的语句到/etc/fstab 后,Linux 系统启动后将自动把名为“s3fs-mount-bucket”的新加坡区域 S3 存储桶挂载到本地目录“/home/ec2-user/s3mnt”,并允许其它操作系统用户(非 root 用户)访问。


/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse _netdev,allow_other,endpoint=ap-northeast-1 0 0


B.2 自动挂载中国北京区域 S3 存储桶


  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0 0

  • 命令举例:添加下面的语句到/etc/fstab 后,Linux 系统启动将自动把名为“s3fs-mount-bucket”的北京区域 S3 存储桶挂载到本地目录“/home/ec2-user/s3mnt”下,并允许其它操作系统用户(非 root 用户)访问。


/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0 0

局限性

利用 S3fs 可以方便的把 S3 存储桶挂载在用户本地操作系统目录中,但是由于 S3fs 实际上是依托于 Amazon S3 服务提供的目录访问接口,所以不能简单的把 S3fs 挂载的目录和本地操作系统目录等同使用。用户使用 S3f3 挂载 S3 存储桶和直接访问 S3 服务有类似的使用场景。适用于对不同大小文件对象的一次保存(上传),多次读取(下载)。不适用于对已保存文件经常做随机修改,因为每次在本地修改并保存文件内容都会导致 S3fs 上传新的文件到 Amazon S3 去替换原来的文件。从访问性能上来说,通过操作系统目录方式间接访问 Amazon S3 存储服务的性能不如直接使用 SDK 或 CLI 接口访问效率高。以本地配置文件方式保存访问密钥的安全性也不如使用 EC2 IAM 角色方式高。


关于 S3fs 使用时候需要注意的更多细节,请参考下面 s3fs 官网内容:


“Generally S3 cannot offer the same performance or semantics as a local file system. More specifically:


  • random writes or appends to files require rewriting the entire file

  • metadata operations such as listing directories have poor performance due to network latency

  • eventual consistency can temporarily yield stale data

  • no atomic renames of files or directories

  • no coordination between multiple clients mounting the same bucket

  • no hard links ”


通常 S3 不能提供与本地文件系统相同的性能或语义。进一步来说:


  • 随机写入或追加到文件需要重写整个文件

  • 元数据操作比如列出目录会因为网络延迟原因导致性能较差

  • 最终一致性设计可能临时导致过期数据

  • 没有对文件或目录的原子重命名功能

  • 挂载相同存储桶的多个客户端之间没有相互协调机制

  • 不支持硬链接

总结

利用 S3fs 可以把共享的 Amazon S3 存储桶直接挂载在用户服务器本地目录下,应用不需要做修改就可以直接使用 Amazon S3 存储服务,这种方式可以作为临时解决方案将传统应用快速迁移到 AWS 平台。


在已经提供了 Amazon EFS(Elastic File System)服务的 AWS 区域,建议用户优先考虑使用 Amazon EFS 服务,因为它具有更高的性能。在目前还没有提供 EFS 服务的 AWS 区域,用户可以先暂时使用 S3fs 实现快速业务迁移。然后逐步调整 S3 数据访问实现方式,最终修改为使用 AWS SDK 或 CLI 方式高效并更加安全地访问 S3 存储服务。


作者介绍:



蒙维


亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案架构咨询和设计,有超过十年以上电信行业和移动互联网行业复杂应用系统架构和设计经验,主要擅长分布式和高可用软件系统架构设计,移动互联网应用解决方案设计,研发机构 DevOps 最佳实施过程。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/s3fs-amazon-ec2-linux/


2019-11-15 08:001319

评论

发布
暂无评论
发现更多内容

tidb之旅——生成列

TiDB 社区干货传送门

新版本/特性解读 7.x 实践

成都堡垒机采购选择哪家好?具体功能有哪些?具体多少钱?

行云管家

网络安全 信息安全 成都 堡垒机

gRPC 接口调试利器,让你成为高效开发者

Apifox

程序员 gRPC RPC 开发 RPC 协议实现原理

阿里云瑶池数据库出席2023可信数据库发展大会,PolarDB荣获多项评测证书

科技热闻

亿级日活业务稳如磐石 华为云发布性能测试服务CodeArts PerfTest

华为云PaaS服务小智

云计算 软件开发 性能测试 华为云

TiDB v7.1.0 跨业务系统多租户解决方案

TiDB 社区干货传送门

实践案例 新版本/特性解读 应用适配 HTAP 场景实践 7.x 实践

tidb之旅——tidb架构选择

TiDB 社区干货传送门

迁移 安装 & 部署 6.x 实践

干货满满!阿里、京东、网易等多位专家力荐的高并发编程速成笔记

小小怪下士

Java 编程 程序员 高并发

科研类项目核算的“法、术、器”(一)

用友BIP

项目云

华为开发者大会:软件开发小白的华为云云上初体验

华为云PaaS服务小智

云计算 软件开发 华为云 华为开发者大会2023

# 文盘Rust -- FFI 浅尝

TiDB 社区干货传送门

开发语言

索引加速功能真能提升10倍吗?--TiDB V6.1.0-V7.1.0建索引速度对比

TiDB 社区干货传送门

版本测评 性能测评 7.x 实践

活动预告|7月29日 Streaming Lakehouse Meetup·北京站

Apache Flink

大数据 flink 实时计算 信息推送

简单三步完成离线升级TIDB v7.1(服务器无互联网环境)

TiDB 社区干货传送门

版本升级 7.x 实践

架构成长之路 | 图解分布式共识算法 Paxos 议会协议

阿里技术

分布式 PAXOS Paxos 议会协议

TiKV集群断电(灾难)恢复过程记录

TiDB 社区干货传送门

6.x 实践

推荐!十个平台工程工具助力开发人员提升效率和体验

SEAL安全

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年6月刊

墨天轮

MySQL 数据库 oracle postgresql 国产数据库

aws上采用tidb和原生使用aws rds价格的比较。兼数据分析性能的测试

TiDB 社区干货传送门

TiDB 底层架构 性能测评 7.x 实践

云数据库是杀猪盘么,去掉中间商赚差价,aws数据库性能提升 10 倍!价格便宜十倍。

TiDB 社区干货传送门

数据库架构设计 7.x 实践

这10个强大的CSS属性,每个前端都要懂

伤感汤姆布利柏

TiDB v7.1.0 资源管控功能是如何降低运维难度和成本-实现集群资源最大化?

TiDB 社区干货传送门

实践案例 版本测评 性能测评 应用适配 7.x 实践

tidb之旅——dm工具篇

TiDB 社区干货传送门

迁移 安装 & 部署 6.x 实践

新能力提升全面预算管理效率和效力

用友BIP

全面预算

《2022-2023年中国大数据市场研究年度报告》正式发布,腾讯云位列领导者行列

极客天地

快速提效,便捷易用 | 嘉为蓝鲸数字化运营中心全方位体验升级

嘉为蓝鲸

运维 IT weops

TiDB 7.1.0 LTS 特性解读 | 资源管控 (Resource Control) 应该知道的 6 件事

TiDB 社区干货传送门

版本测评 新版本/特性解读 7.x 实践

tidb之旅——资源管控

TiDB 社区干货传送门

新版本/特性解读 7.x 实践

TiDB 7.1 资源管控验证测试

TiDB 社区干货传送门

版本测评 新版本/特性解读 7.x 实践

利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章