我将图像从 url 下载到 ec2 实例(wget),使用 imagemagick(convert -actions $savedfilename)处理它,然后将其保存到 s3(使用 php api)。
- 是否可以在ec2上处理图像并直接将其保存到s3而不写入s3卷?
- 如果这是可能的,它是否有意义——它会更快/更便宜吗?
- 是否还有其他措施可以提高流程的效率?
- 是否有直接从 shell 保存到 s3 的 API?
我将图像从 url 下载到 ec2 实例(wget),使用 imagemagick(convert -actions $savedfilename)处理它,然后将其保存到 s3(使用 php api)。
我猜你的意思是“......不写到EBS卷”我是对的吗?您可以将 Wgets 输出直接通过管道传输到 ImageMagicks convert,如下所示:
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