```
        $args = [
            'version' => '2006-03-01',
            'region' => 'eu-west-1',
            'credentials' => CredentialsProvider::get(),
            'http' => ['decode_content' => false],
            'retries' => 6,
            'endpoint' => 'http://localstack:4572',
            'bucket_endpoint' => true
        ];

        $this->client = new S3Client($args);
        $result = $this->client->createBucket([
            'Bucket' => "localbucket",
        ]);
        $buckets = $this->client->listBuckets();
```

$result shows the `@metadata` statusCode as 200 however the returned Location which should tell me where the created bucket is, is an empty string. So it isn't creating the bucket, but I'm getting a 200 response. Just to be sure I run `listBuckets()` and it confirms nothing is being created.

docker-compose.yml settings for localstack:

```
    localstack:
        container_name: localstack
        image: localstack/localstack
        ports:
          - "4567-4593:4567-4593"
          - "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}"
        environment:
          - HOSTNAME=pi.docker
          - SERVICES=s3,dynamodb
          - DEFAULT_REGION=eu-west-1
#            - DEBUG=${DEBUG- }
          - DATA_DIR=/tmp/localstack/data
          - PORT_WEB_UI=8080
#            - LAMBDA_EXECUTOR=local
          - DYNAMODB_ERROR_PROBABILITY=0.0
          - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
          - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
          - "/var/run/docker.sock:/var/run/docker.sock"
```

Bonus issue: as far as I can tell persistence for s3 doesn't work, I've set DATA_DIR, I've tried changing the volume to `"localstack:/tmp/localstack"` and setting a persisting volume for that. And the directory does persist, however the s3 data isn't stored here so it's reset when taking down the container.
""" check whether any of the event types in `events` matches the
        given `action` and `api_method`, and return the first match. """
    events = events or []
    for event in events:
        regex = event.replace('*', '[^:]*')
        action_string = 's3:%s:%s' % (action, api_method)
        match = re.match(regex, action_string)
        if match:
            return match
    return False
def filter_rules_match(filters, object_path):
    """ check whether the given object path matches all of the given filters """
    filters = filters or {}
    s3_filter = _get_s3_filter(filters)
    for rule in s3_filter.get('FilterRule', []):
        if rule['Name'] == 'prefix':
            if not prefix_with_slash(object_path).startswith(prefix_with_slash(rule['Value'])):
                return False
        elif rule['Name'] == 'suffix':
            if not object_path.endswith(rule['Value']):
                return False
        else:
            LOGGER.warning('Unknown filter name: "%s"' % rule['Name'])
    return True
def _get_s3_filter(filters):