2012-06-16 27 views
1

我從url下載一個圖像到一個ec2實例(wget),使用imagemagick處理它(convert -actions $ savedfilename),然後將它保存到s3(使用php api)。將imagemagick文件直接保存到ec2的s3

  1. 是否有可能在ec2上處理圖像並將其直接保存到s3而不寫入s3卷?
  2. 如果這是可能的,它是否有意義 - 它會更快/更便宜?
  3. 還有什麼可以做的,以提高過程的效率?
  4. 是否有API直接從shell保存到s3?

回答

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 

獲取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。

+0

之一我的imagemagick命令有兩個步驟,並且需要在應用第二步之前保存第一步的結果。是否有可能將第一步的結果保存在內存中,而不是在第二步中寫入卷並從內存訪問它? – waigani

+0

發佈一些代碼,然後我可以幫助你。或者看看這個討論:http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20906 – dom

+0

+1有用的評論 - 鏈接正是我所需要的。 – waigani

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