dongwen5870 2017-09-28 23:25
浏览 92
已采纳

如何在laravel中访问公共AWS S3存储桶

I have a public S3 bucket called latheesan-public-bucket (for example) in AWS in the eu-west-1 region.

If I were to visit the following url in the browser (for example):

https://latheesan-public-bucket.s3-eu-west-1.amazonaws.com/

I get the following XML showing that I have one file in the bucket:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Name>latheesan-public-bucket</Name>
    <Prefix />
    <Marker />
    <MaxKeys>1000</MaxKeys>
    <IsTruncated>false</IsTruncated>
    <Contents>
        <Key>test.json</Key>
        <LastModified>2017-07-11T16:39:50.000Z</LastModified>
        <ETag>"056f32ee5cf49404607e368bd8d3f2af"</ETag>
        <Size>17658</Size>
        <StorageClass>STANDARD</StorageClass>
    </Contents>
</ListBucketResult>

If I were to then visit https://latheesan-public-bucket.s3-eu-west-1.amazonaws.com/test.json I can download my file from my public bucket.

In order to achieve the same in my Laravel application; I first added this package via composer:

league/flysystem-aws-s3-v3

Then on my .env I've added the following lines:

AWS_REGION=eu-west-1
AWS_BUCKET=latheesan-public-bucket

Lastly, I then tried to use the laravel filesystem to access the public s3 bucket file like this:

$json = Storage::disk('s3')->get('test.json');

When I did this; I got the following error:

Error retrieving credentials from the instance profile metadata server. (cURL error 28: Connection timed out after 1000 milliseconds (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))

So, I updated my .env with some fake credentials:

AWS_KEY=123
AWS_SECRET=123
AWS_REGION=eu-west-1
AWS_BUCKET=latheesan-public-bucket

Now I get this error:

Illuminate \ Contracts \ Filesystem \ FileNotFoundException
test.json

So my question is; firstly what am I doing wrong here? Is there no way to access a public s3 bucket in laravel without actually providing a valid S3 Key/secret? what if I don't know them? I only have the url to the public s3 bucket.

P.S. the latheesan-public-bucket does not exist (it was a dummy bucket name to explain my problem, I do have a real public bucket I am trying to work with and it works fine in browser as explained above).

  • 写回答

2条回答 默认 最新

  • douxing1353 2017-09-29 01:34
    关注

    When you try to access it via the HTTPS URL, it works because it is public, and you're

    When you try to access it via the SDK, it is trying to use the API to access it.

    So either give your instance profile the correct permissions to access the bucket (which would no longer need to be public) or simply use an http client to retrieve the file.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 管道轴向耦合水击问题
  • ¥60 补全networkx TODO部分。
  • ¥15 有内推吗,云计算linux运维方向
  • ¥30 sort cuteSV.vcf by bcftools用IGV可视化出现报错
  • ¥100 SOS!对STK中导出的天体图像进行质心提取有没有人做过啊
  • ¥15 python 欧式距离
  • ¥15 运行qteasy报错
  • ¥15 遗传算法解决有工序顺序约束的大规模FJSP问题
  • ¥15 企业消防水炮塔设计方案
  • ¥20 WORKBENCH网格划分