1

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

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

2 回答 2

2

我猜你的意思是“......不写到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 错误。

于 2012-06-16T11:23:34.433 回答
0

从 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
于 2017-08-11T15:36:21.963 回答