Category

Other

Version

1.0.1

Last updated

Sep 17, 2024, 08:07:41 AM6 months ago

medusajs-s3-cloudfront-with-terraform

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

Features

  • 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

  • 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 Copy to clipboardmedusa-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 Copy to clipboarddevelopment.tfvars or Copy to clipboardproduction.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 Copy to clipboardassets and serve the contents using cloudfront, pointed to by your domain name

Prerequisites


How to Install

1. Run the following command in the directory of the Medusa backend:
npm install medusa-cloudfront-s3
2. Set the following environment variables in Copy to clipboard.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 Copy to clipboardmedusa-config.js add the following at the end of the Copy to clipboardplugins 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: {},
},
},
]

Test the Plugin

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.

Additional Resources

Build your own plugins

Develop your own plugins with our API to speed up your processes.

Make your plugin available via npm for it to be shared in our Plugin Library with the broader Medusa community.