通过FTP / SFTP访问Amazon S3存储桶


146

有没有办法通过FTP或SFTP而不是AWS控制台中的内置Amazon文件传输接口连接到Amazon S3存储桶?似乎这不是一个容易获得的选项。


2
AWS于2018年11月发布,它是完全托管的SFTP服务,可将文件直接传入和传出Amazon S3。适用于SFTP的AWS传输
mitaka,

Answers:


100

有三个选项。

  • 您可以使用Amazon最近添加的本机托管SFTP服务(此设置更容易设置)。
  • 或者,您可以将存储桶安装到Linux服务器上的文件系统上,并使用SFTP来访问文件,就像服务器上的其他文件一样(可以提供更大的控制权)。
  • 或者,您可以只使用本机支持S3协议(免费的)的(GUI)客户端。

托管SFTP服务

  • 在您的Amazon AWS控制台中,转到AWS Transfer for SFTP并创建一个新服务器。

  • 在“ SFTP服务器”页面中,添加一个或多个新的SFTP用户。

    • 用户的权限由IAM服务中的关联AWS角色控制(要快速入门,您可以使用AmazonS3FullAccess策略)。

    • 该角色必须与拥有信任关系transfer.amazonaws.com

有关详细信息,请参阅我的指南设置对Amazon S3的SFTP访问


将存储桶挂载到Linux服务器

只需使用s3fs文件系统(或类似文件系统)将存储桶安装到Linux服务器(例如Amazon EC2),然后使用服务器的内置SFTP服务器访问存储桶即可。

  • 安装 s3fs
  • 将您的安全凭证以表格形式添加access-key-id:secret-access-key/etc/passwd-s3fs
  • 在以下位置添加铲斗安装条目fstab

    <bucket> /mnt/<bucket> fuse.s3fs rw,nosuid,nodev,allow_other 0 0
    

有关详细信息,请参阅我的指南设置对Amazon S3的SFTP访问


使用S3客户端

或使用任何免费的“ FTP / SFTP客户端”(也是“ S3客户端”),并且您无需在服务器端进行任何设置。例如,我的 WinSCPCyber​​duck

如果需要自动传输,WinSCP甚至具有脚本.NET / PowerShell界面


2
通过SFTP 连接时,将存储桶安装为root会带来以后的传输permission denied问题ec2-user/mnt/<bucket>文件夹归所有者所有,root并具有该组root
Elvismdev '16

1
@elvismdev / others-以ftp用户身份安装(使用uid / gid选项),并确保其已安装allow_other(或-o allow_other从s3fs命令行安装)。在我的情况下(在专用存储桶上),以只读权限(-o default_acl = public-read)写入文件也是一个好主意。
bshea

66

更新资料

S3现在为S3提供了一个完全托管的SFTP网关服务,服务与IAM集成,可以使用aws-cli进行管理。


从理论上和实践上来看,这都不是一个完美的解决方案,但是它确实起作用了。

您可以在Linux服务器上安装FTP / SFTP服务(如proftpd的),无论是在EC2或您自己的数据中心......然后装入桶到其中的FTP服务器配置为chroot环境,使用文件系统s3fs

我有一个提供S3之外内容的客户端,而该内容是由仅支持ftp push的第三方提供给他们的...因此,有些犹豫(由于S3与实际文件系统之间的阻抗不匹配)但缺少在编写适当的FTP / S3网关服务器软件包的时候(这几天我仍然打算这样做),几个月前我为他们提出并部署了此解决方案,他们还没有报告系统的任何问题。

另外,由于proftpd可以将每个用户chroot到自己的主目录中,并“假装”(据用户所知)proftpd用户所拥有的文件实际上是登录用户所拥有的,因此这会将每个ftp用户隔离到存储桶的“子目录”,并使其他用户的文件不可访问。


但是,默认配置存在问题。

一旦开始获取数十或数百个文件,问题就会在您拉出目录列表时显现出来,因为ProFTPd会尝试一遍.ftpaccess又一遍地反复读取文件,并且对于目录中的每个文件,.ftpaccess检查是否应允许用户查看。

您可以在ProFTPd中禁用此行为,但是我建议最正确的配置是-o enable_noobj_cache -o stat_cache_expire=30在s3fs中配置其他选项:

-o stat_cache_expire (默认为不过期)

指定统计信息缓存中条目的到期时间(秒)

如果没有此选项,您对S3的请求将减少,但如果外部进程或s3fs的其他实例也在修改存储桶中的对象,您也将始终无法可靠地发现对对象所做的更改。我的系统中的值“ 30”是任意选择的。

-o enable_noobj_cache (默认为禁用)

为不存在的对象启用缓存条目。s3fs执行某些命令时,s3fs始终必须检查对象(路径)下是否存在文件(或子目录),因为s3fs识别出一个不存在的目录,并且该目录下有文件或子目录。它增加了ListBucket请求,并使性能变差。您可以指定此选项以提高性能,s3fs会在状态缓存中记住该对象(文件或目录)不存在。

此选项使s3fs可以记住该位置.ftpaccess


与上述更改解决的ProFTPd可能引起的性能问题无关,您还需要-o enable_content_md5在s3fs中启用。

-o enable_content_md5 (默认为禁用)

通过content-md5标头验证上传的数据而没有多部分。上载对象时启用发送“ Content-MD5”标头,而无需分段发布。如果启用此选项,则在上传小对象时会对s3fs的性能产生一些影响。由于s3fs在上载大对象时总是检查MD5,因此该选项对大对象不起作用。

这是一个本不应该成为选项的选项-应该始终启用它,因为不这样做就绕开了关键完整性检查,而对性能的好处却微不足道。当对象通过Content-MD5:标头上传到S3时,S3将验证校验和,并在传输过程中损坏对象时将其拒绝。但是,不太可能,禁用此安全检查似乎是短视的。

引用来自s3fs的手册页。语法错误在原文中。


4
您能否详细说明此解决方案不理想的原因?
fernio

2
@MarcoMarsala大型目录的修复程序已添加到答案中。
Michael-sqlbot

1
@ Michael-sqlbot您是否尝试过在ProFTPd配置中使用“ AllowOverride off”指令以使其停止尝试完全读取“ .ftpaccess”文件?
格雷格·杜比奇

1
我已经尝试了所有方法,并且只能在挂载S3存储桶的文件夹级别上设置user:group /权限。然后,这些权限向下传播到S3上的每个文件夹。我已经尝试了许多事情,包括此S3FS命令的许多变体sudo s3fs bucket-name /local-mount-folder-name/ -o iam_role=sftp-server -o allow_other -o umask=022 -o uid=501 -o gid=501-一旦创建了Mounted S3文件夹,就无法更改其权限。
T. Brian Jones

1
@Sverre我仍在生产中使用此解决方案。它不会给我任何问题。
Michael-sqlbot

24

从2014年开始回答那些不赞成我的人:

好吧,S3不是FTP。但是,有很多支持S3的客户端。

OS X上几乎每个著名的FTP客户端都支持,包括TransmitCyber​​duck

如果您使用的是Windows,请查看Cyber​​duckCloudBerry

更新的2019年答案:

AWS最近发布了适用于SFTPAWS Transfer,该服务可能会满足您的需求。


2
如果您像我一样是服务器新手,那么Cyber​​duck的工作异常简单。只需单击“打开连接”,从下拉列表中选择S3,然后输入我的凭据。比上面提到的某些选项容易得多!
Marquizzo

7

或在您的AWS基础架构中为SFTP Gateway旋转Linux实例,以将上传的文件保存到Amazon S3存储桶。

Thorntech支持


2
几年来,我们一直在大型项目的生产中使用SFTP网关。我们发现它比s3fs更可靠
Jeff

3

Filezilla刚刚发布了其FTP客户端的专业版。它以简化的FTP体验连接到S3存储桶。我自己使用它(没有任何隶属关系),并且效果很好。


3

WinSCp现在支持S3协议

首先,确保您的具有S3访问权限的AWS用户已创建“访问密钥ID”。您还必须知道“秘密访问密钥”。在IAM管理控制台的“用户”页面上创建和管理访问密钥。

确保选择了“新站点”节点。

在“新站点”节点上,选择Amazon S3协议。

输入您的AWS用户访问密钥ID和秘密访问密钥

使用“保存”按钮保存您的站点设置。

使用登录按钮登录。


2

亚马逊已经发布了针对S3的SFTP服务,但它们仅支持SFTP(不支持FTP或FTPES),根据您的情况,它们的成本可能很高。

我是DocEvent.io的创始人,我们为您的S3存储桶提供FTP / S网关,而无需启动服务器或担心基础架构。

还有其他公司提供按月付费的独立FTP服务器,可以通过软件配置连接到S3存储桶,例如brickftp.com

最后,还有一些AWS Marketplace应用程序可以提供帮助,这是一个搜索链接。这些实例中的许多实例都在您自己的基础结构中-这意味着您必须自己管理和升级实例,随着时间的推移,这些实例可能难以维护和配置。


DocEvents看起来不错,但对免费计划有太多限制...我什至无法尝试该服务...
D.Dimitrioglo

1

正如其他发布者所指出的那样,AWS Transfer for SFTP服务存在一些限制。您需要紧密协调需求。例如,没有配额,白名单/黑名单,文件类型限制,并且基于非密钥的访问需要外部服务。还有一些与用户管理和IAM相关的开销,这在规模上可能会很痛苦。

我们已经为客户运行SFTP S3代理网关已有5年了。核心解决方案包含在Docker服务的集合中,并且可以部署在所需的任何环境中,甚至包括本地或本地开发服务器。我们的用例有些不同,因为我们的解决方案着重于数据处理和流水线而不是文件共享。在Salesforce示例中,客户将使用SFTP作为传输方法,将电子邮件,购买...数据发送到SFTP / S3代理。这已在S3上映射了一个对象键。到达后,将对数据进行拾取,处理,路由并将其加载到仓库。对于每次传输,我们也有相当重要的审核要求,这是Cloudwatch的AWS日志未直接提供的内容。

正如其他人提到的那样,也可以选择自己滚动。使用AWS Lightsail,您可以使用Route 53或ELB设置一个集群,例如10个$ 2 2GB实例的集群。

总的来说,很高兴看到AWS提供此服务,而且我希望它会随着时间的推移逐渐成熟。但是,根据您的用例,替代解决方案可能更合适。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.