[英]Can't get list Objects from Localstack s3 bucket using php aws S3Client
我在 docker-compose 中有 aws s3 localstack 聲明為:
version: "3"
services:
...
localstack:
image: localstack/localstack
environment:
- SERVICES=s3
- USE_SSL=false
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
ports:
- "4572:4572"
- "4566:4566"
- "8083:8080"
networks:
- mynetwork
構建后一切正常。 我能夠連接到圖像:
docker exec -ti my-project_localstack_1 /bin/bash
並使用命令行創建一個新存儲桶:
awslocal s3 mb s3://my-bucket
最初,我能夠從我的 php 應用程序中將新對象放入存儲桶中。 但無法從 php/postman/browser 查看/查看它們的列表。
我做了一些研究並找到了這個解決方案。
awslocal s3 mb s3://my-bucket
awslocal s3api put-bucket-acl --bucket my-bucket --acl public-read
現在,我可以在 Chrome 瀏覽器中以匿名模式(無憑據或令牌)並使用 Postman 獲取對象列表。
但我沒有得到$s3Client->listObjects(...)
。 它總是返回空結果。
注意:我仍然可以執行$s3Client->putObject(...)
。 我檢查了另一個命令$s3client->getBucketAcl(...)
和$s3Client->getObjectUrl(...)
。 他們工作正常。 我想說的是,從 php 連接到 localstack 主機很好,並且實例工作正常並且響應正常。
這是我用來實例化$s3Client
的 php 端的代碼:
class S3
{
/** @var \Aws\S3\S3Client */
private static $client = null;
private static function init() // Lazy S3client initiation
{
if (is_null (self::$client)) {
self::$client = new Aws\S3\S3Client ([
'region' => 'us-east-1',
'version' => '2006-03-01',
'credentials' => false,
'endpoint' => "http://localstack:4572",
'use_path_style_endpoint' => true,
'debug' => true
]);
}
}
...
public static function list_objects($bucket, array $options)
{
self::init();
return self::$client->listObjects([
'Bucket' => "my-bucket",
'Prefix' => "year/month/folder/",
'Delimiter' => $options['delimiter'] ? $options['delimiter'] : '/',
]);
}
...
}
此方法返回@metadata->effectiveUri
:
array (size=2)
'instance' => string '0000000040d78e4d00000000084dbdb3' (length=32)
'data' =>
array (size=1)
'@metadata' =>
array (size=4)
'statusCode' => int 200
'effectiveUri' => string 'http://localstack:4572/my-bucket?prefix=year%2Fmonth%2Ffolder%2F&delimiter=%2F&encoding-type=url'
If I take this url and run it in browser or postman or php docker terminal curl it returns list of my files. 當我通過 php 中的 s3Client 調用它時,它只返回空數組。
我感覺權限有問題。 但是由於我對 aws-s3 服務沒有太多的知識和經驗,所以我無法弄清楚。 一些“默認”權限允許客戶端放置對象但限制讀取索引似乎令人困惑。 我可以使用瀏覽器或 curl 讀取對象的索引,但不能通過應用程序讀取。
有任何想法嗎?
我遇到了同樣的問題。
但是,我將 docker-compose 更改如下,則可以避免該問題。
image: localstack/localstack:0.11.0
我認為這可能是 localstack 的退化問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.