利用S3FS在AWS EC2实例间实现文件共享与访问


利用S3FS在AWS EC2实例间实现文件共享与访问

本文旨在解决aws ec2实例间远程文件列表显示与访问的问题。当直接通过http路径访问远程文件不可行时,推荐采用aws s3作为中央共享存储。通过在两个ec2实例上安装并配置s3fs,可以将s3存储桶挂载为本地文件系统,从而实现对远程文件的无缝访问和管理,提高分布式应用的文件处理能力。

引言:EC2实例间的文件访问挑战

在AWS云环境中,当应用程序部署在多个EC2实例上时,经常会遇到需要在一个实例(例如管理界面)上访问另一个实例(例如文件存储服务器)中特定目录下的文件列表的需求。传统的做法,如PHP的scandir()函数,通常只能访问本地文件系统中的目录。直接尝试通过HTTP路径(如http://xx.xxx.xxx.xx/upload_directory/)来访问远程目录并期望获取文件列表,是无法成功的,因为HTTP协议是用于传输网页内容的,而非提供文件系统级别的目录扫描功能。这种情况下,需要一种机制,能够让远程存储的文件在本地实例上表现得如同本地文件一样。

解决方案:利用S3FS挂载S3存储桶

解决此问题的有效方法是利用AWS S3作为中间共享存储,并使用S3FS工具将S3存储桶挂载到每个EC2实例的本地文件系统上。S3FS是一个FUSE(Filesystem in Userspace)文件系统,它允许Linux系统将S3存储桶作为标准的本地文件系统进行挂载,从而可以使用常规的文件系统操作(如ls、cp、scandir等)来访问S3中的对象。

1. S3FS工作原理

S3FS通过FUSE接口将S3存储桶的内容映射到本地目录。这意味着,一旦S3桶被成功挂载,存储在S3中的文件和目录就会在挂载点处显示,应用程序可以像访问本地文件一样访问它们。对挂载点执行的任何文件操作(读、写、删除)都会被S3FS转换为相应的S3 API调用。

2. 前提条件

在开始安装和配置S3FS之前,请确保完成以下准备工作:

  • AWS S3存储桶: 创建一个S3存储桶,用于存储需要共享的文件。
  • IAM权限:
    • 如果使用AWS访问密钥(Access Key ID和Secret Access Key),请确保这些密钥所属的IAM用户拥有对S3存储桶的读写权限。
    • 推荐方式: 为EC2实例配置一个IAM角色,并赋予该角色对S3存储桶的读写权限。将此IAM角色附加到需要访问S3的EC2实例上。这种方式更安全,避免了在实例上硬编码或存储密钥。

3. S3FS的安装

S3FS的安装过程通常涉及从源代码编译或使用包管理器。对于Ubuntu EC2实例,可以参考S3FS-FUSE的官方GitHub仓库(https://github.com/s3fs-fuse/s3fs-fuse)获取最新的安装指南。通常步骤如下:

# 更新系统包列表
sudo apt update

# 安装必要的依赖
sudo apt install automake autotools-dev fuse g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config

# 克隆s3fs-fuse仓库
git clone https://github.com/s3fs-fuse/s3fs-fuse.git

# 进入目录并编译安装
cd s3fs-fuse
./autogen.sh
./configure
make
sudo make install

4. 配置与挂载S3存储桶

安装完成后,需要在两个EC2实例上配置并挂载S3存储桶。

创建挂载点: 在每个EC2实例上,创建一个用于挂载S3桶的本地目录。例如:

sudo mkdir -p /mnt/s3fs/pathlocal

挂载S3存储桶:

  • 使用AWS访问密钥挂载: 如果您选择使用AWS访问密钥,需要将密钥存储在一个文件中(例如~/.passwd-s3fs),并设置适当的权限:

    echo "YOUR_ACCESS_KEY_ID:YOUR_SECRET_ACCESS_KEY" > ~/.passwd-s3fs
    chmod 600 ~/.passwd-s3fs

    然后执行挂载命令:

    /usr/local/bin/s3fs -o allow_other -o passwd_file=~/.passwd-s3fs bucket-name /mnt/s3fs/pathlocal

    请将bucket-name替换为您的S3存储桶名称。

    Animate AI Animate AI

    Animate AI是个一站式AI动画故事视频生成工具

    Animate AI 234 查看详情 Animate AI
  • 使用IAM角色挂载 (推荐): 如果EC2实例已附加了具有S3读写权限的IAM角色,则挂载命令会更简洁且更安全:

    /usr/local/bin/s3fs -o allow_other -o iam_role='your-iam-role-name' bucket-name /mnt/s3fs/pathlocal

    请将bucket-name替换为您的S3存储桶名称,your-iam-role-name替换为附加到EC2实例的IAM角色名称。 -o allow_other选项允许非root用户访问挂载点。

5. 自动挂载S3存储桶

为了确保EC2实例重启后S3存储桶能自动挂载,可以将挂载命令添加到启动脚本中。

  • 使用/etc/rc.local (适用于较旧的Ubuntu版本或特定场景): 编辑/etc/rc.local文件,在exit 0之前添加挂载命令。

    sudo nano /etc/rc.local

    添加以下行(根据您的挂载方式选择):

    # For AWS keys
    /usr/local/bin/s3fs -o allow_other -o passwd_file=/home/ubuntu/.passwd-s3fs bucket-name /mnt/s3fs/pathlocal &
    
    # Or for IAM role
    /usr/local/bin/s3fs -o allow_other -o iam_role='your-iam-role-name' bucket-name /mnt/s3fs/pathlocal &
    
    exit 0

    请确保脚本具有执行权限:sudo chmod +x /etc/rc.local。

  • 使用/etc/fstab (推荐): 更现代和推荐的方法是编辑/etc/fstab文件,这允许系统在启动时自动挂载文件系统。

    sudo nano /etc/fstab

    添加以下行(根据您的挂载方式选择):

    # For AWS keys
    bucket-name /mnt/s3fs/pathlocal fuse.s3fs _netdev,allow_other,passwd_file=/home/ubuntu/.passwd-s3fs 0 0
    
    # Or for IAM role
    bucket-name /mnt/s3fs/pathlocal fuse.s3fs _netdev,allow_other,iam_role='your-iam-role-name' 0 0

    _netdev选项确保在网络可用后才尝试挂载。

6. PHP应用程序中的文件访问

一旦S3存储桶成功挂载,您的PHP脚本就可以像访问本地目录一样访问S3中的文件。例如,原始的PHP脚本现在可以指向挂载点:

<?php
$path = "/mnt/s3fs/pathlocal/"; // 指向S3FS的挂载点
$files = scandir($path);
$nothidden = [];
foreach($files as $file) {
    if ($file[0] != '.') { // 过滤隐藏文件
        $nothidden[] = $file;
    }
}

// 示例:打印文件列表
foreach($nothidden as $file) {
    echo $file . "<br>";
}
?>

这样,无论文件实际存储在哪个EC2实例上,只要它位于共享的S3存储桶中,并通过S3FS挂载,两个EC2实例上的应用程序都可以透明地访问它。

注意事项与最佳实践

  • 安全性: 始终优先使用IAM角色而非直接的AWS访问密钥。如果必须使用密钥,请确保密钥文件权限严格限制,并且不要将其直接暴露在代码库中。
  • 性能: S3FS的性能受限于网络带宽和S3的API响应时间。对于需要极低延迟或高IOPS的场景,S3FS可能不是最佳选择。对于文件列表、少量文件读写等操作,S3FS表现良好。
  • 数据一致性: S3提供最终一致性(Eventual Consistency)。这意味着在写入一个对象后,立即尝试读取它可能无法看到最新版本。对于强一致性要求的应用,需要考虑额外的同步或缓存机制。
  • 错误处理: 在生产环境中,应为S3FS的挂载和文件操作添加适当的错误处理机制,例如检查挂载状态、处理文件不存在等异常情况。
  • 监控: 监控S3FS的运行状态和S3存储桶的访问情况,以便及时发现和解决问题。

总结

通过在AWS EC2实例上安装和配置S3FS,并将AWS S3存储桶挂载为本地文件系统,可以有效地解决分布式EC2应用中远程文件访问和共享的问题。这种方法不仅提供了一种灵活、可扩展的文件共享机制,而且通过利用AWS IAM角色,还能确保操作的安全性。对于需要在多个EC2实例间共享文件列表或进行文件操作的场景,S3FS是一个强大且实用的解决方案。

以上就是利用S3FS在AWS EC2实例间实现文件共享与访问的详细内容,更多请关注php中文网其它相关文章!


# linux  # php  # github  # git  # 安徽微商城网站建设费用  # 鹰潭包装厂网络营销推广  # 白银网站优化推广电话  # 快速seo信息流  # 永年县网站推广托管  # 惠州怎样做网站推广的  # 网站优化的目的及方法  # 而非  # 请将  # 解决问题  # 多个  # 是一个  # 文件共享  # 应用程序  # 文件系统  # 文件列表  # 您的  # ap  # linux系统  # curl  # ssl  # 工具  # ubuntu  # access  # 编码  # 外卖网站营销推广公司  # seo关键词排名抉择火星8服务  # Wordpress设置seo关键字 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: WPS文字如何进行简繁转换  word文档行距怎么调?word文档调行距的操作步骤  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  优化Leaflet弹出层图片显示:条件渲染策略  批改网官网首页登录 批改网学生用户登录入口  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  邦丰播放器频道搜索设置  创建快捷方式启动系统保护  夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  获取WooCommerce产品在后台编辑页面的分类ID  J*aScript与HTML元素交互:图片点击事件与链接处理教程  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  《360浏览器》自动保存账号密码设置方法  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  《sketchbook》选中部分图案移动方法  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  淘口令快速解析技巧  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  《全民k歌》网页版最新登录入口一览  J*aScript类型数组_TypedArray使用  如何测试您的网站全球打开速度-网站海外测速工  HTML中多图片上传与预览:解决ID冲突的专业指南  VS Code快捷键when上下文子句的妙用  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  在Dash应用中自定义HTML标题和网站图标  OpenWeatherMap API:通过城市名称获取天气预报数据指南  PHP与SQL实践:高效实现数据复制与特定列值修改  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  C++如何实现单例模式_C++线程安全的单例模式写法  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  《友玩*》创建群聊方法  263企业邮箱如何设置邮件转发功能  《edge浏览器》关闭翻译功能方法  PHP多语言网站的实现:会话管理与翻译函数优化教程  怎么恢复删除的电脑文件_数据恢复软件使用教程  c++如何使用std::thread::join和detach_c++线程生命周期管理  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  江苏大剧院会员卡购买步骤  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  如何在解析前预检查XML文件的完整性? 比如检查文件大小或特定结束标签  Google Drive API 认证:服务账户与OAuth 2.0的选择与实践  WooCommerce 新客户订单自动添加管理员备注教程 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.