2017-09-28 179 views
0

我在eu-west-1區域的AWS中有一個名爲latheesan-public-bucket(例如)的公共S3存儲桶。如何訪問laravel中的公有AWS S3存儲桶

如果我要請訪問以下網址在瀏覽器(例如):

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

我得到以下XML顯示我有水桶一個文件:

<?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> 

如果我然後訪問https://latheesan-public-bucket.s3-eu-west-1.amazonaws.com/test.json我可以從我的公共存儲區下載我的文件。

爲了在我的Laravel應用程序中實現相同的功能;

league/flysystem-aws-s3-v3

然後在我的.env我已經添加了以下幾行:

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

最後,我再試圖用laravel文件系統訪問公共S3存儲我第一次通過作曲家加入這個包像這樣的文件:

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

當我這樣做;我得到了以下錯誤:

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))

所以,我更新了我的.env一些假憑證:

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

現在我得到這個錯誤:

Illuminate \ Contracts \ Filesystem \ FileNotFoundException 
test.json 

所以我的問題是;首先,我在這裏做錯了什麼?如果沒有真正提供有效的S3密鑰/祕密,是否沒有辦法訪問laravel中的公共s3存儲桶?如果我不知道他們怎麼辦?我只有公共s3存儲區的網址。

P.S. latheesan-public-bucket不存在(這是一個虛擬桶名稱來解釋我的問題,我確實有一個真正的公共存儲桶,我正在嘗試使用,它在瀏覽器中工作正常,如上所述)。

回答

2

當您嘗試通過HTTPS URL來訪問它,它的作品,因爲它是公開的,你

當您嘗試通過SDK來訪問它,它試圖使用API​​來訪問它。

所以要麼給你的實例配置文件訪問存儲桶的正確權限(不再需要公開),要麼只是使用http客戶端來檢索文件。

+0

我正在閱讀其他人遇到的類似問題,並認爲這可能是問題。我想我會寫一個助手外觀來使用'file_get_contents()'列出/檢索公共文件。 – Latheesan

0

如果您使用S3 API訪問您的存儲桶,則需要AWS憑據。原因是API需要簽署S3請求。