URLからec2インスタンス(wget)に画像をダウンロードし、imagemagick(convert -actions $ savedfilename)で処理してから、s3(php api)に保存します。
- ec2でイメージを処理し、s3ボリュームに書き込まずにs3に直接保存することは可能ですか?
- これが可能であれば、それは理にかなっていますか?それはより速く/より安くなりますか?
- プロセスの効率を改善するためにできることは他にありますか?
- シェルから直接s3に保存するAPIはありますか?
URLからec2インスタンス(wget)に画像をダウンロードし、imagemagick(convert -actions $ savedfilename)で処理してから、s3(php api)に保存します。
「... 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
これにより、この結果が得られます。これは、正規表現を使用してフィルタリングし、パブリックURLを取得できます。
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ドキュメントから:
ローカルファイルストリームを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