对 Amazon S3 Bucket 的 FTP/SFTP 访问

有没有一种使用 FTP 或 SFTP 而不是 AWS 控制台中内置的 Amazon 文件传输接口连接到 Amazon S3桶的方法?很奇怪,这不是一个现成的选择。

264474 次浏览

回答2014年那些投票反对我的人:

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

OS X 上几乎所有著名的 FTP 客户端都有支持,包括 传送赛博鸭

如果你在 Windows 上,看看 赛博鸭或者 CloudBerry

2019年最新答案:

AWS 最近发布了 用于 SFTP 的 AWS 传输服务,它可以满足您的需求。

更新

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


有理论和实践的原因为什么这不是一个完美的解决方案,但它确实工作..。

您可以在 Linux 服务器上安装 FTP/SFTP 服务(比如 Proftpd) ,无论是在 EC2中还是在您自己的数据中心... ... 然后使用 S3fs将一个 bucket 挂载到将 FTP 服务器配置为 chroot 的文件系统中。

我有一个客户端,服务内容出自 S3,而内容是由第三方提供的,他们只支持 FTP 推送... 所以,有些犹豫(由于阻抗不匹配的 S3和实际文件系统) ,但没有时间写一个适当的 FTP/S3网关服务器软件包(我仍然打算这些天) ,我提出并部署这个解决方案为他们几个月前,他们没有报告任何问题的系统。

额外的好处是,由于 Proftpd 可以将每个用户 chroot 到他们自己的主目录中,并且“假装”(就用户所知) Proftpd 用户所拥有的文件实际上是登录用户所拥有的,这就将每个 ftp 用户隔离到 bucket 的一个“子目录”中,使其他用户的文件无法访问。


但是,默认配置有一个问题。

一旦你开始获取几十个或几百个文件,当你拉一个目录列表时,问题就会显现出来,因为 ProFTPd 会尝试一遍又一遍地读取 .ftpaccess文件,对于目录中的每个文件,都会检查 .ftpaccess以确定是否允许用户查看它。

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

-o stat_cache_expire(默认值不过期)

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

如果没有这个选项,您对 S3的请求会减少,但是如果外部进程或 s3fs 的其他实例也在修改 bucket 中的对象,那么您也不会总是可靠地发现对对象所做的更改。我系统中的值“30”是任意选择的。

-o enable_noobj_cache(默认为禁用)

为不存在的对象启用缓存条目。当 s3fs 执行某些命令时,s3fs 总是必须检查 file (或子目录)是否存在于 object (path)下,因为 s3fs 已经识别出一个不存在的目录,并且在其下有文件或子目录。它增加了 ListBucket 请求,使性能变差。您可以为性能指定此选项,s3fs 会在统计缓存中记住对象(文件或目录)不存在。

这个选项允许 s3fs 记住 .ftpaccess不在那里。


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

-o enable_content_md5(默认为禁用)

通过 content-md5头验证不包含多部分的上传数据。允许在上传对象时发送“ Content-MD5”头,而不需要多部分发送。如果启用此选项,则在上载小对象时会对 s3fs 的性能产生一些影响。因为 s3fs 在上传大对象时总是检查 MD5,所以这个选项不会影响大对象。

这是一个永远不应该成为一个选项的选项——它应该始终被启用,因为不这样做只会为了微不足道的性能好处而绕过关键的完整性检查。当一个带有 Content-MD5:头的对象上传到 S3时,S3将验证校验和并拒绝在传输过程中损坏的对象。不管这种可能性有多小,禁用这种安全检查似乎是目光短浅。

引号来自 s3fs 的手册页,语法错误出现在原文中。

有三个选择。

  • 您可以使用 Amazon 最近添加的本地托管 SFTP 服务(这更容易设置)。
  • 或者,您可以将 bucket 挂载到 Linux 服务器上的文件系统,并使用 SFTP 访问这些文件,就像访问服务器上的任何其他文件一样(这样可以获得更大的控制权)。
  • 或者您可以直接使用本机支持 S3协议的(GUI)客户端(免费的)。

管理式自助上网服务

  • 在 AmazonAWS 控制台中,转到 用于 SFTP 的 AWS 传输并创建一个新服务器。

  • 在 SFTP 服务器页中,添加一个新的 SFTP 用户(或用户)。

    • 用户权限由 IAM 服务中的相关 AWS 角色控制(为了快速启动,可以使用 AmazonS3FullAccess策略)。

    • 角色必须与 transfer.amazonaws.com具有信任关系。

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


在 Linux 服务器上安装桶

只需使用 s3fs文件系统(或类似的)将 bucket 挂载到 Linux 服务器(例如 Amazon EC2) ,并使用服务器内置的 SFTP 服务器访问 bucket。

  • 安装 s3fs

  • 将表单 access-key-id:secret-access-key中的安全凭据添加到 /etc/passwd-s3fs

  • fstab中添加一个桶装入口:

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

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


使用 S3客户端

或者使用任何免费的 “ FTP/SFTP 客户端”,这也是一个 “ S3客户端”,并且您没有在服务器端设置任何东西。例如,天啊 WinSCP赛博鸭

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

或者在 AWS 基础设施中为 SFTP 网关旋转 Linux 实例,将上载的文件保存到 AmazonS3桶中。

Thorntech支持

Filezilla 刚刚发布了他们 FTP 客户端的 专业版。它连接到 S3桶在一个流线型的 FTP 一样的经验。我自己使用它(没有任何隶属关系) ,它工作得很好。

Amazon 已经为 S3发布了 SFTP 服务,但是它们只能执行 SFTP (而不是 FTP 或 FTPES) ,并且根据您的情况,它们的成本可能高得令人望而却步。

我是 DocEvent.io的创始人,我们为您的 S3桶提供 FTP/S 网关,而不用担心服务器或基础设施。

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

最后,还有一些 AWS 市场应用程序可以提供帮助,这里有一个搜索链接。这些实例中的许多都会在您自己的基础设施中生成——这意味着您必须自己管理和升级这些实例,随着时间的推移,这些实例很难维护和配置。

WinSCp 现在支持 S3协议

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

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

在“新建站点”节点上,选择 AmazonS3协议。

输入 AWS 用户访问密钥 ID 和 Secret 访问密钥

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

使用 Login 按钮登录。

正如其他海报所指出的,用于 SFTP 服务的 AWS 传输存在一些局限性。您需要紧密地对齐需求。例如,没有配额、白名单/黑名单、文件类型限制和非基于键的访问需要外部服务。还有一些与用户管理和 IAM 相关的开销,这可能会成为一个规模上的痛苦。

我们已经为我们的客户运行 S3代理网关大约5年了。核心解决方案包装在一组 Docker 服务中,并部署在任何需要的上下文中,甚至是本地或本地开发服务器中。我们的用例有些不同,因为我们的解决方案是重点数据处理和管道与文件共享。在 Salesforce 示例中,客户将使用 SFTP 作为向 SFTP/S3端点发送电子邮件、购买... 数据的传输方法。这在 S3上映射了一个对象键。到达后,数据被提取、处理、路由并加载到一个仓库。对于每次传输,我们还有相当重要的审计需求,这是 AWS 的 Cloudwatch 日志没有直接提供的。

正如其他人提到的,自己卷也是一种选择。使用 AWS Lightsail,您可以使用 Route 53或 ELB 设置一个102GB 实例的集群,比如4。

总的来说,看到 AWS 提供这种服务是非常棒的,我期望随着时间的推移它会逐渐成熟。但是,根据您的用例,可选的解决方案可能更适合您。