{"record":{"id":"294ac636b0981ede","repo":"remotion-dev/remotion","slug":"invalid-s3-client-parameters-for-put-object-e","errorCode":null,"errorMessage":"Invalid S3 client parameters for put_object: {e}","messagePattern":"Invalid S3 client parameters for put_object: (.+?)","errorType":"exception","errorClass":"RemotionInvalidArgumentException","httpStatus":null,"severity":"error","filePath":"packages/lambda-python/remotion_lambda/remotionclient.py","lineNumber":371,"sourceCode":"        except ParamValidationError as e:\n            raise RemotionInvalidArgumentException(\n                f\"Invalid S3 client parameters for create_bucket: {e}\"\n            ) from e\n\n    def _upload_to_s3(self, bucket_name: str, key: str, payload: str) -> None: # Added type hints\n        \"\"\"Upload payload to S3.\"\"\"\n        s3_client = self._create_s3_client()\n        try:\n            s3_client.put_object(\n                Bucket=bucket_name,\n                Key=key,\n                Body=payload,\n                ContentType='application/json',\n            )\n        except ClientError as e:\n            raise e\n        except ParamValidationError as e:\n            raise RemotionInvalidArgumentException(\n                f\"Invalid S3 client parameters for put_object: {e}\"\n            ) from e\n\n    def _needs_upload(self, payload_size: int, render_type: RenderType) -> bool: # Added type hints\n        \"\"\"Determine if payload needs to be uploaded to S3.\"\"\"\n        margin = 5_000 + 1024  # 5KB margin + 1KB for webhook data\n        max_still_inline_size = 5_000_000 - margin\n        max_video_inline_size = 200_000 - margin\n\n        # Using RenderType Enum for comparison\n        max_size = (\n            max_still_inline_size if render_type == 'still' else max_video_inline_size\n        )\n\n        if payload_size > max_size:\n            logger.warning(\n                \"Warning: The props are over %sKB (%sKB) in size. Uploading them to S3 to \"\n                \"circumvent AWS Lambda payload size, which may lead to slowdown.\",","sourceCodeStart":353,"sourceCodeEnd":389,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/lambda-python/remotion_lambda/remotionclient.py#L353-L389","documentation":"Raised when boto3 rejects the parameters to put_object with a ParamValidationError during input-props upload. Network/permission errors (ClientError) are re-raised separately; this fires only for malformed parameter shapes such as a non-string bucket_name or key, or a missing Body.","triggerScenarios":"Triggered from _upload_to_s3 when the computed key is None/empty, the bucket name resolved to a non-string, the payload Body is not valid bytes/str, or the internal S3 client was misconfigured.","commonSituations":"Hash generation returning None so the inputPropsKey is empty; bucket lookup returning a non-scalar; mocking S3 client with incomplete stubs in tests; payload variable accidentally None due to upstream serialization bug.","solutions":["Inspect __cause__ for the exact ParamValidationError report and the offending parameter.","Confirm inputPropsKey and bucket_name resolve to non-empty strings before calling render APIs.","Ensure the payload passed to the render call is itself a valid (json-serializable) object.","Recreate the client with a valid region/Session so the internal S3 client is correctly configured."],"exampleFix":"// before\nclient = RemotionClient(region='us-east-1', serve_url=..., function_name='')\nclient.renderMedia(...)  # empty key chain leads to invalid put_object params\n\n# after\nclient = RemotionClient(region='us-east-1', serve_url=..., function_name='remotion-render-...')\nclient.renderMedia(...)","handlingStrategy":"try-catch","validationCode":"def preflight_put_object(bucket_name: str, key: str, payload: str) -> None:\n    if not (isinstance(bucket_name, str) and bucket_name):\n        raise ValueError(f'invalid bucket: {bucket_name!r}')\n    if not (isinstance(key, str) and key):\n        raise ValueError(f'invalid key: {key!r}')\n    if not isinstance(payload, (str, bytes)):\n        raise ValueError(f'invalid payload type: {type(payload).__name__}')","typeGuard":"def is_valid_s3_key(value) -> bool:\\n    return isinstance(value, str) and len(value) >= 1 and len(value) <= 1024","tryCatchPattern":"try:\\n    client.render_media(...)\\nexcept RemotionInvalidArgumentException as e:\\n    log.error('put_object param error: %s', e.__cause__)\\n    raise","preventionTips":["Ensure inputProps pre-serialize to a non-empty JSON string.","Use a valid boto3 Session with region_name set.","Avoid bypassing constructor validation that guards function_name/region."],"tags":["python","s3","validation","input-props","aws-sdk"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}