Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 将文件直接从S3移动到FTP_Amazon Web Services_Amazon S3_Amazon Ec2_Coldfusion_Scalability - Fatal编程技术网

Amazon web services 将文件直接从S3移动到FTP

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实例(我知道不会重新开始,也

我有一个在AWS(EC2 windows)上运行的基于媒体的web应用程序。我正试图通过在自动伸缩组中添加应用程序和web服务器来实现可伸缩性

我的问题是我需要将媒体存储分离到S3,以便我可以与不同的应用程序服务器集群共享。但我必须将这些媒体文件从S3移动到不同的FTP服务器。为此,我必须将文件从S3下载到AppServer,然后进行FTP上传,这需要花费太多的时间。注意,我使用ColdFusion作为应用服务器

现在我有两个选择来解决这个问题

  • 将S3实例装载到EC2实例(我知道不会重新开始,也不确定这是否有助于提高FTP上载的速度)
  • 用于将文件直接从S3上载到FTP服务器
  • 我不能对每个EC2实例使用单独的EBS卷,因为

  • 存储量大,成本高
  • 我需要同步连接到EC2实例的不同EBS卷上的媒体存储
  • EFS不是一个选项,因为我使用的是windows存储


    有谁能提出更好的解决方案吗?

    这对于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
    方法没有超时参数,所以我需要在child
    FtpCopier
    类中手动设置它。事实上我不记得为什么我重写了构造函数。看起来像标准的一个做同样的事情。有道理!谢谢你的回答。