Amazon S3存储桶的FTP/SFTP访问

163

是否有一种方法可以使用FTP或SFTP连接到Amazon S3存储桶,而不是在AWS控制台中内置的Amazon文件传输接口?看起来很奇怪为什么这不是一个常见的选项。


3
AWS于2018年11月发布了全托管的SFTP服务(AWS Transfer for SFTP),可直接将文件传输到Amazon S3中并从其中传出。详情请查看AWS Transfer for SFTP - mitaka
8个回答

131

这里有三个选项。

  • 您可以使用Amazon托管的本机SFTP服务(也称为AWS Transfer for 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
    

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


使用S3客户端

或者使用任何免费的"FTP / SFTP客户端",这也是一个"S3客户端",您无需在服务器端安装任何内容。例如,我使用的WinSCPCyberduck

WinSCP甚至拥有脚本化 .NET/PowerShell界面 ,如果您需要自动执行传输操作。


3
将桶以“root”身份挂载会在通过SFTP连接到“ec2-user”时导致后续传输出现“权限被拒绝”的问题。 “/mnt/<bucket>”文件夹归属于“root”用户并且组也是“root”。 - elvismdev
3
@elvismdev /others - 使用uid/gid选项将其挂载为ftp用户,并确保它使用allow_other(如果从s3fs命令行挂载,则使用-o allow_other)进行挂载。这对我有效。在我的情况下(在私有bucket上),以只读权限写入文件也是一个好主意(-o default_acl=public-read)。 - B. Shea

69

更新

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


有理论和实际原因说明这并不是一个完美的解决方案,但它确实可以工作...

您可以在Linux服务器上安装FTP / SFTP服务(例如proftpd),可以在EC2或自己的数据中心中...然后使用s3fs将存储桶挂载到文件系统中,其中ftp服务器配置为chroot。

我有一个客户从S3中提供内容,而内容由第三方提供商提供支持ftp推送...因此,由于S3和实际文件系统之间的阻抗不匹配,我有些犹豫,但由于没有时间编写正确的FTP / S3网关服务器软件包(我仍打算有朝一日这样做),我几个月前为他们提出并部署了这个解决方案,他们没有报告任何问题。

作为奖励,由于proftpd可以将每个用户chroot到他们自己的主目录中,并且(就用户而言)“假装” proftpd用户拥有已登录的用户拥有的文件,这将把每个ftp用户隔离到存储桶的“子目录”中,并使其他用户的文件不可访问。


但是默认配置存在问题。

一旦您开始获得几十或几百个文件,当您拉取目录列表时,问题将显现,因为ProFTPd将尝试一遍又一遍地读取.ftpaccess文件,并对目录中的每个文件进行检查以查看是否应该允许用户查看它。

您可以在ProFTPd中禁用此行为,但我建议在s3fs中配置附加选项-o enable_noobj_cache -o stat_cache_expire=30

-o stat_cache_expire(默认值为no expire)

指定stat缓存中条目的过期时间(秒)

如果没有此选项,您将向S3发出较少的请求,但也不会始终可靠地发现其他进程或s3fs实例正在修改存储桶中的对象所做的更改。我的系统中的“30”值是有些随意选择的。

-o enable_noobj_cache(默认值为disable)

启用缓存条目,用于未存在的对象。s3fs在执行一些命令时,始终需要检查是否存在对象(或子目录)在对象路径下,因为s3fs已经识别到一个不存在的目录,并在其下有文件或子目录。这将增加ListBucket请求并导致性能差。为了提高性能,您可以指定此选项,s3fs会在stat缓存中记忆该对象(文件或目录)不存在。

此选项允许s3fs记住.ftpaccess不存在。


与可能出现的ProFTPd性能问题无关——这些问题可以通过以上更改解决——您还需要在s3fs中启用-o enable_content_md5

验证上传数据而不是分块传输的内容MD5标头。在上传对象时启用“Content-MD5”标头而不使用分块发布时启用。如果启用了此选项,则会对s3fs上传小对象的性能产生某些影响。因为上传大对象时s3fs始终检查MD5,所以此选项不会影响大对象。

这是一个本不应该成为选项的选项——因为即使获得微不足道的性能好处也绕过了关键完整性检查,所以它应该始终启用。当使用Content-MD5:标头上传对象到S3时,S3会验证校验和。如果在传输过程中损坏,则拒绝该对象。虽然这可能不太可能发生,但禁用此安全检查似乎是短视的。

引文来自s3fs手册页面。语法错误属于原始文本。


5
你能否详细说明为什么这个解决方案不太理想? - fernio
2
@MarcoMarsala,针对大目录的修复已添加到答案中。 - Michael - sqlbot
1
@Michael-sqlbot,你尝试过在ProFTPd配置中使用“AllowOverride off”指令来完全停止尝试读取“.ftpaccess”文件吗? - Greg Dubicki
1
我已经尝试了所有方法,只能在挂载S3存储桶的文件夹级别上设置用户:组/权限。然后这些权限会向下传播到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 - 一旦创建了挂载的S3文件夹,我就无法更改其中任何文件夹的权限。 - T. Brian Jones
1
@Sverre 我仍在生产中使用这个解决方案。它没有给我任何问题。 - Michael - sqlbot
显示剩余7条评论

25

针对那些对我点踩的人的2014年回答:

好的,S3不是FTP。然而有许多客户端支持S3。

几乎所有在OS X上值得注意的FTP客户端都支持,包括TransmitCyberduck

如果你使用Windows,可以看看CyberduckCloudBerry

2019年更新的答案:

AWS最近推出了AWS Transfer for SFTP服务,可能可以满足您的需求。


3
如果你像我这样是服务器新手, Cyberduck 的使用非常容易。只需点击“打开连接”,从下拉菜单中选择 S3 并输入我的凭据即可。比上面提到的一些选项更容易! - M -
3
我认为有必要提到,如果使用AWS Transfer Family,则可能会产生显著的费用。启用端点上的SFTP:按每小时$0.30的费率计算,您每月使用SFTP的费用为:$0.30 * 24小时 * 30天 = $216SFTP数据上传和下载:按每GB $0.04的费率计算,您每月使用SFTP进行数据上传和下载的费用为:$0.04 * 1 GB * 30天 = $1.20将上述费用相加,您使用AWS Transfer Family的总月度账单为:$216 + $1.20 = $217.20。 - stromyc

7
在您的AWS基础设施中为SFTP网关旋转Linux实例,将上传的文件保存到您的Amazon S3存储桶中。
Thorntech支持。

3
我们已经在生产中使用SFTP Gateway多年来处理大型项目。我们发现它比s3fs更可靠。 - Jeff

3
亚马逊已经发布了针对S3的SFTP服务,但他们仅支持SFTP(不支持FTP或FTPES),并且根据您的情况可能会过于昂贵。我是DocEvent.io的创始人,我们为您的S3存储桶提供FTP/S门户,而无需启动服务器或担心基础设施问题。还有其他公司提供独立的FTP服务器,您可以按月付费,通过软件配置连接到S3存储桶,例如brickftp.com。最后,也有一些AWS Marketplace应用程序可以帮助,这里是搜索链接。其中许多都会在您自己的基础设施中启动实例 - 这意味着您必须自行管理和升级实例,这对于长期维护和配置可能会很困难。

DocEvents 看起来不错,但免费计划的限制太多了...我甚至无法尝试这项服务... - D.Dimitrioglo

3

WinSCP现在支持S3协议

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

确保选择了New site节点。

在New site节点上,选择Amazon S3协议。

输入您的AWS用户Access key ID和Secret access key

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

使用Login按钮登录。


2
Filezilla刚刚发布了其FTP客户端的专业版。它提供了流畅的FTP体验,可连接到S3存储桶。我本人使用过(与他们无关),效果非常好。请保留HTML标记。

1
作为其他帖子中指出的,AWS Transfer for SFTP服务存在一些限制。您需要密切对齐要求。例如,没有配额、白名单/黑名单、文件类型限制,非基于密钥的访问需要外部服务。还有一个与用户管理和IAM相关的特定开销,规模扩大后可能会变得麻烦。
我们已经运行了一个SFTP S3代理网关SFTP S3 Proxy Gateway,为我们的客户提供约5年的服务。核心解决方案包含在一系列Docker服务中,并在需要的任何上下文中部署,甚至可以在本地开发服务器上进行部署。对我们来说,使用情况有点不同,因为我们的解决方案侧重于数据处理和管道,而不是文件共享。在Salesforce的示例中,客户将使用SFTP作为传输方法,将邮件、购买...数据发送到SFTP/S3终点。这被映射到S3上的对象键。到达后,数据被拾取、处理、路由并加载到仓库中。我们还有相当重要的每个传输的审计要求,这是AWS的Cloudwatch日志不能直接提供的。

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

总的来说,看到AWS提供这项服务真是太好了,我期望它会随着时间的推移变得更加成熟。然而,根据您的用例,可能有更适合的替代方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接