Skip to main content

Customizing Lambda output destination

By default a render artifact is saved into the same S3 bucket as where the site is located under the key renders/${renderId}/out.{extension} (for example: renders/hy0k2siao8/out.mp4)

You can modify the output destination by passing a different filename, writing it into a different bucket or even upload it to a different S3-compatible provider.

Customizing the output name​

To customize the output filename, pass outName: "my-filename.mp4" to renderMediaOnLambda() or renderStillOnLambda().

On the CLI, use the --out-name flag.

The output name must match /^([0-9a-zA-Z-!_.*'()/]+)$/g.

Customizing the output bucket​

To render into a different bucket, specify the outName option to renderMediaOnLambda() or renderStillOnLambda() and pass an object with the key and bucketName values:


const {bucketName, renderId} = await renderMediaOnLambda({
  region: 'us-east-1',
  functionName: 'remotion-render-bds9aab',
  composition: 'MyVideo',
  serveUrl: 'https://remotionlambda-qg35eyp1s1.s3.eu-central-1.amazonaws.com/sites/bf2jrbfkw',
  inputProps: {},
  codec: 'h264',
  imageFormat: 'jpeg',
  maxRetries: 1,
  privacy: 'no-acl',
  outName: {
    key: 'my-output',
    bucketName: 'output-bucket',
  },
});

If you like to use this feature:

  • You must extend the default Remotion role policy (not user policy) to allow s3:PutObject on the destination bucket's objects. See the policy example.
  • If you set privacy to "public" or "private", also grant s3:PutObjectAcl on the destination bucket's objects.
  • The bucket must be in the same region.
  • When calling APIs such as downloadMedia() or getRenderProgress(), you must pass the bucketName where the site resides in, not the bucket where the video gets saved.
  • The key must match /^([0-9a-zA-Z-!_.*'()/]+)$/g
  • The bucketName must match /^(?=^.{3,63}$)(?!^(\d+\.)+\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$)/.

This feature is not supported from the CLI.

Write-only AWS S3 bucketsv4.0.535​

For renderMediaOnLambda(), s3:PutObject is sufficient on the destination bucket when using privacy: "no-acl" and the Lambda execution role's credentials (without s3OutputProvider). With overwrite: false, the final upload prevents replacing an existing object even if Remotion cannot read the destination. A conflict is then reported after rendering, when the upload is attempted.

Optionally grant s3:GetObject on arn:aws:s3:::{bucketname}/* and s3:ListBucket on arn:aws:s3:::{bucketname}. These permissions allow Remotion to detect existing output before rendering and recover completion by checking the output if the final progress update is missing. For compatibility with earlier Remotion versions, grant both permissions.

When using s3OutputProvider with overwrite: false, read access is required because conditional uploads are not supported for these destinations.

Saving to another cloudv3.2.23​

You can upload the file to another S3-compatible provider.

  • List of working providers (non-exhaustive):

    • ✅ Supabase

    • ✅ Cloudflare

    • ✅ DigitalOcean Spaces

    • ✅ Google Cloud Storage
      Notes about Google Cloud Storage:

      • GCP does support allowing underscores for bucket names, but we validate against it. Do not use underscores in your bucket name.
      • The bucket needs to have uniform access control and NOT fine-grained access.
      • To get your accessKeyId and secretAccessKey, create a service account that has Cloud Storage read + write permissions. Then run the following command:
      gcloud storage hmac create insert_google_service_account_email --project=insert_project_id
  • List of unsupported providers (non-exhaustive):

    • Azure Blob Storage (not S3 compatible)

You must pass an outName as specified above and also provide an s3OutputProvider like in the example below.


const {bucketName, renderId} = await renderMediaOnLambda({
  region: 'us-east-1',
  functionName: 'remotion-render-bds9aab',
  composition: 'MyVideo',
  serveUrl: 'https://remotionlambda-qg35eyp1s1.s3.eu-central-1.amazonaws.com/sites/bf2jrbfkw',
  inputProps: {},
  codec: 'h264',
  imageFormat: 'jpeg',
  maxRetries: 1,
  privacy: 'no-acl',
  outName: {
    key: 'my-output',
    bucketName: 'output-bucket',
    s3OutputProvider: {
      endpoint: 'https://fra1.digitaloceanspaces.com',
      accessKeyId: '<DIGITAL_OCEAN_ACCESS_KEY_ID>',
      secretAccessKey: '<DIGITAL_OCEAN_SECRET_ACCESS_KEY>',
    },
  },
});

In this example, the output file will be uploaded to DigitalOcean Spaces. The cloud provider will give you the endpoint and credentials.

If you want to use this feature, note the following:

This feature is not supported from the CLI.

Saving to another AWS regionv4.0.112​

If you plan on saving to another bucket on AWS S3 and would like to use different credentials, you can specify the region in the s3OutputProvider object.

{
  "s3OutputProvider": {
    "endpoint": "https://s3.us-west-1.amazonaws.com",
    "accessKeyId": "<AWS_ACCESS_KEY_ID>",
    "secretAccessKey": "<AWS_SECRET_ACCESS_KEY>",
    "region": "us-west-1"
  }
}

Note that it is not necessary to provide a custom s3OutputProvider if you want to use the same role as you already gave to the Lambda.
You may need to extend your role policy to allow writing to this bucket.

See also​