fix(glue): rename the Crawler DynamoDB scan members and the Iceberg table input to their SDK spellings - #1409
Merged
Merged
Conversation
…able input to their SDK spellings Both providers forwarded a CFn blob raw where the SDK model diverges, and the AWS SDK v3 serializer drops unknown members, so the values silently never reached AWS while the call reported success. Crawler (#1391): the SDK DynamoDBTarget is a lowercase island in an otherwise PascalCase model -- Path is PascalCase but the scan-tuning members are scanAll and scanRate, while CFn spells them ScanAll / ScanRate. The target itself survived (matched by Path); only the scan tuning was lost. Converted on create and update, with the inverse applied in readCurrentState so drift no longer reports a phantom ScanRate removal plus scanRate addition. The other seven CrawlerTargets sub-types were audited against the SDK model and match CFn key-for-key (MongoDBTarget.ScanAll IS PascalCase) -- recorded in a comment so the audit is not repeated. Table (#1390): CFn OpenTableFormatInput.IcebergInput.IcebergTableInput is the SDK's IcebergInput.CreateIcebergTableInput, so the entire Iceberg table spec (Location / Schema / PartitionSpec / WriteOrder / Properties) was discarded. The renamed object's own members match CFn 1:1, so a single key rename suffices. The stale "maps 1:1 to the SDK type (same PascalCase)" comment is corrected, as is the vague UpdateTable claim next to it: UpdateTableRequest has no OpenTableFormatInput member at all; it carries the different, update-only UpdateOpenTableFormatInput shape that CFn does not model. Closes #1391 Closes #1390
go-to-k
force-pushed
the
fix/1390-1391-glue-nested-keys
branch
from
August 9, 2026 06:39
d4994a7 to
90c9912
Compare
…able input to their SDK spellings Both providers forwarded a CFn blob raw where the SDK model diverges, and the AWS SDK v3 serializer drops unknown members, so the values silently never reached AWS while the call reported success. Crawler (#1391): the SDK DynamoDBTarget is a lowercase island in an otherwise PascalCase model -- Path is PascalCase but the scan-tuning members are scanAll and scanRate, while CFn spells them ScanAll / ScanRate. The target itself survived (matched by Path); only the scan tuning was lost. Converted on create and update, with the inverse applied in readCurrentState so drift no longer reports a phantom ScanRate removal plus scanRate addition. The other seven CrawlerTargets sub-types were audited against the SDK model and match CFn key-for-key (MongoDBTarget.ScanAll IS PascalCase) -- recorded in a comment so the audit is not repeated. Table (#1390): CFn OpenTableFormatInput.IcebergInput.IcebergTableInput is the SDK's IcebergInput.CreateIcebergTableInput, so the entire Iceberg table spec (Location / Schema / PartitionSpec / WriteOrder / Properties) was discarded. The renamed object's own members match CFn 1:1, so a single key rename suffices. The stale "maps 1:1 to the SDK type (same PascalCase)" comment is corrected, as is the vague UpdateTable claim next to it: UpdateTableRequest has no OpenTableFormatInput member at all; it carries the different, update-only UpdateOpenTableFormatInput shape that CFn does not model. Also adds a second AWS wording to the Glue assume-role IAM-propagation retry patterns. The existing entry is anchored on "is unable to assume provided role", but the same race also surfaces as "Service is unable to assume the role <arn> to access null. Please verify the role's TrustPolicy." -- hit live on this PR's own integ run once the crawler role gained an extra inline policy, where it failed the deploy outright instead of retrying. The glue-update-hardening fixture now carries a DynamoDB crawler target with non-default scan tuning (AWS defaults ScanAll to true and stores ScanRate as null when unset, so a default echo cannot satisfy the assertion), asserted after create and again after the UPDATE phase with a second distinct pair. Closes #1391 Closes #1390
go-to-k
force-pushed
the
fix/1390-1391-glue-nested-keys
branch
from
August 9, 2026 06:55
90c9912 to
7c23dec
Compare
github-actions Bot
pushed a commit
that referenced
this pull request
Aug 9, 2026
## [0.278.8](v0.278.7...v0.278.8) (2026-08-09) ### Bug Fixes * **glue:** rename the Crawler DynamoDB scan members and the Iceberg table input to their SDK spellings ([#1409](#1409)) ([ffef506](ffef506))
|
🎉 This PR is included in version 0.278.8 🎉 The release is available on: Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two
GlueProvidersites forwarded a CFn blob raw where the SDK model diverges. The AWS SDK v3 serializer drops unknown members, so the values silently never reached AWS while the call reported success.Targets.DynamoDBTargets[].ScanAll/.ScanRatescanAll/scanRatePath)OpenTableFormatInput.IcebergInput.IcebergTableInputIcebergInput.CreateIcebergTableInputLocation/Schema/PartitionSpec/WriteOrder/Properties) discardedWhat changed
Crawler. The SDK's
DynamoDBTargetis a lowercase island in an otherwise-PascalCase model —Pathis PascalCase but the scan-tuning members are not. Converted on create and update, with the inverse applied inreadCurrentStateso drift no longer reports a phantomScanRateremoval plusscanRateaddition. The other sevenCrawlerTargetssub-types were audited against the SDK model and match CFn key-for-key (MongoDBTarget.ScanAllgenuinely IS PascalCase) — recorded in a comment so the audit is not repeated.Table. A single key rename; the renamed object's own members match CFn 1:1. The stale "maps 1:1 to the SDK type (same PascalCase)" comment is corrected, as is the vague
UpdateTableclaim beside it:UpdateTableRequesthas noOpenTableFormatInputmember at all — it carries the different, update-onlyUpdateOpenTableFormatInputshape that CFn does not model.Retry patterns (2 new). Adding a DynamoDB crawler target makes
CreateCrawlereagerly calldynamodb:DescribeTableas the crawler role, which turns the fixture into a sensitive probe of IAM propagation. It surfaced two AWS wordings of that race that cdkd did not retry, each failing the deploy outright:Service is unable to assume the role <arn> to access null. Please verify the role's TrustPolicy.— the existing entry is anchored onis unable to assume provided role, which does not matchthe role <arn>.The security token included in the request is invalid. (Service: AmazonDynamoDBv2; ... UnrecognizedClientException)— Glue assumed the fresh role and the resulting session's token was not valid yet. This one became deterministic once the crawler was correctly ordered after the role and its policy, and adding the pattern is what turned a reproducible failure into a clean pass.The second pattern is anchored on the Java-SDK
(Service:trailer, which is load-bearing: that trailer appears only on a SERVICE-wrapped error, so the developer's own expired SSO session (same sentence, JS SDK, no trailer) still fails fast instead of burning ~48s of retries. A dedicated negative test pins that.Numeric + boolean coercion.
toSdkCrawlerTargetsis now the wire boundary forTargets, and CFn is stringly typed, soScanRate: "0.9"was being forwarded verbatim to a double member. Both members are coerced per the repo convention —ScanAll: "false"matters more, since the raw string is TRUTHY and would silently invert the setting. Unparseable input passes through so AWS surfaces the real validation error.Test plan
12 new unit tests. 8 are genuinely red against the pre-fix provider (both renames on create + update, the
readCurrentStateinverse, theScanRatecoercion, and both new retry patterns); the rest are over-conversion / pass-through guards that are green either way by construction, plus the expired-credentials negative guard.Full suite: 516 files / 8723 tests, no type errors.
Real AWS,
AWS::Glue::Crawler:DynamoDBTargets[].ScanRate/ScanAlldropped (SDK members are lowercasescanRate/scanAll) #1391 (/run-integ glue-update-hardening, us-east-1). The fixture now carries a DynamoDB crawler target with deliberately NON-default scan tuning — AWS defaultsScanAlltotrueand storesScanRateas null when unset, so a default echo cannot satisfy the assertion.GetCrawlerconfirmedscanAll=false scanRate=0.9after create andscanAll=true scanRate=1.2after the UPDATE phase. Clean destroy, 0 orphans.Real AWS,
AWS::Glue::Table:IcebergInput.IcebergTableInputnever renamed to SDKCreateIcebergTableInput— Iceberg table spec silently dropped #1390 — proven by A/B rather than by a green fixture. Both directions were exercised against a liveIcebergSpecTable:TableInput.StorageDescriptoronly — the Iceberg spec silently discarded, i.e. the reported bug reproduced;Table metadata information present at multiple parts of input request, an error only reachable if the renamed key did arrive.That is a stronger signal than a passing assertion, but it is not a green fixture, so the fixture change was reverted rather than shipped half-working. Details and the three rejected request shapes are in (test(integ): no real-AWS coverage for
AWS::Glue::TableIcebergTableInput— the correctCreateIcebergTableInputrequest shape is undocumented #1408).Known gaps (reviewer-surfaced, deliberately not widened into this PR)
AWS::Glue::Crawler/::Tableare not inNESTED_KEY_TARGETS. Both bugs are textbookcase-divergence/no-sdk-memberhits for the nested-key critic, so unit tests are the only mechanical guard here. Adding them needs a CFn-schema fixture re-capture (nestedProperties/definitionShapes), which is the critic-target expansion tracked in (audit: nested-key critic blind spots found by the 0809 sweep — mixed-case SDK models, file-global literal heuristic, missing targets, selective sub-key forwards #1393).ScanRate: "0.9"is now coerced on the wire, but state still records the string whilereadCurrentStatereturns the number — a phantom-drift class that pre-dates this PR and affects the provider generally.scanAll: truematches AWS's own default, soscanRate: 1.2is what carries the regression signal for that phase. Noted in a comment at the assertion; the create phase asserts the drop-prooffalse/0.9pair and fails first regardless.Follow-ups
IcebergTableInput(test(integ): no real-AWS coverage forAWS::Glue::TableIcebergTableInput— the correctCreateIcebergTableInputrequest shape is undocumented #1408): the request shape Glue accepts is undocumented — the publishedIcebergInputdoc page is stale, and the CFn spec marksLocation/Schemarequired in a way AWS's own validation contradicts. Same shape of gap as (test(integ): no real-AWS coverage for any EMR InstanceTypeConfigs path (instance-fleet nested Configurations) #1400) for EMR instance fleets.AWS::Glue::*types are not inNESTED_KEY_TARGETS, so the nested-key critic would not have caught either divergence. That target expansion is tracked in (audit: nested-key critic blind spots found by the 0809 sweep — mixed-case SDK models, file-global literal heuristic, missing targets, selective sub-key forwards #1393).Closes #1391
Closes #1390