【问题标题】:localstack s3 can't accessable from phplocalstack s3 无法从 php 访问
【发布时间】:2021-01-04 15:47:51
【问题描述】:

我正在尝试在我的 docker 容器中使用 localstack。我为 s3 创建了演示桶。我可以查看从终端上传的文件,但我无法从代码访问 s3。我在哪里犯错?我在下面分享我的代码。谢谢。我的 yml 文件如下所示:

version: "3.7" 

services:

php:
  image: php:7.4-fpm
  volumes:
    - ~/image.minyay.com/src:/var/www/html
    - ~/image.minyay.com/docker/php.ini:/usr/local/etc/php/php.ini
web:
  image: nginx:1.17
  ports:
   - 80:80
  volumes:
    - ~/image.minyay.com/src:/var/www/html
    - ~/image.minyay.com/docker/site.conf:/etc/nginx/conf.d/site.conf
  depends_on:
    - php

localstack:
      image: localstack/localstack:0.11.0
      container_name: localstack
      ports:
        - "4563-4599:4563-4599"
        - '8055:8080'
      environment:
        - SERVICES=s3
        - DOCKER_HOST=unix:///var/run/docker.sock
        - DATA_DIR=/tmp/localstack/data
      volumes:
        - /tmp/localstack:/tmp/localstack
        - /var/run/docker.sock:/var/run/docker.sock
        - ./aws:/docker-entrypoint-initaws.d

我的 php 代码如下所示:

  public function get_big_folder_in_s3($file_path){

        try {
            
           $pages = $this->s3->getPaginator('ListObjects', [
                'Bucket' => $this->bucket,
                'Prefix' => $file_path, //DESTINATION
            ]);

            foreach ($pages as $page) {
                foreach ($page['Contents'] as $object) {
                  //  echo $object['Key'] . PHP_EOL;
                    $result[] = $object['Key'];
                }
            }

            return $result;
            
        } catch (S3Exception $e) {

            return false;
            
        }
    }

我的 s3 客户端创建:

        $this->s3 = S3Client::factory([
            'credentials' => false,
            'version' => 'latest',
            'region'  => 'eu-central-1',
            'endpoint' => 'http://localhost:4572',
            'force_path_style'  => true,
        ]);

【问题讨论】:

  • 你能分享你的 s3 客户端创建吗?

标签: php docker amazon-s3 docker-compose localstack


【解决方案1】:

你没有分享你的客户端初始化,但是 localstack 通常需要传递一个端点,因此我猜在 PHP 中我猜它应该看起来类似于:

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region'  => 'us-west-2',
    'endpoint' => 'http://localstack:4566',
]);

【讨论】:

  • 非常感谢您的警告。我想我不能正确地问这个问题,因为我是这个平台的新手。在您发出警告后,我更新了我的问题。
  • @Erenözdemir 再次,如果您的 PHP 代码在 php 容器中运行,endpoint 的主机名应该是 localstack 而不是 localhost
  • 但是我像这样创建了我的存储桶:aws --endpoint-url=localhost:4572 s3 mb s3://demo-bucket 如果我尝试使用 aws --endpoint-url=localstack:4572 s3 mb s3://demo-bucket 这给出一个错误:无法连接到端点 URL:“localstack:4572
  • 您是否从 localhost 创建了存储桶? (您是从本地主机还是在某个容器中运行它?)。假设您是从本地计算机创建的,那很好。在本地机器上运行时使用localhost。当您在容器中运行时 - 使用 localstack - 两者都使用相同的组件,只是名称不同
  • 再次您好,非常感谢您的关注,我按照您说的做了,但还是没有得到任何结果。我创建了一个 github 存储库以便更准确地与您交流。如果您能查看我的代码并告诉我哪里出错了,我将不胜感激。我在终端中遵循的步骤如下。 1-Docker-compose up 2- aws --endpoint-url = http://localhost: 4572 s3 mb s3: // demo-bucket 3-aws --endpoint-url = http://localhost: 4572 s3 cp ~ /example.jpg s3: // demo-bucket 我的项目链接:https://github.com/erenozdmr/localstacktry 再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2022-12-08
  • 2023-02-07
  • 1970-01-01
  • 2020-12-26
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多