无法使用 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'
如果我在 browser 或 postman 或 [=59= 中使用 url 和 运行 ] docker终端curl它returns我的文件列表。当我在 php.
中通过 s3Client 调用它时,它只是 returns 空数组
我感觉权限有问题。但是由于我对 aws-s3 服务没有那么多的知识和经验,所以我无法弄清楚。一些 "default" 权限允许客户端放置对象但限制读取索引似乎令人困惑。我可以使用浏览器或 curl 读取对象索引,但不能通过应用程序读取。
有什么想法吗?
我遇到了同样的问题。
但是,我将 docker-compose 更改如下,这样我就可以避免这个问题了。
image: localstack/localstack:0.11.0
我觉得可能是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: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'
如果我在 browser 或 postman 或 [=59= 中使用 url 和 运行 ] docker终端curl它returns我的文件列表。当我在 php.
中通过 s3Client 调用它时,它只是 returns 空数组我感觉权限有问题。但是由于我对 aws-s3 服务没有那么多的知识和经验,所以我无法弄清楚。一些 "default" 权限允许客户端放置对象但限制读取索引似乎令人困惑。我可以使用浏览器或 curl 读取对象索引,但不能通过应用程序读取。
有什么想法吗?
我遇到了同样的问题。
但是,我将 docker-compose 更改如下,这样我就可以避免这个问题了。
image: localstack/localstack:0.11.0
我觉得可能是localstack的退化问题