How to Configure Remote Storage for Magento 2.x

Magento 2.x supports remote storage for media files, import/export files, and other files. This feature allows you to store files in a remote storage location, such as an Amazon S3 bucket, instead of storing them on the server itself.

This can be useful for many reasons, such as:

  • Offloading storage from your server, reducing the load on your server, and improving performance.

  • Allows you to make use of horizontal scaling, as you can easily add more servers without having to worry about syncing files between them.

  • Allows for effortless storage capacity scaling, as you can easily increase the storage capacity of your remote storage location.

  • Serving assets from a CDN, which can improve the performance of your website.

Configuring the application

Configuring Magento 2 to start storing files in your bucket is done using a single command.

AWS S3

bin/magento setup:config:set \
    --remote-storage-driver="aws-s3" \
    --remote-storage-bucket="my_bucket_name" \
    --remote-storage-region="my-aws-region" \
    --remote-storage-key="abcd1234" \
    --remote-storage-secret="abcd1234"

Other S3 compatible providers

If you’re using a different provider than AWS S3, you need to specify the --remote-storage-endpoint option.

bin/magento setup:config:set \
    --remote-storage-driver="aws-s3" \
    --remote-storage-bucket="my_bucket_name" \
    --remote-storage-region="provider-region" \
    --remote-storage-key="abcd1234" \
    --remote-storage-secret="abcd1234" \
    --remote-storage-endpoint="https://my-s3-compatible.endpoint.com"

Syncing the files

Instead of running (which is Magento’s official way to do this):

bin/magento remote-storage:sync

One can run the following instead to really speed up the process:

aws s3 sync pub/media/ s3://my_bucket_name/media/
aws s3 sync var/import_export s3://my_bucket_name/import_export

This is much faster than Magento’s built-in sync, because aws s3 sync uploads files concurrently.

The storage flag file in the bucket

Magento’s S3 implementation creates a test file called storage.flag, which is basically created to test if the connection works. So this is not a magic file to mark anything (source).

Serving assets from your S3 bucket

To start serving media assets from your S3 bucket, you need to make some adjustments to your nginx configuration.

location /media {
    # ...
    location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
        resolver 8.8.8.8;
        set $bucket "<my_bucket_name>";
        proxy_pass https://s3.amazonaws.com/$bucket$uri;
        proxy_pass_request_body off;
        proxy_pass_request_headers off;
        proxy_intercept_errors on;
        proxy_hide_header "x-amz-id-2";
        proxy_hide_header "x-amz-request-id";
        proxy_hide_header "x-amz-storage-class";
        proxy_hide_header "Set-Cookie";
        proxy_ignore_headers "Set-Cookie";
    }
    # ...
}

Also make sure your S3 bucket policies are configured correctly, so that only /media is publicly readable. For example:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicReadOnlyForMedia",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<your-bucket-name>/media/*"
    }
  ]
}

Magento remote storage documentation