2016-08-30 88 views
0

我有一个由AWS(EC2和其他服务)支持的iOS应用程序。但是我有一个关于将用户生成的文件(如图像和视频)上传到后端的问题。我正在考虑将它们直接上传到S3存储桶或上传到EC2,并让EC2将它们传递到S3存储桶。我倾向于上传到EC2,因为我不希望任何人对我的文件系统有写入权限,但是,这可能需要我的EC2实例大量繁重工作。如果我直接上传到S3,我如何确保安全性,而不使用临时URL(我使用SDWebImage下载和缓存图像,临时URL会导致SDWebImage下载相同的图像,而不是从本地检索)?任何建议将不胜感激。使用AWS EC2 Endpoint或S3的iOS

回答

0

所以你要通过Lambda去耦这个。

请勿使用EC2。没有必要。

创建一个S3桶被称为 “应用程序,无论”

保持你的水桶PRIVATE。您不必为用户提供访问权限。他们可以使用生成的URL进行保密。让每个用户都有自己的文件夹(这是前缀)。

看上去很花哨,从用户端放入S3的每一项。使用ios'arc4'公式随机生成每个密钥或任何你想要的,然后附加文件类型。因此,blahblab.png

将元数据字段放入名为thumbnail的文件以及文件名的值加上-thumb。所以blahblah-thumb.png

回顾:您正在上传一个文件到S3,元数据字段为thumbnail。而已。

然后创建一个Lambda函数来响应S3中的每个PUT文件。如果你喜欢Node.JS,可以使用imagemagick模块(很适合你)来生成一个128x128的缩略图或其他东西。 lambda函数接收文件的S3数据。获取源文件的主文件(键名),缩略图元数据将成为输出。运行您的IM功能并将输出文件放入S3存储桶中。现在你有两个文件在桶中。大。

现在,当你列出这些文件,不要下载每一个。从文件获取元数据并获取元数据中的密钥的presignedUrl

这将会很快。例如,在App Store上查看iSkore的高清摄像头。

+0

如果S3存储区是私人的,我怎样才能使用SDWebImage与网址下载图片?访问将被拒绝否? – jackson

+0

您打电话给's3.getSignedUrl',它为您提供了一个临时链接,您提供给SDWebImage – iSkore

+0

我明白了。那个链接每次改变都正确吗? SDWebImage如何缓存图像呢?因为我认为SDWebImage使用url作为从磁盘和内存查询的关键字,如果URL更改,关键字也会随之更改。然后SDWebImage会认为它从来没有得到这个图像,所以它会从互联网上下载它。 – jackson

0

这真的取决于你的限制原因。如果您授予应用程序将图像上传到您的EC2服务器的权限,然后将其转发给S3,那么您获得的是什么? S3允许您使用重要的预先修订来限制基于用户的对象(如果您使用Cognito进行身份验证,这很容易)。例如,你可以这样做,所以你的S3结构就像/images/{userId}/myImage.jpg,每个用户只能上传到他们的文件夹。你可以把它完全私人的,也可以让其他用户从该文件夹读不能写等...

的几点思考: - 你可以黑名单用户潜在 - 你可以限制请求,或检查和拒绝某些图像 - 您可以拥有比S3提供的更复杂的安全模型

您可以使用API​​ Gateway作为前两种用例。

如果您确实想使用ec2,那么预签名的URL将会更改。我不确定SDWebImage是如何工作的,所以我不能评论它的缓存能力。