无法使用 php aws S3Client 从 Localstack s3 存储桶中获取列表对象

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 应用程序将新对象放入存储桶中。 但是无法 see/view 从 php/postman/browser.

中列出它们

我做了一些研究并找到了 this 解决方案。

awslocal s3 mb s3://my-bucket

awslocal s3api put-bucket-acl --bucket my-bucket --acl public-read

现在,我可以在 Chrome 浏览器中使用 Postman 以匿名模式(无凭据或令牌)通过前缀获取对象列表。

但是我没有得到$s3Client->listObjects(...)。它总是 returns 空结果。

注意:我仍然可以执行 $s3Client->putObject(...)。 我检查了另一个命令 $s3client->getBucketAcl(...)$s3Client->getObjectUrl(...)。他们工作正常。 我想说的是,从 php 到 localstack 主机的连接很好,实例正在运行并且响应良好。

这是 php 端的代码,我用来实例化 $s3Client:

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'] : '/',
        ]);
    }
    ...
}

这个方法returns @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'

如果我在 browserpostman 或 [=59= 中使用 url 和 运行 ] docker终端curl它returns我的文件列表。当我在 php.

中通过 s3Client 调用它时,它只是 returns 空数组

我感觉权限有问题。但是由于我对 aws-s3 服务没有那么多的知识和经验,所以我无法弄清楚。一些 "default" 权限允许客户端放置对象但限制读取索引似乎令人困惑。我可以使用浏览器或 curl 读取对象索引,但不能通过应用程序读取。

有什么想法吗?

我遇到了同样的问题。
但是,我将 docker-compose 更改如下,这样我就可以避免这个问题了。

image: localstack/localstack:0.11.0

我觉得可能是localstack的退化问题