Can';t使用php aws S3Client从Localstack s3 bucket获取列表对象
docker compose中的aws s3 localstack声明为: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:
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.*版本已经解决了这个问题