如何在EC2实例上配置FTP服务器以直接将文件上传至S3?
搭建EC2 FTP服务器自动同步至S3的方案
一、前期准备
- 拥有AWS账户,已创建目标S3桶(桶名需全局唯一,按需开启版本控制)
- 启动一台EC2实例:轻量需求可选
t3.micro(符合免费额度),大文件集中上传时可临时升级规格,完成后降配节省成本 - 配置EC2安全组:开放FTP控制端口21,被动模式需额外开放端口范围(如1024-1048);确保EC2出站规则允许访问S3
二、配置EC2的IAM权限
通过IAM角色给EC2授权,避免硬编码密钥,遵循最小权限原则:
- 进入IAM控制台,创建新角色,选择EC2作为信任实体
- 创建自定义权限策略(替换
your-bucket-name为你的桶名):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] } ] } - 将策略附加到新建角色,再把角色关联到目标EC2实例
三、挂载S3桶到EC2本地目录
使用s3fs将S3桶挂载为本地文件系统,实现FTP上传文件直接同步至S3:
- 安装依赖(以Amazon Linux 2为例):
sudo yum install gcc libstdc++-devel gcc-c++ fuse fuse-devel curl-devel libxml2-devel openssl-devel git -y - 编译安装s3fs:
git clone https://github.com/s3fs-fuse/s3fs-fuse.git cd s3fs-fuse ./autogen.sh ./configure --prefix=/usr --with-openssl make sudo make install - 创建挂载目录:
sudo mkdir /mnt/s3-ftp-bucket - 挂载S3桶:
sudo s3fs your-bucket-name /mnt/s3-ftp-bucket -o iam_role=auto -o allow_otheriam_role=auto:自动调用EC2绑定的IAM角色权限allow_other:允许FTP用户访问挂载目录
- 设置开机自动挂载:
编辑/etc/fstab,添加以下内容:
测试挂载:your-bucket-name /mnt/s3-ftp-bucket fuse.s3fs iam_role=auto,allow_other 0 0sudo mount -a
四、安装并配置FTP服务器(以vsftpd为例)
- 安装vsftpd:
sudo yum install vsftpd -y - 编辑
/etc/vsftpd/vsftpd.conf,修改关键配置:# 禁止匿名访问 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 开启写入权限 write_enable=YES # 限制用户仅能访问指定目录(chroot监狱) chroot_local_user=YES allow_writeable_chroot=YES # 设置被动模式端口范围 pasv_min_port=1024 pasv_max_port=1048 # 指定FTP用户默认目录为S3挂载目录 local_root=/mnt/s3-ftp-bucket - 创建FTP专用用户(禁止SSH登录):
sudo useradd ftp-user sudo passwd ftp-user sudo usermod -s /sbin/nologin ftp-user - 调整挂载目录权限:
sudo chown ftp-user:ftp-user /mnt/s3-ftp-bucket - 启动并设置开机自启:
sudo systemctl start vsftpd sudo systemctl enable vsftpd
五、大文件上传优化与成本控制
大文件处理
- s3fs默认自动分段上传大文件(默认100MB/段),无需额外配置即可保证上传稳定性
- 临时升级EC2实例规格:大文件集中上传时切换至
t3.small或更高规格,完成后降回低规格 - 强制使用FTP被动模式:避免客户端防火墙阻断大文件传输连接
成本优化
- 选择低成本S3存储类:上传完成后,将文件转移至S3 Standard-Infrequent Access或S3 Glacier Flexible Retrieval,根据访问频率选择
- 配置S3生命周期规则:自动将超过指定天数的文件从标准存储转移至低成本存储类,或过期删除冗余文件
- 利用EC2免费额度:
t3.micro实例每月有750小时免费时长,轻量场景可完全覆盖 - 同区域部署:确保EC2与S3桶在同一AWS区域,避免跨区域数据传输费用
六、测试验证
使用FTP客户端(如FileZilla)连接EC2公网IP,用创建的ftp-user账号登录,上传大文件后检查S3桶是否成功接收,确认流程正常。
内容的提问来源于stack exchange,提问作者Saksham Paliwal
相关产品推荐
相关产品推荐

