对 Amazon S3 存储桶的 FTP/SFTP 访问 [关闭]

Posted

技术标签:

【中文标题】对 Amazon S3 存储桶的 FTP/SFTP 访问 [关闭]【英文标题】:FTP/SFTP access to an Amazon S3 Bucket [closed] 【发布时间】:2014-07-19 07:17:01 【问题描述】:

有没有办法通过 FTP 或 SFTP 而不是 AWS 控制台中的内置 Amazon 文件传输接口连接到 Amazon S3 存储桶?这似乎不是一个现成的选择,这似乎很奇怪。

【问题讨论】:

AWS released in Nov, 2018 完全托管的 SFTP 服务,可将文件直接传入和传出 Amazon S3。 AWS Transfer for SFTP 【参考方案1】:

共有三个选项。

您可以使用 Amazon 最近添加的本地托管 SFTP 服务(更易于设置)。 或者您可以将存储桶挂载到 Linux 服务器上的文件系统,并使用 SFTP 访问这些文件,就像访问服务器上的任何其他文件一样(这让您可以更好地控制)。 或者您可以只使用原生支持 S3 协议的(GUI)客户端(免费)。

托管 SFTP 服务

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

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

用户的权限由 IAM 服务中关联的 AWS 角色管理(为了快速入门,您可以使用 AmazonS3FullAccess 策略)。

该角色必须与transfer.amazonaws.com 建立信任关系。

详情请看我的指南Setting up an SFTP access to Amazon S3。


将存储桶挂载到 Linux 服务器

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

Install the s3fs

将您的安全凭证以access-key-id:secret-access-key 的形式添加到/etc/passwd-s3fs

fstab添加一个bucket安装入口:

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

详情请看我的指南Setting up an SFTP access to Amazon S3。


使用 S3 客户端

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

如果您需要自动传输,WinSCP 甚至还有 scripting 和 .NET/PowerShell interface。

【讨论】:

在通过 SFTP 连接 ec2-user 时,将存储桶安装为 root 会导致稍后传输 permission denied 出现问题。 /mnt/&lt;bucket&gt; 文件夹归 root 所有,并且还拥有组 root @elvismdev /others - 以 ftp 用户身份挂载(使用 uid/gid 选项)并确保使用 allow_other 挂载(如果从 s3fs 命令行挂载,则为 -o allow_other).. 对我有用.在我的情况下(在私有存储桶上)将文件写入只读权限(-o default_acl=public-read)也是一个好主意。【参考方案2】:

更新

S3 现在提供了一个fully-managed SFTP Gateway Service for S3,它与 IAM 集成并且可以使用 aws-cli 进行管理。


这不是一个完美的解决方案有理论上和实践上的原因,但它确实有效......

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

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

作为奖励,因为 proftpd 可以将每个用户 chroot 到他们自己的主目录并“假装”(据用户所知)proftpd 用户拥有的文件实际上由登录用户拥有,这将每个ftp 用户进入存储桶的“子目录”,并使其他用户的文件无法访问。


不过,默认配置有问题。

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

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

-o stat_cache_expire(默认为无过期)

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

如果不使用此选项,您将向 S3 发出更少的请求,但如果外部进程或 s3fs 的其他实例也在修改存储桶中的对象,您也不会总是可靠地发现对对象所做的更改。我系统中的值“30”被任意选择了。

-o enable_noobj_cache(默认禁用)

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

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


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

-o enable_content_md5(默认禁用)

通过 content-md5 标头验证没有多部分的上传数据。允许在上传对象而不进行分段发布时发送“Content-MD5”标头。如果启用此选项,它在上传小对象时对 s3fs 的性能有一些影响。因为 s3fs 在上传大对象时总是检查 MD5,所以这个选项对大对象没有影响。

这是一个不应该成为一个选项的选项——它应该始终启用,因为不这样做会绕过关键的完整性检查,而只会获得微不足道的性能优势。当带有Content-MD5: 标头的对象上传到 S3 时,S3 将验证校验和,如果对象在传输过程中损坏,则拒绝该对象。不管这不太可能,禁用此安全检查似乎是短视的。

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

【讨论】:

您能否详细说明此解决方案不理想的原因? @MarcoMarsala 已将针对大型目录的修复添加到答案中。 @Michael-sqlbot 您是否尝试在 ProFTPd 配置中使用“AllowOverride off”指令来使其完全停止尝试读取“.ftpaccess”文件? 我什么都试过了,只能在挂载 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 文件夹,我就无法更改对文件夹的任何权限。 @Sverre 我仍然在生产中使用这个解决方案。它不会给我带来任何问题。【参考方案3】:

从 2014 年开始为那些反对我的人回答:

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

OS X 上几乎所有著名的 FTP 客户端都支持,包括 Transmit 和 Cyberduck。

如果您使用的是 Windows,请查看 Cyberduck 或 CloudBerry。

2019 年更新答案:

AWS 最近发布了AWS Transfer for SFTP 服务,它可以满足您的需求。

【讨论】:

如果您是像我这样的服务器新手,Cyber​​duck 的工作非常简单。只需单击打开连接,从下拉列表中选择 S3,然后输入我的凭据。比上面提到的一些选项容易得多! 我认为有一点很重要,即如果使用 AWS Transfer 系列,他们可能会产生巨额成本。在您的终端节点上启用 SFTP:按每小时 0.30 美元的费率,您的 SFTP 每月费用为:0.30 美元 * 24 小时 * 30 天 = 216 美元0.04 美元 * 1 GB * 30 天 = 1.20 美元 加上上述费用,AWS Transfer 系列的每月总账单将为:216 美元 + 1.20 美元 = 217.20 美元。【参考方案4】:

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

Thorntech支持

【讨论】:

多年来,我们一直在大型项目的生产环境中使用 SFTP 网关。我们发现它比 s3fs 更可靠【参考方案5】:

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

【讨论】:

【参考方案6】:

Amazon 已经为 S3 发布了 SFTP 服务,但它们只提供 SFTP(不是 FTP 或 FTPES),而且根据您的具体情况,它们的成本可能过高。

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

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

最后还有一些 AWS Marketplace 应用程序可以提供帮助,here is a search link。其中许多实例在您自己的基础架构中启动 - 这意味着您必须自己管理和升级这些实例,随着时间的推移可能难以维护和配置。

【讨论】:

DocEvents 看起来不错,但对免费计划的限制太多...我什至无法尝试该服务...【参考方案7】:

WinSCp now supports S3 protocol

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

确保选择了新站点节点。

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

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

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

使用登录按钮登录。

【讨论】:

【参考方案8】:

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

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

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

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

【讨论】:

以上是关于对 Amazon S3 存储桶的 FTP/SFTP 访问 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有没有人达到过 Amazon S3 存储桶的读取或写入上限?

启用版本控制后,Amazon S3 对存储桶请求的 HTTP 503 响应显著增加

如何授予 Amazon SES 写入您的 Amazon S3 存储桶的权限

Amazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则

指向 Amazon S3 存储桶的子域在英国不起作用

用于社交网络的 Amazon S3?