我从url下载一个图像到一个ec2实例(wget),使用imagemagick处理它(convert -actions $ savedfilename),然后将它保存到s3(使用php api)。将imagemagick文件直接保存到ec2的s3
- 是否有可能在ec2上处理图像并将其直接保存到s3而不写入s3卷?
- 如果这是可能的,它是否有意义 - 它会更快/更便宜?
- 还有什么可以做的,以提高过程的效率?
- 是否有API直接从shell保存到s3?
我从url下载一个图像到一个ec2实例(wget),使用imagemagick处理它(convert -actions $ savedfilename),然后将它保存到s3(使用php api)。将imagemagick文件直接保存到ec2的s3
我猜“不写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
获取URL
<?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。
从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
之一我的imagemagick命令有两个步骤,并且需要在应用第二步之前保存第一步的结果。是否有可能将第一步的结果保存在内存中,而不是在第二步中写入卷并从内存访问它? – waigani
发布一些代码,然后我可以帮助你。或者看看这个讨论:http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20906 – dom
+1有用的评论 - 链接正是我所需要的。 – waigani