Repository navigation
feat(firehose): deliver GZIP-compressed S3 objects - #2745
Conversation
Admission and output selection read the supported CompressionFormat values from one parser, so a request handler can no longer reach a panic if the two lists drift.
…sync docs - Honor ExtendedS3/S3 EncryptionConfiguration.KMSEncryptionConfig by writing delivered objects with SSE-KMS under AWSKMSKeyARN instead of rejecting record admission; fold the options/encryption S3 delivery writers into one. - Coerce string-typed nested booleans/integers/doubles in CloudFormation Firehose destination blocks so DescribeDeliveryStream echoes model types. - Fix stale processor wording and restore front-matter spacing in docs.
|
Thanks a lot for this, @cavanaug. Real GZIP output with the right Content-Encoding, ETag and checksum over the stored bytes is a big fidelity step for anyone reading Firehose output from S3, and the admission checks follow the #2708 plan exactly. I pushed a few follow-ups before merging: a destination |
Summary
Part 2 of the Firehose S3 delivery series tracked in #2708, following merged #2715.
flate2dependency. Preserve binary record bytes and applyAppendDelimiterToRecordbefore compression..gzby default, honorFileExtensionoverrides, and persistContent-Encoding: gziptogether with the encoded body and its MD5 ETag.InvalidArgumentExceptionnaming the setting. Preserve CFN settings so those streams get the same checks rather than silently writing substitute bytes.Compression::from_format), so admission and encoding cannot disagree and no request path relies on anunreachable!.Rebase compatibility
Rebased onto upstream
mainat774c772d6. Retains #2712's SES publishing, #2713's source admission, #2714's compression validation, #2720's raw GZIP Logs records, #2725's ordinary S3 versioning/Object Lock semantics, #2730's default CRC64NVME full-object checksums, and #2737's shared write-side-effect path. Checksums and ETags describe the compressed S3 payload, not decoded records or at-rest KMS ciphertext. Bucket-default encryption, replication, and notifications remain on the shared commit path.Failed persistent writes do not publish memory-only objects, matching current upstream. Records are still acknowledged without retries in this immediate-delivery increment; the buffering increment adds retention/retry of failed batches.
Test plan
dfd71471c): 1,721 focused unit tests across CloudFormation (635), Firehose (70), Logs (361), and S3 (655); 82 rebuilt-server SDK tests covering Firehose/GZIP, compression/admission validation, SES events, checksums, persistence, SSE-KMS, and write side effects; one Athena cross-service regression; 107 Firehose/SES/S3 conformance tests.cargo test --workspacewas run without exclusions on055708266(before the final single-parser refactor and docs wording) and stopped onfakecloud-apigateway::data_plane::tests::vpc_link_proxy_resolves_target_nlb_and_attempts_connection: expected 502, got 504 (128/129 API Gateway tests passed). The exact failure was independently reproduced on untouched upstream153774026; API Gateway's test and implementation are unchanged by this PR or the later upstream commits. Closed port127.0.0.1:54321times out in this WSL environment instead of refusing connections. This is a failing local workspace result, not a passing gate; no test skip/exclusion was added. The focused gates above passed on the final revision.Maintainer alignment
Follows the owner's #2708 guidance: exact byte concatenation, modeled-enum acceptance on Create/Update/CFN, and named
InvalidArgumentExceptionon unsupported record admission. The interval-range correction and Firehose-owned flusher/reset/shutdown lifecycle remain in the later buffering increment, not this codec PR.Series context
Refs #2708; does not close the tracking issue. The next increments are stacked on this PR: Xerial Snappy in #2746, then the complete buffered-delivery lifecycle in #2747.