是否有一种方法可以使用FTP或SFTP连接到Amazon S3存储桶,而不是在AWS控制台中内置的Amazon文件传输接口?看起来很奇怪为什么这不是一个常见的选项。
这里有三个选项。
在您的Amazon AWS控制台中,转到AWS Transfer for SFTP并创建新服务器。
在SFTP服务器页面上,添加一个新的SFTP用户(或多个用户)。
用户的权限由IAM服务中关联的AWS角色管理(为快速起步,您可以使用AmazonS3FullAccess策略)。
该角色必须对transfer.amazonaws.com
具有信任关系。
有关详细信息,请参见我的指南设置对Amazon S3的SFTP访问。
只需使用s3fs
文件系统(或类似文件系统)将存储桶挂载到Linux服务器(例如Amazon EC2),然后使用服务器内置的SFTP服务器访问存储桶。
以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”。
或者使用任何免费的"FTP / SFTP客户端",这也是一个"S3客户端",您无需在服务器端安装任何内容。例如,我使用的WinSCP或Cyberduck。
WinSCP甚至拥有脚本化 和.NET/PowerShell界面 ,如果您需要自动执行传输操作。
allow_other
(如果从s3fs命令行挂载,则使用-o allow_other
)进行挂载。这对我有效。在我的情况下(在私有bucket上),以只读权限写入文件也是一个好主意(-o default_acl=public-read
)。 - B. Shea更新
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手册页面。语法错误属于原始文本。
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针对那些对我点踩的人的2014年回答:
好的,S3不是FTP。然而有许多客户端支持S3。
几乎所有在OS X上值得注意的FTP客户端都支持,包括Transmit和Cyberduck。
如果你使用Windows,可以看看Cyberduck或CloudBerry。
2019年更新的答案:
AWS最近推出了AWS Transfer for SFTP服务,可能可以满足您的需求。
首先,确保您拥有具有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按钮登录。
正如其他人提到的那样,自己编写也是一种选择。使用AWS Lightsail,您可以设置一个由4个$10 2GB实例组成的集群,使用Route 53或ELB。
总的来说,看到AWS提供这项服务真是太好了,我期望它会随着时间的推移变得更加成熟。然而,根据您的用例,可能有更适合的替代方案。