【问题标题】:S3 image read/write from Beanstalk/EC2 Web application从 Beanstalk/EC2 Web 应用程序读取/写入 S3 图像
【发布时间】:2018-12-08 23:17:36
【问题描述】:

我有一个允许用户上传图像的 Web 应用程序(Linux EC2 实例上的 Elastic Beanstalk 管理 PHP)。

我担心的是,如果我上传我的代码,我首先必须下载所有图像,然后如果它们保留在 EC2 上,则使用我的新代码重新上传它们。所以显而易见的解决方案似乎是将图像目录移动到S3。

到目前为止,我发现的方法是安装驱动器或 SDK。我发现,对于这两种方法,似乎 Elastic Beanstalk 都在一个写保护的驱动器位置运行,这阻止了我访问其他方法。

例如,对于已安装的驱动器,我无法递归足够的目录来访问已安装的驱动器。 Beanstalk 在 /var/app/current/ 中运行,挂载的驱动器位于 /var/s3-{bucket mount name}。如果我尝试访问它(../../s3-{bucket mount name}),它会在与我的应用程序相同的文件夹中查找它。

当我按照 SDK 的说明进行操作时,我在 ec2-user 中安装了它。所以它位于 /home/ec2-user/vendor/autoload.php 并且和以前一样,我也无法访问该文件夹(即使来自 require 语句)!

我从这里去哪里?我已经搜索并阅读了所有我能找到的似乎有用的东西,但我没有得到任何结果。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-ec2 amazon-elastic-beanstalk


    【解决方案1】:

    这似乎奏效了,我比其他解决方案更喜欢它:

    我正在使用存储桶权限策略,仅允许访问找到的特定 URL:https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4

    这允许我限制对我的图像的访问(至少在我能够尝试的范围内),但来自我的网络主机的图像除外。我仍然会使用 API 进行文件写入,如果由于某种原因我发现我需要列出一个目录。

    至于我关于包含 composer.json 文件的部分,我开始上传它,而不是尝试从我的代码中引用 autoload.php 文件。并使用 DIR 作为包含路径。如果没有克里斯蒂安的帮助,这两个都是我不会想到的关键部分。

    【讨论】:

      【解决方案2】:

      我不完全确定我理解你的意思,它在与你的应用程序相同的文件夹中查找,但这是我从基于 PHP 的 Web 应用程序读取/写入 S3 文件的方法:

      1) 为您的应用程序创建一个新存储桶。此存储桶可以与管理您的 Elastic Beanstalk 项目的存储桶分开。

      2) 在您的存储桶中,转到权限->存储桶策略并添加此策略以公开您的图像。 重要提示:将 BUCKET_NAME 替换为您的存储桶的实际名称

      {
        "Id": "Policy1397632521960",
        "Statement": [
          {
            "Sid": "Stmt1397633323327",
            "Action": [
              "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::BUCKET_NAME/*",
            "Principal": {
              "AWS": [
                "*"
              ]
            }
          }
        ]
      }
      

      Source

      3) 使用 Amazon SDK 创建一个 composer.json 文件并替换为您想要的任何版本。将 composer.json 放在项目文件夹的根目录中。 (当您上传项目代码时,Elastic Beanstalk 会为您施展魔法,并将安装所有 composer 包)。

      {
          "require": {
              "aws/aws-sdk-php": "3.27.1",
          }
      }
      

      4) 将其包含在处理文件上传的 PHP 文件的顶部。

      require __DIR__ . '/vendor/autoload.php';
      use Aws\S3\S3Client;
      

      5) 使用 AWS PHP 开发工具包创建一个 S3Client 对象。将 YOUR_KEY、YOUR_SECRET 和 YOUR_BUCKET_REGION 替换为正确的值。同样,将其添加到同一个文件中。

      $client = S3Client::factory(
           [
               'credentials' =>
                [
                       'key'    => 'YOUR_KEY',
                       'secret' => 'YOUR_SECRET'
                   ],
                'region' => 'YOUR_BUCKET_REGION',
                'version' => 'latest'
               ]
      );
      

      6) 现在终于,在完成了所有有趣的设置之后,当用户上传文件时,您可以将图像对象放入 S3 中。将 BUCKET_NAME 替换为您的存储桶的确切名称,将 FILE_NAME.JPG 替换为 S3 上的目标文件名,将 PATH/TO/TEMP_FILE.JPG 替换为在您的 Elastic Beanstalk 服务器上存储图像的临时路径。

      $client->putObject([
                          'Bucket' => 'BUCKET_NAME',
                          'Key' => 'FILE_NAME.JPG',
                          'Body' => fopen('PATH/TO/TEMP_FILE.JPG', 'rb'),
                          'ACL' => 'public-read'
                         ]);
      

      7) 好的,这样处理文件写入。现在,一旦您想向用户显示上传的文件,您可以使用常规标签来执行此操作。同样,用正确的值替换所有大写的字段:

      <img src="https://s3-YOUR_BUCKET_REGION.amazonaws.com/BUCKET_NAME/FILE_NAME.JPG" alt="My S3 image"> 
      

      8) 您现在应该拥有一个对 Am​​azon S3 具有图像写入/读取功能的 Web 应用程序。

      【讨论】:

      • 谢谢!我不是 100% 确定它可以回答所有问题,但它有很大帮助!我认为我缺少您帮助单击的 ghat 的一些内容是: 1. 我不必引用作曲家位置,我使用我的代码中的 Json 文件对其进行配置。 2.如何处理s3端的权限。昨晚我刚刚弄清楚了 URL 访问权限并看到了所需的权限(我认为授予 ec2 访问权限就足够了),但后来我不知道如何将其应用于所有人!再次感谢!
      • 没问题!如果还有其他不清楚的地方,请直接提及,我会尝试添加到我的答案中。
      • 将 KEY/SECRET 放在实际的 PHP 工厂文件中更好吗?或者我应该将它们设置为 Beanstalk 中的环境变量并动态引用它们?我不确定它是否会有所作为,或者一个是否比另一个更安全。我也很想在网络服务器之外保持图像的私密性。
      • 据我所知,两者都应该同样安全。至于你的第二个问题,我建议你访问我附上的链接。您不能让您网站上的图像真正私密,但您可以将身份验证作为 url 的一部分。这样他们就被认为足够私密,以至于随机的人找不到他们:quora.com/…
      • "Principal": { "AWS": [ "*" ] } 的 AWS 部分是否意味着它只是经过身份验证的 AWS 用户?我理解这篇文章的一些内容,但不知道我将如何实现它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2021-02-07
      • 2012-10-29
      • 2013-10-17
      相关资源
      最近更新 更多