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/*"
}
]
}