讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌杰君_6082

陌杰君_6082

发布时间:2025-11-15 11:09:14

|

325人浏览过

|

来源于php中文网

原创

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

    Git Pro
    Git Pro

    Git高级操作:smart-commit、rebase、bisect、worktree、reflog、冲突解决、子模块、PR流程

    下载
  • 使用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是一个强大且实用的解决方案。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2113

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3374

2023.10.07

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5149

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

486

2026.01.19

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

8645

2026.01.21

GitHub官网入口版本汇总
GitHub官网入口版本汇总

本专题整合了GitHub入口版本地址汇总,阅读专题下面的文章了解更多详细内容。

918

2026.04.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn