利用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存储桶

一、准备

使用拥有足够权限的IAM账号登录AWS控制台。
创建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

安装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有:
名称 含义 缺省值
passwd_file 指定挂载的密钥文件
connect_timeout 设置超时连接等待的时间,单位秒 300
url 设置访问s3的url http://s3.amazonaws.com
endpoint 设置s3存储桶的endpoint us-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角色方式高。

AWS S3 挂载到EC2相关推荐

  1. s3服务器虚拟屏幕怎么用,aws s3挂载使用教程

    aws s3挂载使用教程 [2021-02-20 12:44:57]  简介: 云计算 AWS S3在上传和下载的时候,默认会使用TLS的方式进行加密和解密.这个具体是在哪里配置的呢? 最简单的方式是 ...

  2. php aws s3查看所有文件_国内AWS没有文件系统服务,快来看如何通过EC2挂载S3存储桶替代...

    作者:光环云 尹晓征 当有需求必须使用共享磁盘服务时,但目前AWS的EFS因为在国内落地的情况,只能通过自建诸如NFS或者GFS等服务来完成,整个过程比较繁杂. S3是互联网的一种存储解决方案,并且借 ...

  3. AWS S3云存储服务

    AWS S3云存储服务 1 S3概念及基础知识 2 S3的基本操作 3 S3数据安全 4 S3数据加密以及命令行CLI 4.1 S3加密工作原理 4.1.1 server端的加密 4.1.2 clie ...

  4. aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce

    aws s3 命令行 在本文中,我将通过使用EMR的CLI使用AWS MapReduce服务(称为ElasticMapReduce ). 使用EMR的过程可以大致分为三个步骤: 设置并填充S3存储桶 ...

  5. aws s3 獲取所有文件_AWS SA associate 证书考试学习记录-EBS,S3,EFS比较

    我们的目标,就是花最少的时间,学到最多的东西:-) 在AWS中,可以选择的存储服务很多,纷繁复杂,新手根本弄不清楚选择哪个.因为做为一个云架构师,你并不是让你的产品能用就够了,而是要考虑到Resili ...

  6. aws s3 cli_了解AWS CLI –使用AWS CLI与AWS S3存储桶进行交互

    aws s3 cli It is the second article in the Learn AWS CLI series. It gives you an overview of working ...

  7. 在AWS Lambda上部署EC2编译的FFmpeg工具——自定义层的方案

    大纲 1 确定Lambda运行时环境 1.1 Lambda系统.镜像.内核版本 1.2 运行时 1.2.1 Python 1.2.2 Java 2 环境准备 2.1 创建EC2实例 3 编译FFmpe ...

  8. 31000美元的AWS s3 - izure:为什么每个人都把他们的鸡蛋放在一个区域

    亚马逊(Amazon)的分析现在已经从长达4小时的中断中恢复过来,这让互联网的大部分时间都陷入了停顿,分析师们正在回头看,看看公司能从这场灾难中吸取什么教训. 系统崩溃--或者像AWS所称的那样,&q ...

  9. AWS: S3+Lambda+CloudFront的使用(CDK)

    一.简介 AWS CloudFront 是一项快速内容分发网络 (CDN) 服务,可以安全地以低延迟和高传输速度向全球客户分发数据.视频.应用程序和 API,全部都在开发人员友好的环境中完成.例如:当 ...

最新文章

  1. 2.8 多任务学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  2. 【译】How Microsoft Lost the API War
  3. 易汉博承建的数据库再发Nature子刊
  4. mysql 8 启动失败(本地计算机上的mysql服务启动后停止。某些服务再未由其他服务或程序使用时将自动停止)
  5. Spring系列(一):Spring的基本概念及其核心
  6. Python与Go插入排序
  7. java实现Excel数据导出
  8. NSIS:在线下载并安装程序
  9. 最全jar包下载地址
  10. 全国省市区行政编码数据表 sql格式
  11. vscode配置maven,settings.json文件
  12. 还在为JS闭包烦恼? FF带你一篇文章玩转闭包,某化腾听了都说好!!
  13. 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
  14. Sublime Text2 好用技巧备忘
  15. JavaScript 数组对象切片
  16. RRD_rrdtool的介绍和使用
  17. 双鱼座三:舞者与梦想家的一周
  18. MACD多周期共振指标公式,日周月共振
  19. Python笔记(1-20)
  20. 号码位置存储服务器HLR 故障,WCDMA R4核心网电路域组网探讨 -通信/网络-与非网...

热门文章

  1. python lxml模块是干嘛的_详解lxml模块
  2. win7卸载JDK出现windows Installer程序包有问题
  3. OpenCV人脸识别(3)提取面部特征
  4. 手机异步发送短信验证码解决方案-Celery+redis
  5. python renamer模块_python - 发布自己的模块(脚本) 到pypi.org
  6. MapReduce工作流程图
  7. 【ArcGIS微课1000例】0063:ArcGIS Earth完美代替Google Earth(附安装包下载)
  8. 如何调用当前栏目的上级栏目名称
  9. 滴滴社招三面(已拿offer)
  10. C语言实现NP调度算法,基于任务复制的进化调度算法.pdf