将imagemagick文件从ec2直接保存到s3

时间:2012-06-16 10:03:39

标签: shell amazon-s3 amazon-ec2 amazon-web-services imagemagick

我将图像从url下载到ec2实例(wget),使用imagemagick(convert -actions $ savedfilename)处理它,然后将其保存到s3(使用php api)。

  1. 是否可以在ec2上处理图像并将其直接保存到s3而无需写入s3卷?
  2. 如果这是可能的,它是否有意义 - 它会更快/更便宜吗?
  3. 还有什么方法可以提高过程的效率吗?
  4. 是否有直接从shell保存到s3的API?

2 个答案:

答案 0 :(得分:2)

我猜你的意思是“......没有写入 EBS 卷”我是对的吗?您可以将Wgets输出直接传递给ImageMagicks转换,如下所示:

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png

看看s3cmd,它将允许您直接从命令行与S3交互。我们的示例工作流程将如下所示:

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png && s3cmd put --acl-public --guess-mime-type test.png s3://example.com/images/test.png

这将为您提供此结果,您可以使用正则表达式过滤以获取公共网址:

File 'test.png' stored as s3://example.com/images/test.png (xxxx bytes)
Public URL of the object is: http://example.com.s3.amazonaws.com/images/test.png

从文字中获取网址:

<?php
  $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
  $cmd_output = "File 'test.png' stored as s3://example.com/images/test.png (xxxx bytes) Public URL of the object is: http://example.com.s3.amazonaws.com/images/test.png";
  if(preg_match($reg_exUrl, $cmd_output, $url)) {
    $image_url = $url[0];
  }
  else {
    // no url found …
  }
?>

我想这是一个优雅的方式来完成你的过程:)我不确定它是否会更快或更便宜......也许有点因为EBS的坏磁盘I / O.

答案 1 :(得分:0)

来自aws s3 cli cp documentation

  

将本地文件流上传到S3

     

警告:: PowerShell可能会改变管道的编码或将CRLF添加到管道   输入

     

以下cp命令从标准上载本地文件流   输入到指定的存储桶和密钥:

aws s3 cp - s3://mybucket/stream.txt

与@ dom的回答类似,你可以做到

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png | aws s3 cp - s3://example.com/images/test.png --acl public