簡體   English   中英

無法使用 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 應用程序中將新對象放入存儲桶中。 但無法從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM