Amazon web services 将文件直接从S3移动到FTP
我有一个在AWS(EC2 windows)上运行的基于媒体的web应用程序。我正试图通过在自动伸缩组中添加应用程序和web服务器来实现可伸缩性 我的问题是我需要将媒体存储分离到S3,以便我可以与不同的应用程序服务器集群共享。但我必须将这些媒体文件从S3移动到不同的FTP服务器。为此,我必须将文件从S3下载到AppServer,然后进行FTP上传,这需要花费太多的时间。注意,我使用ColdFusion作为应用服务器 现在我有两个选择来解决这个问题Amazon web services 将文件直接从S3移动到FTP,amazon-web-services,amazon-s3,amazon-ec2,coldfusion,scalability,Amazon Web Services,Amazon S3,Amazon Ec2,Coldfusion,Scalability,我有一个在AWS(EC2 windows)上运行的基于媒体的web应用程序。我正试图通过在自动伸缩组中添加应用程序和web服务器来实现可伸缩性 我的问题是我需要将媒体存储分离到S3,以便我可以与不同的应用程序服务器集群共享。但我必须将这些媒体文件从S3移动到不同的FTP服务器。为此,我必须将文件从S3下载到AppServer,然后进行FTP上传,这需要花费太多的时间。注意,我使用ColdFusion作为应用服务器 现在我有两个选择来解决这个问题 将S3实例装载到EC2实例(我知道不会重新开始,也
有谁能提出更好的解决方案吗?这对于python来说非常简单
从ftplib导入FTP
从套接字导入\u全局\u默认\u超时
导入urllib.request
FtpCopier类(FTP):
源地址=无
超时=\全局\默认\超时
#主人→ ftp主机名/ip
#使用者→ ftp登录用户
#密码→ ftp密码
#港口→ ftp端口
#编码→ ftp服务器编码
def _uinit _;(self,host,user,password,port=21,encoding='utf-8'):
self.host=host
self.user=用户
self.password=密码
self.port=端口
self.connect(self.host、self.port)
self.login(self.user,self.password“”)
self.encoding=编码
#网址→ 任何web URL(例如S3)
#到u路→ ftp服务器完整路径(检查ftp目标文件夹是否存在)
#块大小→ 数据读取大小
def传输(自身、url、到路径、块大小\u mb=10):
chunk_size_mb=chunk_size_mb*1048576#1024*1024
文件\u handle=urllib.request.urlopen(url)
self.storbinary(“存储%s”%to\u路径、文件句柄、块大小\u mb)
使用示例:
ftp=FtpCopier(“some_host.com”,“user”p@ssw0rd")
ftp.transfer(“https://bucket.s3.ap-northeast-2.amazonaws.com/path/file.jpg“,”/path/new_file.jpg”)
但请记住,lambda处理时间是有限的。因此,在文件传输完成之前可能会出现超时。我建议改用lambda。这样就可以让正在运行的进程保持您想要的时间
如果S3文件不是公共文件,则使用通过urllib访问它
aws s3预签名s3://bucket/path/file.jpg——将于604800过期
FWIW,据我所知,这一切都与ColdFusion无关。您可能会询问有关存储问题的服务器故障。AWS几个月前宣布了一项允许您使用S3代替FTP服务器的措施。你调查过了吗?嘿,谢谢你的回答。你能详细说明一下你在用timeout=\u GLOBAL\u DEFAULT\u timeout
做什么吗?正如你在父类FTP
中看到的,调用构造函数时设置超时。我的\uuuu init\uuuu
方法没有超时参数,所以我需要在childFtpCopier
类中手动设置它。事实上我不记得为什么我重写了构造函数。看起来像标准的一个做同样的事情。有道理!谢谢你的回答。