remotion-dev/remotion · error · RuntimeError

Cannot cancel render #{render_id}: The render was not starte

Error message

Cannot cancel render #{render_id}: The render was not started with enableCancellation: true.

What it means

The Ruby SDK's cancel_render_on_lambda reads renders/{render_id}/progress.json and raises a plain RuntimeError unless progress['cancellationEnabled'] == true. Remotion Lambda cancellation is opt-in: the render must have been started with enable_cancellation: true in the render media payload (packages/lambda-ruby/lib/remotion_lambda/render_media_on_lambda_payload.rb defaults enable_cancellation: false).

Source

Thrown at packages/lambda-ruby/lib/remotion_lambda/sdk.rb:48

      raise "Failed to call renderMediaOnLambda: #{body['message']}" if body["type"] == "error"
      body
    end

    def render_still_on_lambda(function_name, payload)
      body = invoke(function_name, payload)      
      raise "Failed to call renderStillOnLambda: #{body['message']}" if body["type"] == "error"
      body
    end

    def cancel_render_on_lambda(bucket_name, render_id)
      progress_response = s3_client.get_object(
        bucket: bucket_name,
        key: "renders/#{render_id}/progress.json"
      )
      progress = JSON.parse(progress_response.body.read)

      unless progress['cancellationEnabled'] == true
        raise "Cannot cancel render #{render_id}: The render was not started with enableCancellation: true."
      end

      s3_client.put_object(
        bucket: bucket_name,
        key: "renders/#{render_id}/cancel.json",
        body: JSON.generate(cancelledAt: (Time.now.to_f * 1000).floor),
        content_type: 'application/json'
      )
      nil
    end

    private

    # Lambda methods
    def invoke(function_name, payload)
      response = @lambda_client.invoke({
        function_name: function_name,
        payload: JSON.generate(payload)

View on GitHub (pinned to 10db9de073)

Solutions

  1. Build the render payload with cancellation enabled: get_render_media_on_lambda_payload(codec: 'h264', enable_cancellation: true, ...) and start a new render.
  2. The already-running render cannot be canceled - let it finish or discard its output.
  3. Verify renders/{render_id}/progress.json contains cancellationEnabled: true before calling cancel.
  4. If progress.json lacks the field entirely, update the deployed Remotion functions to match the SDK.

Example fix

# before
payload = get_render_media_on_lambda_payload(
  codec: "h264"
  # enable_cancellation defaults to false
)
response = client.render_media_on_lambda(payload)
client.cancel_render_on_lambda(response["renderId"], bucket) # raises

# after
payload = get_render_media_on_lambda_payload(
  codec: "h264",
  enable_cancellation: true
)
response = client.render_media_on_lambda(payload)
client.cancel_render_on_lambda(response["renderId"], bucket) # works
Defensive patterns

Strategy: validation

Validate before calling

# Render time - opt in once, in one helper
payload = get_render_media_on_lambda_payload(
  codec: "h264",
  enable_cancellation: true # required for cancel_render_on_lambda
)
response = client.render_media_on_lambda(payload)

Try / catch

begin
  client.cancel_render_on_lambda(render_id, bucket_name)
rescue RuntimeError => e
  if e.message.include?("enableCancellation")
    # render was not started cancellable - report clearly, do not retry
  else
    raise
  end
end

Prevention

When it happens

Trigger: Calling cancel_render_on_lambda for a render started with get_render_media_on_lambda_payload(...) that did not pass enable_cancellation: true, so progress.json records cancellationEnabled as false.

Common situations: Canceling ad hoc after a render started; payloads built by shared helper code that omits the keyword; deployed Remotion Lambda functions older than the Ruby SDK so the field never lands in progress.json.

Related errors


AI-assisted analysis of remotion-dev/remotion@10db9de073 (2026-08-22). Data as JSON: /api/errors/36ab5074e25bfa75. Report an issue: GitHub.