Medusajs S3 file assets with Cloudfront support and terraform for Infra support
Store uploaded files to your Medusa backend on S3 and use Domain Name or Cloudfront
Plugin Documentation | Medusa Website | Medusa Repository
- Store product images on S3
- Support for importing and exporting data through CSV files, such as Products or Prices.
- Support for Bucket Policies and User Permissions.
- Infra repo can be used to apply terraform to create the asset s3 bucket
- It requires domain to be already present in Route 53 and ACM has a certificate for that domain
- Also needs a user to be already present in IAM who is going to access from medusa backend server after it is deployed. So create some user like
medusa-backend
and add the user arn- Make sure the user has Access Key and Secret key downloaded so you can use them when configuring Medusa
- Change variables inside
development.tfvars
orproduction.tfvars
and run-
Make sure to fill in state variables if you are using another S3 bucket to store Terraform state
-
Don't confuse the below access key and secret key, they should have devops admin privileges so infra can be provisioned ``` cd infra
terraform init --backend-config="bucket=${state_bucket}" \ --backend-config="key=${state_file}" --backend-config="access_key=${access_key}" --backend-config="secret_key=${secret_key}" -backend-config="region=${region}" -reconfigure terraform plan -var state_bucket="${state_bucket}" \ -var state_file=${state_file} -var-file=vars/${environment}.tfvars \ -var access_key=${access_key} -var secret_key=${secret_key} terraform apply -var state_bucket="${state_bucket}" \ -var state_file=${state_file} -var-file=vars/${environment}.tfvars \ -var access_key=${access_key} -var secret_key=${secret_key} ```
-
- This will create a bucket called
assets
and serve the contents using cloudfront, pointed to by your domain name
1. Run the following command in the directory of the Medusa backend:
npm install medusa-cloudfront-s3
2. Set the following environment variables in .env
:
S3_URL=<YOUR_BUCKET_URL>
S3_BUCKET=<YOUR_BUCKET_NAME>
S3_REGION=<YOUR_BUCKET_REGION>
S3_ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
S3_SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>
S3_PREFIX=<YOUR_BUCKET_PREFIX> (optional)
S3_CLOUDFRONT_DISTRIBUTION_ID=<YOUR_CLOUDFRONT_DISTRIBUTION_ID> (optional)
S3_DOMAIN_URL=<YOUR_ASSETS_DOMAIN_URL> (optional) // if domain url is present, cloudfront distribution and s3 url is ignored
3. In medusa-config.js
add the following at the end of the plugins
array:
const plugins = [
// ...
{
resolve: `medusa-cloudfront-s3`,
options: {
s3_url: process.env.S3_URL,
bucket: process.env.S3_BUCKET,
prefix: process.env.S3_PREFIX, // optional
region: process.env.S3_REGION,
access_key_id: process.env.S3_ACCESS_KEY_ID,
secret_access_key: process.env.S3_SECRET_ACCESS_KEY,
cloudfront_distribution_id: process.env.S3_CLOUDFRONT_DISTRIBUTION_ID,
domain_url: process.env.S3_DOMAIN_URL,
aws_config_object: {},
},
},
]
1. Run the following command in the directory of the Medusa backend to run the backend:
npm run start
2. Upload an image for a product using the admin dashboard or using the Admin APIs.