Can';t使用php aws S3Client从Localstack s3 bucket获取列表对象

Can';t使用php aws S3Client从Localstack s3 bucket获取列表对象,php,amazon-s3,aws-php-sdk,localstack,Php,Amazon S3,Aws Php Sdk,Localstack,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:

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应用程序将新对象放入bucket中。 但无法从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'
如果我获取此url并在浏览器邮递员或php docker terminalcurl中运行,它将返回我的文件列表。当我通过php中的s3Client调用它时,它只返回空数组

我觉得权限有问题。但由于我对aws-s3服务没有太多的知识和经验,我无法理解这一点。有些“默认”权限允许客户端放置对象,但限制读取索引,这似乎令人困惑。我可以使用浏览器或curl读取对象的索引,但不能通过应用程序读取


有什么想法吗?

我遇到了同样的问题。
然而,我改变了docker的组成如下,这样我就可以避免这个问题

image:localstack/localstack:0.11.0


我认为这可能是localstack的降级问题。

我遇到了同样的问题。
然而,我改变了docker的组成如下,这样我就可以避免这个问题

image:localstack/localstack:0.11.0


我认为这可能是localstack的降级问题。

非常感谢!它起作用了。但我仍然不明白为什么它适用于curl和browser,而不适用于php客户端。多亏了create问题。你是localstack团队的吗?不,我是一名自由职业的it工程师。我在0.11.5和0.11.6上也有同样的行为,看起来好像0.12.*版本已经解决了这个问题。非常感谢!它起作用了。但我仍然不明白为什么它适用于curl和browser,而不适用于php客户端。多亏了create问题。你是localstack团队的吗?不,我是一名自由职业的it工程师。我在0.11.5和0.11.6上也有同样的行为,看起来0.12.*版本已经解决了这个问题