{"record":{"id":"36ab5074e25bfa75","repo":"remotion-dev/remotion","slug":"cannot-cancel-render-render-id-the-render-was","errorCode":null,"errorMessage":"Cannot cancel render #{render_id}: The render was not started with enableCancellation: true.","messagePattern":"Cannot cancel render #(.+?): The render was not started with enableCancellation: true\\.","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"packages/lambda-ruby/lib/remotion_lambda/sdk.rb","lineNumber":48,"sourceCode":"      raise \"Failed to call renderMediaOnLambda: #{body['message']}\" if body[\"type\"] == \"error\"\n      body\n    end\n\n    def render_still_on_lambda(function_name, payload)\n      body = invoke(function_name, payload)      \n      raise \"Failed to call renderStillOnLambda: #{body['message']}\" if body[\"type\"] == \"error\"\n      body\n    end\n\n    def cancel_render_on_lambda(bucket_name, render_id)\n      progress_response = s3_client.get_object(\n        bucket: bucket_name,\n        key: \"renders/#{render_id}/progress.json\"\n      )\n      progress = JSON.parse(progress_response.body.read)\n\n      unless progress['cancellationEnabled'] == true\n        raise \"Cannot cancel render #{render_id}: The render was not started with enableCancellation: true.\"\n      end\n\n      s3_client.put_object(\n        bucket: bucket_name,\n        key: \"renders/#{render_id}/cancel.json\",\n        body: JSON.generate(cancelledAt: (Time.now.to_f * 1000).floor),\n        content_type: 'application/json'\n      )\n      nil\n    end\n\n    private\n\n    # Lambda methods\n    def invoke(function_name, payload)\n      response = @lambda_client.invoke({\n        function_name: function_name,\n        payload: JSON.generate(payload)","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/remotion-dev/remotion/blob/10db9de07356446fb0edb3c3ae211369b693d18b/packages/lambda-ruby/lib/remotion_lambda/sdk.rb#L30-L66","documentation":"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).","triggerScenarios":"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.","commonSituations":"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.","solutions":["Build the render payload with cancellation enabled: get_render_media_on_lambda_payload(codec: 'h264', enable_cancellation: true, ...) and start a new render.","The already-running render cannot be canceled - let it finish or discard its output.","Verify renders/{render_id}/progress.json contains cancellationEnabled: true before calling cancel.","If progress.json lacks the field entirely, update the deployed Remotion functions to match the SDK."],"exampleFix":"# before\npayload = get_render_media_on_lambda_payload(\n  codec: \"h264\"\n  # enable_cancellation defaults to false\n)\nresponse = client.render_media_on_lambda(payload)\nclient.cancel_render_on_lambda(response[\"renderId\"], bucket) # raises\n\n# after\npayload = get_render_media_on_lambda_payload(\n  codec: \"h264\",\n  enable_cancellation: true\n)\nresponse = client.render_media_on_lambda(payload)\nclient.cancel_render_on_lambda(response[\"renderId\"], bucket) # works","handlingStrategy":"validation","validationCode":"# Render time - opt in once, in one helper\npayload = get_render_media_on_lambda_payload(\n  codec: \"h264\",\n  enable_cancellation: true # required for cancel_render_on_lambda\n)\nresponse = client.render_media_on_lambda(payload)","typeGuard":null,"tryCatchPattern":"begin\n  client.cancel_render_on_lambda(render_id, bucket_name)\nrescue RuntimeError => e\n  if e.message.include?(\"enableCancellation\")\n    # render was not started cancellable - report clearly, do not retry\n  else\n    raise\n  end\nend","preventionTips":["Build all render payloads through one helper that sets enable_cancellation: true whenever cancellation may be needed.","Decide cancellability before starting the render - the flag cannot be added mid-flight.","Verify progress.json contains cancellationEnabled: true when adding cancellation to an existing integration."],"tags":["lambda","cancellation","ruby","opt-in","progress-json"],"backgroundTag":"opt-in-flag-required","analyzedSha":"10db9de07356446fb0edb3c3ae211369b693d18b","analyzedAt":"2026-08-22T21:45:17.748Z","contentChangedAt":"2026-08-22T21:45:17.748Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}