【问题标题】:iOS with AWS EC2 Endpoint or S3带有 AWS EC2 终端节点或 S3 的 iOS
【发布时间】:2016-08-30 20:52:25
【问题描述】:

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

【问题讨论】:

    标签: ios amazon-web-services amazon-s3 amazon-ec2 server


    【解决方案1】:

    因此,您将希望通过 Lambda 将其解耦。

    不要使用 EC2。相当不必要。

    创建一个名为“app-whatever”的 S3 存储桶

    保持您的存储桶为私有。您不必授予用户访问权限。它们可以是私有的,带有生成的 URL。让每个用户都有自己的文件夹(这是前缀)。

    为了花哨,从用户端将每个项目放入 S3 中。使用 ios 'arc4' 公式或您想要的任何内容随机生成每个密钥,然后附加文件类型。所以blahblab.png

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

    回顾:您正在将元数据字段为 thumbnail 的单个文件上传到 S3。就是这样。

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

    现在,当您列出这些文件时,不要下载每个文件。从文件中获取元数据,并为元数据中的键获取presignedUrl

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

    【讨论】:

    • 如果 S3 存储桶是私有的,我如何使用带有 URL 的 SDWebImage 来下载图像?访问会被拒绝吗?
    • 您致电s3.getSignedUrl,它会为您提供一个您提供给 SDWebImage 的临时链接
    • 我明白了。该链接每次都更改正确吗?那么 SDWebImage 如何缓存图像呢?因为我认为 SDWebImage 使用 url 作为 key 从磁盘和内存中查询,如果 url 改变,key 也会改变。然后 SDWebImage 会认为它以前从未获得过这张图片,所以它会从互联网上下载它。
    • 哦,我明白了。好吧,当我这样做时,我创建了自己的类,其行为相同。基本上,当您下载图像时,将链接从 http 请求更改为文件目标。不要忘记在用户请求完整图像之前只下载缩略图。
    • 或者你只是使用 S3 获取对象而不是超链接。然后将 NSData 发送到图像类
    【解决方案2】:

    这实际上取决于您限制的原因是什么。如果您授予应用程序将图像上传到您的 EC2 服务器的权限,然后它只是将其转发到 S3,您将获得什么? S3 允许您使用密钥前缀来限制基于用户的对象(如果您使用 Cognito 进行身份验证,这很容易)。例如,您可以使您的 S3 结构类似于 /images/{userId}/myImage.jpg 并且每个用户只能上传到他们的文件夹。您可以将其设为完全私有,或者您可以让其他用户从该文件夹中读取但不写入等...

    一些想法: - 您可能会将用户列入黑名单 - 您可以限制请求,或检查并拒绝某些图像 - 你可以拥有比 S3 提供的更复杂的安全模型

    您可以将 API Gateway 用于前 2 个用例。

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

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 2020-11-09
      • 2022-01-09
      • 2017-07-27
      • 2017-10-19
      • 2018-02-07
      • 1970-01-01
      • 2022-08-21
      • 2021-11-25
      相关资源
      最近更新 更多