如何从aws s3存储桶访问文件?

时间:2017-07-23 07:13:25

标签: php laravel-5 amazon-s3 amazon-ec2

如何在将图像上传到s3存储桶后从aws s3存储桶访问文件。当我得到图像时,显示访问被拒绝错误。

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>xxxxx</RequestId>
<HostId>xxxxx</HostId>
</Error>

Controller Code is

$sharedConfig = [
                 'region' => Config::get('filesystems.disks.s3.region'),
                 'version' => 'latest',
                 "Effect" => "Allow",
                 'credentials' => [
                   'key' => 'xxxx',
                   'secret' => 'xxxx'
                  ]
                ];
               $sdk = new \Aws\Sdk($sharedConfig);
               $s3 = $sdk->createS3();
               $res = $s3->putObject([
               'Key' => $fileName, // This will overwrite any other files with same name
               'SourceFile' => $filePath,
               'Bucket' => 'bolttupload'
              ]);
              Storage::copy($res['ObjectURL'],$destinationPath.$fileName);
              echo $res['ObjectURL'];die;

1 个答案:

答案 0 :(得分:2)

默认情况下,Amazon S3中的对象是私有的。您可以通过多种方式授予对象访问权限:

    单个对象上的
  • 访问控制列表(&#34;公开此对象&#34;)
  • 存储桶中的
  • 存储桶策略(&#34;将此存储桶或目录设为公开状态&#34;)
  • 通过授予IAM用户的权限(&#34;此用户可以访问此存储桶或目录)
  • 通过预先签名的网址(&#34;此链接将在接下来的5分钟内正常运行&#34;)

您用于访问对象的URL不会将您识别为授权用户。你没有Bucket政策。你的对象不公开。因此,您正确接收拒绝访问的消息

要使其可访问,您必须根据上面的列表确定访问范围。如果您希望对象完全公开,请在上传时在对象上设置该选项:

$result = $client->putObject([
    'ACL' => 'private|public-read|public-read-write|authenticated-read|aws-exec-read|bucket-owner-read|bucket-owner-full-control',
...

如果您想要整个存储桶或目录公开,请使用Bucket Policy

如果您只想某些用户来访问它,请针对IAM用户或IAM组添加策略,然后使用标识用户的凭据访问该对象。

如果您希望应用在运行时确定谁应该访问该对象,请使用pre-signed URL

相关问题