@go-to-k/cdkd 0.291.3 → 0.291.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asg-provider-CLqajoRp.js → asg-provider-_vdcb9QG.js} +4 -4
- package/dist/asg-provider-_vdcb9QG.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-5fdODHji.js → deploy-engine-CpMT9Bmm.js} +1980 -132
- package/dist/deploy-engine-CpMT9Bmm.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{program-lTNPrurx.js → program-C5r-kmIQ.js} +456 -82
- package/dist/{program-lTNPrurx.js.map → program-C5r-kmIQ.js.map} +1 -1
- package/dist/{version-BKm47b9j.js → version-ChuDKy_E.js} +2 -2
- package/dist/{version-BKm47b9j.js.map → version-ChuDKy_E.js.map} +1 -1
- package/package.json +2 -2
- package/dist/asg-provider-CLqajoRp.js.map +0 -1
- package/dist/deploy-engine-5fdODHji.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as displayAwsMessage, D as truncateCodePoints, E as isPasteableIdent, S as UNRENDERABLE, T as displaySafe, d as applyDefaultNameForFallback, f as explicitNamePropertyFor, g as looksLikeCdkdGeneratedName, h as getCurrentStackName, m as generateResourceNameWithFallback, n as getLogger, p as generateResourceName, r as isStdoutReservedForPayload, s as getLiveRenderer, v as withStackName, w as displayIdent, x as STACK_REF_MAX_CODE_POINTS, y as withoutGeneratedFallbackName } from "./logger-GASr9bAF.js";
|
|
2
2
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BoIxyCir.js";
|
|
3
|
-
import { t as getCdkdVersion } from "./version-
|
|
3
|
+
import { t as getCdkdVersion } from "./version-ChuDKy_E.js";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
5
|
import { createHash, randomUUID } from "node:crypto";
|
|
6
6
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -3330,6 +3330,53 @@ function processStackMessages(stacks, logger, options = {}) {
|
|
|
3330
3330
|
if (hasWarnings && failAt === "warn") throw new SynthesisError("Found warnings (--strict mode)");
|
|
3331
3331
|
}
|
|
3332
3332
|
|
|
3333
|
+
//#endregion
|
|
3334
|
+
//#region src/utils/glob-match.ts
|
|
3335
|
+
/**
|
|
3336
|
+
* Whether `subject` matches the glob `pattern`, where `*` matches any run of
|
|
3337
|
+
* characters (the empty run included) and EVERY other character is literal.
|
|
3338
|
+
*
|
|
3339
|
+
* The one answer to "what does a stack-selection pattern mean", shared by
|
|
3340
|
+
* `stackMatchesPattern` (`src/cli/stack-matcher.ts`) and the failed-Stage
|
|
3341
|
+
* attribution in `src/synthesis/failed-stages.ts`, so the two cannot disagree
|
|
3342
|
+
* ([#3508](https://github.com/go-to-k/cdkd/issues/3508)). An import-free LEAF,
|
|
3343
|
+
* so both layers may import it.
|
|
3344
|
+
*
|
|
3345
|
+
* **Never a RegExp.** Both sites used to expand `*` into `.*` and compile the
|
|
3346
|
+
* result, which had two defects: a pattern with several `*` separated by
|
|
3347
|
+
* literals backtracked EXPONENTIALLY in the length of the subject (a stack
|
|
3348
|
+
* name or Stage path from the Cloud Assembly), and the other characters were
|
|
3349
|
+
* live regex syntax only when the pattern held a `*` — `My.Stage*` matched
|
|
3350
|
+
* `MyXStage1` while `My.Stage` matched only itself, and `My(Stage*` threw a
|
|
3351
|
+
* `SyntaxError`.
|
|
3352
|
+
*
|
|
3353
|
+
* The walk anchors the text before the first `*` at the start and the text
|
|
3354
|
+
* after the last `*` at the end, then places each middle segment at its
|
|
3355
|
+
* LEFTMOST occurrence after the previous one. Leftmost placement is optimal
|
|
3356
|
+
* when `*` is the only wildcard — any later placement leaves strictly less room
|
|
3357
|
+
* for the segments after it — so no backtracking is needed. The cost is one
|
|
3358
|
+
* `indexOf` per segment, O(|subject| x |pattern|) in the worst case:
|
|
3359
|
+
* polynomial, where the RegExp was exponential.
|
|
3360
|
+
*/
|
|
3361
|
+
function globMatches(pattern, subject) {
|
|
3362
|
+
const segments = pattern.split("*");
|
|
3363
|
+
if (segments.length === 1) return pattern === subject;
|
|
3364
|
+
const head = segments[0];
|
|
3365
|
+
const tail = segments[segments.length - 1];
|
|
3366
|
+
if (subject.length < head.length + tail.length) return false;
|
|
3367
|
+
if (!subject.startsWith(head) || !subject.endsWith(tail)) return false;
|
|
3368
|
+
const end = subject.length - tail.length;
|
|
3369
|
+
let cursor = head.length;
|
|
3370
|
+
for (let i = 1; i < segments.length - 1; i++) {
|
|
3371
|
+
const segment = segments[i];
|
|
3372
|
+
if (segment === "") continue;
|
|
3373
|
+
const at = subject.indexOf(segment, cursor);
|
|
3374
|
+
if (at === -1 || at + segment.length > end) return false;
|
|
3375
|
+
cursor = at + segment.length;
|
|
3376
|
+
}
|
|
3377
|
+
return true;
|
|
3378
|
+
}
|
|
3379
|
+
|
|
3333
3380
|
//#endregion
|
|
3334
3381
|
//#region src/synthesis/failed-stages.ts
|
|
3335
3382
|
/**
|
|
@@ -3431,29 +3478,7 @@ function patternTargetsStage(pattern, stagePath) {
|
|
|
3431
3478
|
const patternSegments = pattern.split("/");
|
|
3432
3479
|
const stageSegments = stagePath.split("/");
|
|
3433
3480
|
if (patternSegments.length < stageSegments.length) return false;
|
|
3434
|
-
return stageSegments.every((segment, i) =>
|
|
3435
|
-
}
|
|
3436
|
-
/**
|
|
3437
|
-
* Wildcard-aware comparison of ONE path segment, matching how
|
|
3438
|
-
* `stackMatchesPattern` expands `*` in `src/cli/stack-matcher.ts`. The pattern
|
|
3439
|
-
* is the USER's own input, not an assembly-supplied value, so it is expanded
|
|
3440
|
-
* there the same way — metacharacters and all, so the two cannot disagree
|
|
3441
|
-
* about what a pattern means.
|
|
3442
|
-
*
|
|
3443
|
-
* The construction is guarded because SPLITTING on `/` can make an invalid
|
|
3444
|
-
* segment out of a valid pattern (`'(*x/y*)'` splits into `'(*x'`), and this
|
|
3445
|
-
* helper runs when the stack list is EMPTY, which is exactly when
|
|
3446
|
-
* `stackMatchesPattern` never evaluates and therefore never raises first. An
|
|
3447
|
-
* unusable pattern is simply not attributed: the note still prints, hedged,
|
|
3448
|
-
* instead of a `SyntaxError` replacing the message the user needed.
|
|
3449
|
-
*/
|
|
3450
|
-
function segmentMatches(patternSegment, segment) {
|
|
3451
|
-
if (!patternSegment.includes("*")) return patternSegment === segment;
|
|
3452
|
-
try {
|
|
3453
|
-
return new RegExp("^" + patternSegment.replace(/\*/g, ".*") + "$").test(segment);
|
|
3454
|
-
} catch {
|
|
3455
|
-
return false;
|
|
3456
|
-
}
|
|
3481
|
+
return stageSegments.every((segment, i) => globMatches(patternSegments[i], segment));
|
|
3457
3482
|
}
|
|
3458
3483
|
|
|
3459
3484
|
//#endregion
|
|
@@ -3750,7 +3775,7 @@ var ContextStore = class {
|
|
|
3750
3775
|
this.logger.debug(`Skipping transient context value for key: ${key}`);
|
|
3751
3776
|
continue;
|
|
3752
3777
|
}
|
|
3753
|
-
existing
|
|
3778
|
+
defineOwnKey(existing, key, value);
|
|
3754
3779
|
}
|
|
3755
3780
|
writeFileSync(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
3756
3781
|
this.logger.debug(`Saved ${Object.keys(updates).length} context value(s) to cdk.context.json`);
|
|
@@ -4450,7 +4475,7 @@ var ContextProviderRegistry = class {
|
|
|
4450
4475
|
* @returns Map of context key → resolved value
|
|
4451
4476
|
*/
|
|
4452
4477
|
async resolve(missing) {
|
|
4453
|
-
const results =
|
|
4478
|
+
const results = nullPrototypeRecord();
|
|
4454
4479
|
for (const entry of missing) {
|
|
4455
4480
|
const provider = this.providers.get(entry.provider);
|
|
4456
4481
|
const shownProvider = displaySafe(entry.provider);
|
|
@@ -18325,12 +18350,12 @@ var TemplateParser = class {
|
|
|
18325
18350
|
const resources = t["Resources"];
|
|
18326
18351
|
for (const [logicalId, resource] of Object.entries(resources)) {
|
|
18327
18352
|
if (typeof resource !== "object" || resource === null) {
|
|
18328
|
-
this.logger.error(`Resource ${logicalId} is not an object`);
|
|
18353
|
+
this.logger.error(`Resource ${displaySafe(logicalId)} is not an object`);
|
|
18329
18354
|
return false;
|
|
18330
18355
|
}
|
|
18331
18356
|
const r = resource;
|
|
18332
18357
|
if (!("Type" in r) || typeof r["Type"] !== "string") {
|
|
18333
|
-
this.logger.error(`Resource ${logicalId} missing Type or Type is not a string`);
|
|
18358
|
+
this.logger.error(`Resource ${displaySafe(logicalId)} missing Type or Type is not a string`);
|
|
18334
18359
|
return false;
|
|
18335
18360
|
}
|
|
18336
18361
|
}
|
|
@@ -18387,7 +18412,7 @@ var TemplateParser = class {
|
|
|
18387
18412
|
for (const [logicalId, resource] of Object.entries(template.Resources)) {
|
|
18388
18413
|
const conditionName = resource.Condition;
|
|
18389
18414
|
if (conditionName !== void 0 && Object.hasOwn(conditions, conditionName) && conditions[conditionName] === false) {
|
|
18390
|
-
this.logger.debug(`Excluding resource ${logicalId} — condition ${conditionName} is false`);
|
|
18415
|
+
this.logger.debug(`Excluding resource ${displaySafe(logicalId)} — condition ${displaySafe(conditionName)} is false`);
|
|
18391
18416
|
continue;
|
|
18392
18417
|
}
|
|
18393
18418
|
if (logicalId === "__proto__") Object.defineProperty(filteredResources, logicalId, {
|
|
@@ -20383,14 +20408,11 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
20383
20408
|
"UserPoolTags",
|
|
20384
20409
|
"UserPoolTier",
|
|
20385
20410
|
"VerificationMessageTemplate",
|
|
20411
|
+
"WebAuthnFactorConfiguration",
|
|
20386
20412
|
"WebAuthnRelyingPartyID",
|
|
20387
20413
|
"WebAuthnUserVerification"
|
|
20388
20414
|
]),
|
|
20389
|
-
silentDrop: /* @__PURE__ */ new Map([
|
|
20390
|
-
["IssuerConfiguration", "not yet implemented by cdkd"],
|
|
20391
|
-
["KeyConfiguration", "not yet implemented by cdkd"],
|
|
20392
|
-
["WebAuthnFactorConfiguration", "No wire path in the PINNED SDK (@aws-sdk/client-cognito-identity-provider 3.1018.0): WebAuthnConfigurationType is {RelyingPartyId?, UserVerification?} and no CreateUserPool/UpdateUserPool field accepts SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION. This is an SDK-VERSION limit, NOT an API one -- the live API does honour FactorConfiguration (measured us-east-1 2026-08-20: SetUserPoolMfaConfig(ON) on a pool allowing WEB_AUTHN as a first auth factor is rejected with \"Cannot set WebAuthn factor configuration to SINGLE_FACTOR if MFA is required and WebAuthn is an allowed first auth factor\", i.e. the service reads a field the SDK cannot send). RE-EVALUATE THIS ENTRY ON AN SDK BUMP: if WebAuthnConfigurationType gains FactorConfiguration, the property becomes handleable and this entry must go"]
|
|
20393
|
-
]),
|
|
20415
|
+
silentDrop: /* @__PURE__ */ new Map([["IssuerConfiguration", "not yet implemented by cdkd"], ["KeyConfiguration", "not yet implemented by cdkd"]]),
|
|
20394
20416
|
createOnlyDrops: /* @__PURE__ */ new Set()
|
|
20395
20417
|
}],
|
|
20396
20418
|
["AWS::DLM::LifecyclePolicy", {
|
|
@@ -22698,10 +22720,31 @@ function repairMalformedResourcesForReadOnly(state) {
|
|
|
22698
22720
|
* documents `2` as "PARTIAL — journal kept, idempotent re-run", so a `2` here
|
|
22699
22721
|
* would tell an operator to re-run a command that attempted nothing.
|
|
22700
22722
|
*/
|
|
22701
|
-
function malformedStateRefusalMessage(rawStackName, rawRegion) {
|
|
22723
|
+
function malformedStateRefusalMessage(rawStackName, rawRegion, recovery) {
|
|
22702
22724
|
const stackName = absentIfEmpty(rawStackName);
|
|
22703
22725
|
const region = absentIfEmpty(rawRegion);
|
|
22704
|
-
return `${malformedStateDiagnosis(stackName, region)} This command can WRITE state, so it refuses rather than continuing: saving over a record whose resource map could not be read would replace the evidence with a well-formed empty one and lose it permanently. Repair or remove the record first
|
|
22726
|
+
return inspectTail(`${malformedStateDiagnosis(stackName, region)} This command can WRITE state, so it refuses rather than continuing: saving over a record whose resource map could not be read would replace the evidence with a well-formed empty one and lose it permanently. Repair or remove the record first.`, stackName, region, recovery);
|
|
22727
|
+
}
|
|
22728
|
+
/**
|
|
22729
|
+
* How a READ-ONLY remedy ends a single-command message: on
|
|
22730
|
+
* `Inspect it with: <inspectCommand>` — unless the record is a region-less
|
|
22731
|
+
* LEGACY one, which that command cannot read (go-to-k/cdkd#3388).
|
|
22732
|
+
*
|
|
22733
|
+
* A KNOWN stack with NO region is what `cdkd orphan` hands for a legacy
|
|
22734
|
+
* `<prefix>/<stack>/state.json` listed with no region, and `cdkd state show`
|
|
22735
|
+
* refuses such a record with or without `--stack-region`, so ending on it hands
|
|
22736
|
+
* the operator a dead end. That arm names the S3 object instead, through
|
|
22737
|
+
* {@link orphanInspectClause}, which already owns the shape (the object path
|
|
22738
|
+
* gated on the name rendering exactly, the real prefix and bucket when
|
|
22739
|
+
* `recovery` carries them, one location per trailing line).
|
|
22740
|
+
*
|
|
22741
|
+
* Every other identity keeps the command, so a region-keyed record's text is
|
|
22742
|
+
* byte-identical to what it was.
|
|
22743
|
+
*/
|
|
22744
|
+
function inspectTail(prose, stackName, region, recovery) {
|
|
22745
|
+
if (stackName === void 0 || region !== void 0) return `${prose} Inspect it with: ${inspectCommand(stackName, region)}`;
|
|
22746
|
+
const legacy = orphanInspectClause(stackName, void 0, recovery);
|
|
22747
|
+
return [`${prose} ${legacy.sentence ?? ""}`.trimEnd(), ...legacy.locations ?? []].join("\n");
|
|
22705
22748
|
}
|
|
22706
22749
|
/**
|
|
22707
22750
|
* The destructive template, in the three messages that offer one.
|
|
@@ -22746,7 +22789,7 @@ const DROP_RECORD_LINE = `Drop the record: ${DROP_RECORD_TEMPLATE}`;
|
|
|
22746
22789
|
* identity here.
|
|
22747
22790
|
*/
|
|
22748
22791
|
function mayNameTargetWithDestructiveRemedy(stackName, region) {
|
|
22749
|
-
return
|
|
22792
|
+
return rendersExactly(stackName) && rendersExactly(region, SHORT_NAME_MAX_CODE_POINTS) && isPasteableIdent(stackName) && isPasteableIdent(region);
|
|
22750
22793
|
}
|
|
22751
22794
|
/**
|
|
22752
22795
|
* The DESTROY refusal text for the `resources` bag (issue
|
|
@@ -22955,7 +22998,7 @@ const STATE_REGION_DIVERGED = "STATE_REGION_DIVERGED";
|
|
|
22955
22998
|
*/
|
|
22956
22999
|
function divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBodyRegion, resourceCount) {
|
|
22957
23000
|
const cap = STACK_REF_MAX_CODE_POINTS;
|
|
22958
|
-
const exact =
|
|
23001
|
+
const exact = rendersExactly(stackName, cap) && rendersExactly(keyRegion, cap) && isPasteableIdent(stackName) && isPasteableIdent(keyRegion);
|
|
22959
23002
|
const lists = resourceCount === void 0 ? "its resources map cannot be read" : `it still lists ${resourceCount} resource${resourceCount === 1 ? "" : "s"}`;
|
|
22960
23003
|
const kind = describeRegionValueKind(divergentBodyRegion);
|
|
22961
23004
|
const opening = exact ? `cdkd will not destroy stack ${shellQuote(safeIdentifier(stackName, cap))} (${shellQuote(safeIdentifier(keyRegion, cap))}): the state record read from that region's key carries a 'region' of its own (${kind}) that is not the key's, and ${lists}` : `cdkd will not destroy the state record this command loaded: it carries a 'region' of its own (${kind}) that is not the region of the key it was read from, and ${lists}`;
|
|
@@ -23252,9 +23295,9 @@ function malformedOutputsWarning(rawStackName, rawRegion) {
|
|
|
23252
23295
|
* this names the stack, the region, the defect and the remedy, and exits on a
|
|
23253
23296
|
* code rather than on a stack trace.
|
|
23254
23297
|
*/
|
|
23255
|
-
function refuseMalformedState(state, stackName, region) {
|
|
23298
|
+
function refuseMalformedState(state, stackName, region, recovery) {
|
|
23256
23299
|
if (hasReadableResources(state)) return;
|
|
23257
|
-
throw new CdkdError(malformedStateRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED);
|
|
23300
|
+
throw new CdkdError(malformedStateRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED);
|
|
23258
23301
|
}
|
|
23259
23302
|
/**
|
|
23260
23303
|
* The `outputs` half of {@link malformedStateRefusalMessage}, for the same
|
|
@@ -23273,10 +23316,10 @@ function refuseMalformedState(state, stackName, region) {
|
|
|
23273
23316
|
* Identifiers are sanitized and THEN shell-quoted and the command is emitted
|
|
23274
23317
|
* LAST and UNWRAPPED, for the reasons {@link safeIdentifier}'s note gives.
|
|
23275
23318
|
*/
|
|
23276
|
-
function malformedOutputsRefusalMessage(rawStackName, rawRegion) {
|
|
23319
|
+
function malformedOutputsRefusalMessage(rawStackName, rawRegion, recovery) {
|
|
23277
23320
|
const stackName = absentIfEmpty(rawStackName);
|
|
23278
23321
|
const region = absentIfEmpty(rawRegion);
|
|
23279
|
-
return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first
|
|
23322
|
+
return inspectTail(`${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first.`, stackName, region, recovery);
|
|
23280
23323
|
}
|
|
23281
23324
|
/**
|
|
23282
23325
|
* The line `ExportIndexStore`'s rebuild emits for a producer record whose
|
|
@@ -23360,9 +23403,9 @@ function malformedExportNamesWarning(rawStackName, rawRegion) {
|
|
|
23360
23403
|
* records: a guard written at the rebuild leaves every earlier dereference in
|
|
23361
23404
|
* front of it.
|
|
23362
23405
|
*/
|
|
23363
|
-
function refuseMalformedOutputs(state, stackName, region) {
|
|
23406
|
+
function refuseMalformedOutputs(state, stackName, region, recovery) {
|
|
23364
23407
|
if (hasReadableOutputs(state)) return;
|
|
23365
|
-
throw markNonRetryable(new CdkdError(malformedOutputsRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED));
|
|
23408
|
+
throw markNonRetryable(new CdkdError(malformedOutputsRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
|
|
23366
23409
|
}
|
|
23367
23410
|
/**
|
|
23368
23411
|
* The stand-in row a read-only view lists in its `unreadable` set for an
|
|
@@ -23393,9 +23436,9 @@ const UNREADABLE_ORPHANS_CONTAINER_ROW = "(orphans container)";
|
|
|
23393
23436
|
* ones it cannot see.
|
|
23394
23437
|
*
|
|
23395
23438
|
* The ENTRIES are a separate question with a separate answer —
|
|
23396
|
-
* `
|
|
23397
|
-
* {@link
|
|
23398
|
-
*
|
|
23439
|
+
* {@link unreadableOrphanRecords}, which `cdkd orphan` refuses on through
|
|
23440
|
+
* {@link refuseMalformedOrphansForOrphan} (go-to-k/cdkd#3344). This one says
|
|
23441
|
+
* only that the container is a list.
|
|
23399
23442
|
*/
|
|
23400
23443
|
function hasReadableOrphans(state) {
|
|
23401
23444
|
return state.orphans === void 0 || Array.isArray(state.orphans);
|
|
@@ -23766,15 +23809,26 @@ function dropRecordCommand(stackName, region, recovery) {
|
|
|
23766
23809
|
* drop command from a legacy record whose name merely needs quoting — the very
|
|
23767
23810
|
* path go-to-k/cdkd#3359 built, where `cdkd state show` refuses outright and
|
|
23768
23811
|
* this command is the way out. Measured: `It's Legacy` loses it.
|
|
23812
|
+
*
|
|
23813
|
+
* **The ONE spelling of the exactness test in this module** (go-to-k/cdkd#3388).
|
|
23814
|
+
* The two DESTROY gates measure through it too, each at the cap its own clause
|
|
23815
|
+
* renders at: {@link mayNameTargetWithDestructiveRemedy} passes a region's
|
|
23816
|
+
* `SHORT_NAME_MAX_CODE_POINTS`, and `divergentRecordRegionRefusalMessage`
|
|
23817
|
+
* this default for both identities. `safeStackName(x) === x` and
|
|
23818
|
+
* `safeRegion(x) === x` are this predicate at those two caps, so a site
|
|
23819
|
+
* wanting either says so here instead of re-spelling the comparison —
|
|
23820
|
+
* `tests/unit/state/malformed-resources-bag.test.ts` refuses a second inline
|
|
23821
|
+
* spelling.
|
|
23769
23822
|
*/
|
|
23770
|
-
function rendersExactly(value) {
|
|
23771
|
-
return safeIdentifier(value,
|
|
23823
|
+
function rendersExactly(value, maxCodePoints = STACK_REF_MAX_CODE_POINTS) {
|
|
23824
|
+
return safeIdentifier(value, maxCodePoints) === value;
|
|
23772
23825
|
}
|
|
23773
23826
|
/**
|
|
23774
23827
|
* The remedy command a message ends ON — unless the message also offers the
|
|
23775
23828
|
* destructive template, in which case it ends the READ's own LINE and
|
|
23776
|
-
* {@link DROP_RECORD_LINE} is last (go-to-k/cdkd#3516)
|
|
23777
|
-
*
|
|
23829
|
+
* {@link DROP_RECORD_LINE} is last (go-to-k/cdkd#3516) — the two DESTROY
|
|
23830
|
+
* refusals; the rest close their string with it, directly or through
|
|
23831
|
+
* {@link inspectTail}.
|
|
23778
23832
|
*/
|
|
23779
23833
|
function inspectCommand(stackName, region) {
|
|
23780
23834
|
if (stackName === void 0) return `cdkd state show ${commandHole("stack")} --stack-region ${commandHole("region")} --json`;
|
|
@@ -24094,6 +24148,32 @@ function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logi
|
|
|
24094
24148
|
function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
24095
24149
|
const stackName = absentIfEmpty(rawStackName);
|
|
24096
24150
|
const region = absentIfEmpty(rawRegion);
|
|
24151
|
+
return orphanRefusal(stackName, region, recovery, `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, because the rewrite audit table a dry run prints is the wrong one. It is not that the save would fabricate a map: an unreadable bag is carried through VERBATIM. It is that this command exists to leave the record deployable by rewriting every reference to an orphaned resource, and a map it cannot read hides whichever references it holds — a string or a number presents none to find, and a list is walked, so its rewrites are recorded into a container that is still not a map. Continuing would rewrite, save, and report success over a record 'cdkd deploy' then REFUSES.`, SURVIVOR_THIRD_WAY_OUT);
|
|
24152
|
+
}
|
|
24153
|
+
/**
|
|
24154
|
+
* The third way out every `cdkd orphan` refusal over a `resources` ENTRY
|
|
24155
|
+
* offers, conditioned as {@link malformedOrphanResourcePropertiesRefusalMessage}'s
|
|
24156
|
+
* note requires. One spelling for the three refusals scoped to the survivors
|
|
24157
|
+
* (the entry, its `properties` and its `attributes`), which make the same
|
|
24158
|
+
* promise for the same reason: each subtracts the orphan set.
|
|
24159
|
+
*/
|
|
24160
|
+
const SURVIVOR_THIRD_WAY_OUT = "A third works only while the CDK app STILL DECLARES the named resource — this refusal covers just the records that would SURVIVE the save, so 'cdkd orphan <its construct path>' removes it and repairs the rest; construct paths come from the synthesized template, so a resource the app no longer declares has none and must take one of the first two.";
|
|
24161
|
+
/**
|
|
24162
|
+
* What every `cdkd orphan` refusal shares after its own diagnosis: the two
|
|
24163
|
+
* template-free ways out, the caller's third, and the pasteable lines.
|
|
24164
|
+
*
|
|
24165
|
+
* `lead` is the diagnosis AND the harm, which is what differs per container —
|
|
24166
|
+
* the rule this module follows for every text. The remedy half does not
|
|
24167
|
+
* differ, and a second copy of it is what would drift: it carries the
|
|
24168
|
+
* substitution gate, the withheld-identity clause and the per-line commands
|
|
24169
|
+
* go-to-k/cdkd#3363 settled. `thirdWayOut` is a full sentence; the ones naming
|
|
24170
|
+
* a record outside `resources` cannot offer `cdkd orphan <construct path>` and
|
|
24171
|
+
* say so instead.
|
|
24172
|
+
*
|
|
24173
|
+
* Takes identities ALREADY normalised by the exported builder's
|
|
24174
|
+
* {@link absentIfEmpty}, which is where that floor lives.
|
|
24175
|
+
*/
|
|
24176
|
+
function orphanRefusal(stackName, region, recovery, lead, thirdWayOut, dropCaveat = "") {
|
|
24097
24177
|
const inspect = orphanInspectClause(stackName, region, recovery);
|
|
24098
24178
|
const listCommand = withheldIdentityListCommand(stackName, region, recovery);
|
|
24099
24179
|
const commands = [
|
|
@@ -24102,7 +24182,7 @@ function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion
|
|
|
24102
24182
|
...inspect.command === void 0 ? [] : [`Inspect the record: ${inspect.command}`]
|
|
24103
24183
|
];
|
|
24104
24184
|
return [
|
|
24105
|
-
`${
|
|
24185
|
+
`${lead} No state was written. Two ways out need no CDK app: repair the record by hand, or drop it whole with the 'Drop the record' command below, which leaves the live AWS resources standing${dropCaveat}${withheldIdentityClause(stackName, region)}${withheldRecoveryClause(recovery)}. ` + thirdWayOut + (inspect.sentence === void 0 ? "" : ` ${inspect.sentence}`),
|
|
24106
24186
|
...commands,
|
|
24107
24187
|
...inspect.locations ?? []
|
|
24108
24188
|
].join("\n");
|
|
@@ -24210,6 +24290,9 @@ function orphanInspectCommand(stackName, region, recovery) {
|
|
|
24210
24290
|
* With `recovery` the path carries the REAL prefix and names the bucket, the
|
|
24211
24291
|
* way the drop remedy above it is qualified; without it the prefix is a
|
|
24212
24292
|
* placeholder and the sentence says how to fill it.
|
|
24293
|
+
*
|
|
24294
|
+
* Its region-less arm is also {@link inspectTail}'s, for the state and outputs
|
|
24295
|
+
* refusals `cdkd orphan` raises over the same legacy record (go-to-k/cdkd#3388).
|
|
24213
24296
|
*/
|
|
24214
24297
|
function orphanInspectClause(stackName, region, recovery) {
|
|
24215
24298
|
if (stackName === void 0 || stackName === "") return { command: [`cdkd state show ${commandHole("stack")} --stack-region ${commandHole("region")} --json`, ...recoveryCommandFlags(recovery).flags].join(" ") };
|
|
@@ -24247,34 +24330,18 @@ function orphanInspectClause(stackName, region, recovery) {
|
|
|
24247
24330
|
* cannot persist a record it is deleting, and because refusing on one would
|
|
24248
24331
|
* break the recovery path the refusal is otherwise meant to preserve.
|
|
24249
24332
|
*
|
|
24250
|
-
* **It covers `state.resources` ONLY, and the
|
|
24251
|
-
*
|
|
24252
|
-
*
|
|
24253
|
-
*
|
|
24254
|
-
*
|
|
24255
|
-
*
|
|
24256
|
-
*
|
|
24257
|
-
*
|
|
24258
|
-
*
|
|
24259
|
-
*
|
|
24260
|
-
*
|
|
24261
|
-
*
|
|
24262
|
-
* **A surviving ENTRY that is not a map is the other gap, and it DOES launder.**
|
|
24263
|
-
* This scan asks whether a resource's `properties` is readable; it never asks
|
|
24264
|
-
* whether the resource RECORD is. `isReadableBag('abcdef')` is false, so a
|
|
24265
|
-
* string entry is skipped here, and then `rewriteResourceReferences`'s
|
|
24266
|
-
* `{ ...resource }` spreads it into per-character keys — the record is SAVED as
|
|
24267
|
-
* `{"0":"a",…,"dependencies":[]}` and the run reports success. A number entry
|
|
24268
|
-
* saves as `{"dependencies":[]}`, a record with no `physicalId`. So the
|
|
24269
|
-
* refusal's own text, which says a torn `properties` map is persisted verbatim
|
|
24270
|
-
* rather than reshaped, is true of the container it scans and NOT of the one
|
|
24271
|
-
* above it.
|
|
24272
|
-
*
|
|
24273
|
-
* That gap is NOT go-to-k/cdkd#3202's as filed — that issue records only the
|
|
24274
|
-
* `null`-entry `TypeError` — and NOT open PR go-to-k/cdkd#3226's, whose file
|
|
24275
|
-
* list carries neither `orphan.ts` nor `orphan-rewriter.ts`. A lane closing
|
|
24276
|
-
* either one leaves this open, which is why it is named here rather than
|
|
24277
|
-
* deferred to them by reference. Filed as go-to-k/cdkd#3350.
|
|
24333
|
+
* **It covers the `properties` map of a `state.resources` entry ONLY, and the
|
|
24334
|
+
* save keeps more than that.** Three siblings answer for the rest, each its
|
|
24335
|
+
* own call because each is its own container with its own consequence:
|
|
24336
|
+
* {@link refuseMalformedResourceEntriesForOrphan} for an entry that is not a
|
|
24337
|
+
* record at all — the one shape the save RESHAPES rather than carries
|
|
24338
|
+
* (go-to-k/cdkd#3350) — {@link refuseMalformedResourceAttributesForOrphan} for
|
|
24339
|
+
* the entry's `attributes` map (go-to-k/cdkd#3345), and
|
|
24340
|
+
* {@link refuseMalformedOrphansForOrphan} for `state.orphans[]`, which the
|
|
24341
|
+
* rewrite spreads through `carriedState` without reading (go-to-k/cdkd#3344).
|
|
24342
|
+
* This scan skips an entry that is not an object, which is why the first of
|
|
24343
|
+
* them has to exist: its "carried through VERBATIM" sentence is true of the
|
|
24344
|
+
* container it scans and false of the one above it.
|
|
24278
24345
|
*
|
|
24279
24346
|
* CALL IT AT THE LOAD, beside {@link refuseMalformedState} and
|
|
24280
24347
|
* {@link refuseMalformedOutputs}, above `rewriteResourceReferences` — the
|
|
@@ -24362,8 +24429,9 @@ function isReadableResourceEntry(entry) {
|
|
|
24362
24429
|
* and refusing would stop the command documented as the way to UNWIND a stack
|
|
24363
24430
|
* whose state is already suspect. The other callers (`cdkd import`,
|
|
24364
24431
|
* `cdkd orphan`, `cdkd scrub`) each owe their own classification; `cdkd orphan`
|
|
24365
|
-
*
|
|
24366
|
-
*
|
|
24432
|
+
* answers through its own entry point on this class,
|
|
24433
|
+
* {@link refuseMalformedResourceEntriesForOrphan}, scoped to the records its
|
|
24434
|
+
* save keeps (go-to-k/cdkd#3350).
|
|
24367
24435
|
*
|
|
24368
24436
|
* So the entry rule is OPT-IN, taken by a flow that dereferences EVERY entry and
|
|
24369
24437
|
* writes the record back.
|
|
@@ -24503,6 +24571,171 @@ function malformedResourceEntriesRefusalMessage(rawStackName, rawRegion, logical
|
|
|
24503
24571
|
const region = absentIfEmpty(rawRegion);
|
|
24504
24572
|
return `${namedEntriesClause(stackName, region, logicalIds)} This command can WRITE state, so it refuses rather than skipping them: saving over the record would report a clean run for entries nothing could read, and would leave the next command to fail on them with no more to go on. Nothing was locked, read from AWS or written FOR THIS STACK. Inspect it with: ` + inspectCommand(stackName, region);
|
|
24505
24573
|
}
|
|
24574
|
+
/**
|
|
24575
|
+
* For `cdkd orphan`: refuse a record whose SURVIVING `resources` entries are
|
|
24576
|
+
* not readable resource records (go-to-k/cdkd#3350).
|
|
24577
|
+
*
|
|
24578
|
+
* The ENTRY class's predicate ({@link unreadableResourceEntries}), scoped to
|
|
24579
|
+
* the survivors exactly as the `properties` refusal is: an entry this run
|
|
24580
|
+
* DROPS is never saved, and `cdkd orphan` over the damaged record is the way
|
|
24581
|
+
* out of it, so the orphan set is subtracted. The drop is safe because the
|
|
24582
|
+
* rewriter will not RESOLVE a reference through an unreadable orphaned record —
|
|
24583
|
+
* it reports the site as unresolvable instead (`src/analyzer/orphan-rewriter.ts`).
|
|
24584
|
+
*
|
|
24585
|
+
* A second entry point on the class rather than a widening of
|
|
24586
|
+
* {@link refuseMalformedResourceEntries}, whose text says nothing was LOCKED —
|
|
24587
|
+
* false here, where the lock is taken before the load — and names no way out.
|
|
24588
|
+
*/
|
|
24589
|
+
function refuseMalformedResourceEntriesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
|
|
24590
|
+
const removed = new Set(removedLogicalIds);
|
|
24591
|
+
const unreadable = unreadableResourceEntries(state).filter((id) => !removed.has(id));
|
|
24592
|
+
if (unreadable.length === 0) return;
|
|
24593
|
+
throw new CdkdError(malformedOrphanResourceEntriesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
|
|
24594
|
+
}
|
|
24595
|
+
/**
|
|
24596
|
+
* The text {@link refuseMalformedResourceEntriesForOrphan} raises.
|
|
24597
|
+
*
|
|
24598
|
+
* **This is the one container the save RESHAPES**, so the `properties`
|
|
24599
|
+
* refusal's "carried through VERBATIM" must not be borrowed. Measured through
|
|
24600
|
+
* the real rewrite, which rebuilds each kept record as
|
|
24601
|
+
* `{ ...resource, properties, dependencies }`: `"abcdef"` saved as
|
|
24602
|
+
* `{"0":"a",…,"5":"f","dependencies":[]}`, `5` and `true` as
|
|
24603
|
+
* `{"dependencies":[]}` (no `physicalId` at all), `[{"Ref":"O"}]` as
|
|
24604
|
+
* `{"0":{"Ref":"O"},"dependencies":[]}` with the reference to the orphan left
|
|
24605
|
+
* UNREWRITTEN — the failure this command exists to prevent — and `null` threw
|
|
24606
|
+
* `Cannot read properties of null`. An object with no `resourceType` is the
|
|
24607
|
+
* one shape carried as it stands.
|
|
24608
|
+
*/
|
|
24609
|
+
function malformedOrphanResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
24610
|
+
const stackName = absentIfEmpty(rawStackName);
|
|
24611
|
+
const region = absentIfEmpty(rawRegion);
|
|
24612
|
+
return orphanRefusal(stackName, region, recovery, `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses. The rewrite rebuilds each kept record by copying its fields, and a value that is not an object does not survive the copy: a string or a list is saved as one key per character or element — a list's references to an orphaned resource left UNREWRITTEN — a number or a boolean as a record with no physical id, and null stops the run on a bare TypeError. An object with no resource type is saved as it stands. Continuing would save a record no cdkd command wrote and report success.`, SURVIVOR_THIRD_WAY_OUT);
|
|
24613
|
+
}
|
|
24614
|
+
/**
|
|
24615
|
+
* Whether an ENTRY's `attributes` map — the `Fn::GetAtt` cache — can be read.
|
|
24616
|
+
*
|
|
24617
|
+
* ABSENT IS READABLE: the field is optional on `ResourceState` and plenty of
|
|
24618
|
+
* records carry none. `null` is NOT, the split {@link hasReadableOutputs}
|
|
24619
|
+
* draws for its own container: the resolver's cached-attribute read gates on
|
|
24620
|
+
* `!== undefined` and then indexes the map, so a `null` passes the gate and a
|
|
24621
|
+
* string or a list answers for keys it does not hold.
|
|
24622
|
+
*/
|
|
24623
|
+
function hasReadableAttributes(entry) {
|
|
24624
|
+
const attributes = entry.attributes;
|
|
24625
|
+
return attributes === void 0 || isReadableBag(attributes);
|
|
24626
|
+
}
|
|
24627
|
+
/**
|
|
24628
|
+
* The logical ids whose `resources` entry carries an `attributes` map that
|
|
24629
|
+
* cannot be read (go-to-k/cdkd#3345). Like {@link unreadableResourcePropertyBags}
|
|
24630
|
+
* it skips an entry that is not an object — that is the ENTRY class's to name —
|
|
24631
|
+
* and returns `[]` for an unreadable bag.
|
|
24632
|
+
*/
|
|
24633
|
+
function unreadableResourceAttributeBags(state) {
|
|
24634
|
+
if (!hasReadableResources(state)) return [];
|
|
24635
|
+
return Object.entries(state.resources).filter(([, entry]) => isReadableBag(entry) && !hasReadableAttributes(entry)).map(([logicalId]) => logicalId);
|
|
24636
|
+
}
|
|
24637
|
+
/**
|
|
24638
|
+
* For `cdkd orphan`: refuse a record whose SURVIVING entries carry an
|
|
24639
|
+
* unreadable `attributes` map (go-to-k/cdkd#3345). Scoped to the survivors for
|
|
24640
|
+
* the reason {@link refuseMalformedResourceEntriesForOrphan} is; an ORPHANED
|
|
24641
|
+
* entry's map is the `--force` cache, and the rewriter reads that one as
|
|
24642
|
+
* holding nothing instead of indexing it.
|
|
24643
|
+
*/
|
|
24644
|
+
function refuseMalformedResourceAttributesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
|
|
24645
|
+
const removed = new Set(removedLogicalIds);
|
|
24646
|
+
const unreadable = unreadableResourceAttributeBags(state).filter((id) => !removed.has(id));
|
|
24647
|
+
if (unreadable.length === 0) return;
|
|
24648
|
+
throw new CdkdError(malformedOrphanResourceAttributesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
|
|
24649
|
+
}
|
|
24650
|
+
/**
|
|
24651
|
+
* The text {@link refuseMalformedResourceAttributesForOrphan} raises.
|
|
24652
|
+
*
|
|
24653
|
+
* Measured through the real rewrite: `"abcdef"`, `5`, `0`, `""`, `false` and
|
|
24654
|
+
* `null` are carried into the save byte for byte (the falsy ones skip
|
|
24655
|
+
* `rewriteValue` and survive through the spread), and `[{"Ref":"O"}]` is
|
|
24656
|
+
* WALKED, coming back `["<physical id>"]` — a rewrite recorded into a container
|
|
24657
|
+
* that is still not a map, the `properties` refusal's list case one field over.
|
|
24658
|
+
*/
|
|
24659
|
+
function malformedOrphanResourceAttributesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
24660
|
+
const stackName = absentIfEmpty(rawStackName);
|
|
24661
|
+
const region = absentIfEmpty(rawRegion);
|
|
24662
|
+
const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
|
|
24663
|
+
const rest = logicalIds.length - NAMED_UNREADABLE_ENTRIES;
|
|
24664
|
+
const more = rest > 0 ? ` and ${rest} more` : "";
|
|
24665
|
+
return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} holds ${logicalIds.length} resource record(s) whose 'attributes' map cannot be read — ${named}${more} — because it is null or not an object. The record is malformed or truncated. 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses. The map is carried into the save VERBATIM, and a list is walked, so its rewrites are recorded into a container that is still not a map. It is the cache a later 'cdkd deploy' reads another resource's 'Fn::GetAtt' of this one from, so continuing would report success over the one map that read depends on.`, SURVIVOR_THIRD_WAY_OUT);
|
|
24666
|
+
}
|
|
24667
|
+
/**
|
|
24668
|
+
* The `orphans[]` records a reader cannot use: a record that is not an object
|
|
24669
|
+
* or has no string `logicalId`, whose `state` is not a readable resource entry,
|
|
24670
|
+
* or whose `state` carries an unreadable `properties` or `attributes` map
|
|
24671
|
+
* (go-to-k/cdkd#3344). The `logicalId` half is go-to-k/cdkd#3500's row
|
|
24672
|
+
* predicate: rows with none all key one map entry, and `orphansAfterRollback`
|
|
24673
|
+
* collapses them into one.
|
|
24674
|
+
*
|
|
24675
|
+
* Every `ResourceState` question the `resources` side answers in separate
|
|
24676
|
+
* predicates, asked in ONE here: a rollback-orphan record is reached only as a
|
|
24677
|
+
* whole — `computeStackDiff` and the deploy's adoption pass splice the record
|
|
24678
|
+
* into `resources` — so which part of it is torn does not change what a caller
|
|
24679
|
+
* can do with it. Returns `[]` for a container that is not a list, which is
|
|
24680
|
+
* {@link hasReadableOrphans}'s to report. Each record is named by its
|
|
24681
|
+
* `logicalId`, or `''` (rendered as the `UNRENDERABLE` stand-in) when it has
|
|
24682
|
+
* no string one — the convention {@link malformedOrphanRecordsWarning} takes.
|
|
24683
|
+
*/
|
|
24684
|
+
function unreadableOrphanRecords(state) {
|
|
24685
|
+
if (!Array.isArray(state.orphans)) return [];
|
|
24686
|
+
return state.orphans.filter((record) => {
|
|
24687
|
+
if (!isReadableBag(record)) return true;
|
|
24688
|
+
if (typeof record.logicalId !== "string") return true;
|
|
24689
|
+
const entry = record.state;
|
|
24690
|
+
return !isReadableResourceEntry(entry) || !isReadableBag(entry.properties) || !hasReadableAttributes(entry);
|
|
24691
|
+
}).map((record) => {
|
|
24692
|
+
const id = isReadableBag(record) ? record.logicalId : void 0;
|
|
24693
|
+
return typeof id === "string" ? id : "";
|
|
24694
|
+
});
|
|
24695
|
+
}
|
|
24696
|
+
/**
|
|
24697
|
+
* For `cdkd orphan`: refuse a record whose `orphans` list, or any record in
|
|
24698
|
+
* it, cannot be read (go-to-k/cdkd#3344).
|
|
24699
|
+
*
|
|
24700
|
+
* A THIRD entry point on the `orphans` container, beside
|
|
24701
|
+
* {@link refuseMalformedOrphans} and its destroy twin, because neither text is
|
|
24702
|
+
* true here. The rewrite neither walks nor rebuilds this container — it
|
|
24703
|
+
* spreads it through `carriedState` VERBATIM (measured: `"abc"` comes back
|
|
24704
|
+
* `"abc"`, a record whose `state.properties` is `"abcdef"` comes back byte for
|
|
24705
|
+
* byte) — so the rollback text's "written back as a list of character-shaped
|
|
24706
|
+
* orphan records" would be false. What this command does is SAVE it, report
|
|
24707
|
+
* success, and leave the damage for the next deploy or diff to meet.
|
|
24708
|
+
*
|
|
24709
|
+
* NOT scoped by the orphan set: these records are not in `resources`, so
|
|
24710
|
+
* `cdkd orphan` cannot name one, and its save keeps every one of them.
|
|
24711
|
+
*/
|
|
24712
|
+
function refuseMalformedOrphansForOrphan(state, stackName, region, recovery) {
|
|
24713
|
+
if (!hasReadableOrphans(state)) throw new CdkdError(malformedOrphansForOrphanRefusalMessage(stackName, region, void 0, recovery), STATE_RESOURCES_MALFORMED);
|
|
24714
|
+
const unreadable = unreadableOrphanRecords(state);
|
|
24715
|
+
if (unreadable.length === 0) return;
|
|
24716
|
+
throw new CdkdError(malformedOrphansForOrphanRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
|
|
24717
|
+
}
|
|
24718
|
+
/** See {@link orphanRefusal}'s `dropCaveat`. */
|
|
24719
|
+
const ORPHANS_DROP_CAVEAT = "; it also discards the 'orphans' list, the only record of resources an earlier failed deploy left live in AWS";
|
|
24720
|
+
/**
|
|
24721
|
+
* The text {@link refuseMalformedOrphansForOrphan} raises: the CONTAINER arm
|
|
24722
|
+
* when `logicalIds` is `undefined`, the RECORDS arm otherwise.
|
|
24723
|
+
*
|
|
24724
|
+
* Its third way out is not {@link SURVIVOR_THIRD_WAY_OUT}: a record in
|
|
24725
|
+
* `orphans` has no construct path, so `cdkd orphan` cannot remove it, and the
|
|
24726
|
+
* hand repair that remains must not be a deletion — the record is the only
|
|
24727
|
+
* evidence that an earlier failed deploy left its resource live in AWS.
|
|
24728
|
+
*/
|
|
24729
|
+
function malformedOrphansForOrphanRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
24730
|
+
const stackName = absentIfEmpty(rawStackName);
|
|
24731
|
+
const region = absentIfEmpty(rawRegion);
|
|
24732
|
+
const verbatim = "'cdkd orphan' carries it into the record it saves VERBATIM, without reading it, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses.";
|
|
24733
|
+
if (logicalIds === void 0) return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. ${verbatim} The next 'cdkd deploy' refuses the same record, so continuing would only report success over it and leave that refusal one command later.`, "'cdkd orphan' cannot address this list at all, and rewriting it to [] by hand discards the only record of resources an earlier failed deploy left live in AWS.", ORPHANS_DROP_CAVEAT);
|
|
24734
|
+
const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
|
|
24735
|
+
const rest = logicalIds.length - NAMED_UNREADABLE_ENTRIES;
|
|
24736
|
+
const more = rest > 0 ? ` and ${rest} more` : "";
|
|
24737
|
+
return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read — ${named}${more} — because the record has no string 'logicalId', its 'state' is not an object or names no resource type, or that state's 'properties' or 'attributes' map is not one. The record is malformed or truncated. ${verbatim} Those records are not inert: they are what the next 'cdkd deploy' may re-adopt into 'resources' and what 'cdkd diff' previews for adoption, so continuing would report success over damage the next command meets.`, "'cdkd orphan' cannot remove such a record itself: it is not in 'resources', so it has no construct path. Repair the record by hand rather than deleting it — it is the only record that an earlier failed deploy left its resource live in AWS.", ORPHANS_DROP_CAVEAT);
|
|
24738
|
+
}
|
|
24506
24739
|
|
|
24507
24740
|
//#endregion
|
|
24508
24741
|
//#region src/analyzer/diff-calculator.ts
|
|
@@ -29973,7 +30206,8 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
29973
30206
|
if (carriedBefore === 0) return;
|
|
29974
30207
|
if (inheritedSecretsCarriedBy(this.coerceParameterValue(userValue, paramDef.Type), inherited).length >= carriedBefore) return;
|
|
29975
30208
|
const loggedName = this.displayMasked(name);
|
|
29976
|
-
|
|
30209
|
+
const loggedType = this.displayMasked(paramDef.Type);
|
|
30210
|
+
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Nested-stack parameter '${loggedName}' is declared 'Type: ${loggedType}', but the parent stack resolved a SECRET dynamic reference into it. cdkd keeps a resolved secret out of persisted state by rewriting STRING leaves back to their {{resolve:...}} expression; coercing this value to '${loggedType}' destroys the plaintext cdkd would have matched on, so the DECRYPTED secret would be left in the child stack's state.json with nothing to redact it back to. Declare '${loggedName}' as 'Type: String' in the nested stack's template (CDK does this by default for cross-stack references), or stop passing a secret reference into it.`, void 0, "NESTED_STACK_SECRET_PARAMETER_TYPE"));
|
|
29977
30211
|
}
|
|
29978
30212
|
/**
|
|
29979
30213
|
* Resolve Ref intrinsic function
|
|
@@ -29987,7 +30221,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
29987
30221
|
const resource = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
|
|
29988
30222
|
if (resource) {
|
|
29989
30223
|
const refValue = this.resolveRefValue(logicalId, resource, context);
|
|
29990
|
-
this.logger.debug(`Resolved Ref to resource: ${this.displayMasked(logicalId, context)} -> ${refValue}`);
|
|
30224
|
+
this.logger.debug(`Resolved Ref to resource: ${this.displayMasked(logicalId, context)} -> ${this.displayMasked(String(refValue), context)}`);
|
|
29991
30225
|
return refValue;
|
|
29992
30226
|
}
|
|
29993
30227
|
if (context.parameters && Object.hasOwn(context.parameters, logicalId)) {
|
|
@@ -30001,7 +30235,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30001
30235
|
const pseudoValue = await this.resolvePseudoParameter(logicalId, context);
|
|
30002
30236
|
if (pseudoValue !== void 0) {
|
|
30003
30237
|
const valueStr = typeof pseudoValue === "symbol" ? pseudoValue.toString() : String(pseudoValue);
|
|
30004
|
-
this.logger.debug(`Resolved Ref to pseudo parameter: ${logicalId} -> ${valueStr}`);
|
|
30238
|
+
this.logger.debug(`Resolved Ref to pseudo parameter: ${logicalId} -> ${this.displayMasked(valueStr, context)}`);
|
|
30005
30239
|
return pseudoValue;
|
|
30006
30240
|
}
|
|
30007
30241
|
const loggedLogicalId = this.displayMasked(logicalId, context);
|
|
@@ -30174,7 +30408,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30174
30408
|
attributeName = resolvedAttributeName;
|
|
30175
30409
|
} else {
|
|
30176
30410
|
const split = splitGetAttStringForm(getAtt);
|
|
30177
|
-
if (split === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Invalid Fn::GetAtt format: ${getAtt}`));
|
|
30411
|
+
if (split === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Invalid Fn::GetAtt format: ${this.displayMasked(getAtt, context)}`));
|
|
30178
30412
|
logicalId = split.logicalId;
|
|
30179
30413
|
attributeName = split.attributeName;
|
|
30180
30414
|
}
|
|
@@ -30259,8 +30493,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30259
30493
|
* which reads the SAME persisted `attributes` bag and shipped without the
|
|
30260
30494
|
* note (it takes it now). The rule the note actually needs is about the
|
|
30261
30495
|
* SOURCE of the value — every branch serving one out of a PERSISTED
|
|
30262
|
-
* `attributes` bag must call this
|
|
30263
|
-
*
|
|
30496
|
+
* `attributes` bag must call this, and so must one serving (or embedding) a
|
|
30497
|
+
* persisted `properties` leaf, which a mask-only needle masks whole
|
|
30498
|
+
* (go-to-k/cdkd#2936: the VPC `CidrBlock` and Events rule `Arn` arms) — and
|
|
30499
|
+
* that is not a shape a compiler can enforce. `constructGuardedAttribute`'s return is deliberately outside it:
|
|
30264
30500
|
* that value is fetched from AWS in this run, not read back from state, so
|
|
30265
30501
|
* it can be neither a stale mask nor a value a provider declared `NoEcho`.
|
|
30266
30502
|
*
|
|
@@ -30348,7 +30584,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30348
30584
|
* predate the enrichment and `cdkd deploy` is what heals it.
|
|
30349
30585
|
*/
|
|
30350
30586
|
unenrichedRemedy(resourceType, attributeName, outcome, context) {
|
|
30351
|
-
const fileIssue = `Avoid this Fn::GetAtt, or file an issue at https://github.com/go-to-k/cdkd/issues so cdkd can enrich ${resourceType}.${this.displayMasked(attributeName, context)}.`;
|
|
30587
|
+
const fileIssue = `Avoid this Fn::GetAtt, or file an issue at https://github.com/go-to-k/cdkd/issues so cdkd can enrich ${this.displayMasked(resourceType, context)}.${this.displayMasked(attributeName, context)}.`;
|
|
30352
30588
|
if (outcome === void 0) return `If this record was written by an older cdkd that did not record the attribute yet, 'cdkd deploy' re-reads it from AWS and heals the record. ${fileIssue}`;
|
|
30353
30589
|
if (outcome.kind === "read") {
|
|
30354
30590
|
if (this.healWithheld(outcome, attributeName)) return this.withheldRemedy();
|
|
@@ -30491,7 +30727,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30491
30727
|
async constructGuardedAttribute(resource, attributeName, context, logicalId) {
|
|
30492
30728
|
const accountInfo = await getAccountInfo(this.resolverRegion);
|
|
30493
30729
|
const value = await this.constructAttribute(resource, attributeName, context, logicalId, accountInfo);
|
|
30494
|
-
if (accountInfo.fabricated && embedsAccountId(value, accountInfo.accountId)) throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: STS did not report this deploy's account id, so cdkd would build the value from the placeholder account ${accountInfo.accountId} — structurally valid, naming a different account, and indistinguishable downstream from a real one. Fix the AWS credentials (or set AWS_ACCOUNT_ID to this deploy's account) and deploy again.`);
|
|
30730
|
+
if (accountInfo.fabricated && embedsAccountId(value, accountInfo.accountId)) throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${this.displayMasked(resource.resourceType, context)}: STS did not report this deploy's account id, so cdkd would build the value from the placeholder account ${accountInfo.accountId} — structurally valid, naming a different account, and indistinguishable downstream from a real one. Fix the AWS credentials (or set AWS_ACCOUNT_ID to this deploy's account) and deploy again.`);
|
|
30495
30731
|
return value;
|
|
30496
30732
|
}
|
|
30497
30733
|
/**
|
|
@@ -30528,28 +30764,29 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30528
30764
|
}
|
|
30529
30765
|
if (resourceType === "AWS::EC2::VPC") switch (attributeName) {
|
|
30530
30766
|
case "VpcId": return physicalId;
|
|
30531
|
-
case "CidrBlock": return resource.attributes?.["CidrBlock"] || resource.properties?.["CidrBlock"];
|
|
30767
|
+
case "CidrBlock": return this.noteAttributeSecrecy(logicalId, attributeName, resource.attributes?.["CidrBlock"] || resource.properties?.["CidrBlock"], context);
|
|
30532
30768
|
case "Ipv6CidrBlocks": try {
|
|
30533
30769
|
const ec2 = this.clientsForRegion(this.explicitRegion).ec2;
|
|
30534
30770
|
const maxAttempts = 15;
|
|
30771
|
+
const loggedId = this.displayMasked(String(physicalId), context);
|
|
30535
30772
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
30536
30773
|
const associations = (await ec2.send(new DescribeVpcsCommand({ VpcIds: [physicalId] }))).Vpcs?.[0]?.Ipv6CidrBlockAssociationSet || [];
|
|
30537
30774
|
const blocks = associations.filter((a) => a.Ipv6CidrBlockState?.State === "associated").map((a) => a.Ipv6CidrBlock);
|
|
30538
30775
|
if (blocks.length > 0) {
|
|
30539
|
-
this.logger.debug(`Resolved VPC Ipv6CidrBlocks for ${
|
|
30776
|
+
this.logger.debug(`Resolved VPC Ipv6CidrBlocks for ${loggedId}: ${this.displayMasked(JSON.stringify(this.maskValueLeaves(blocks, context)), context)}`);
|
|
30540
30777
|
return blocks;
|
|
30541
30778
|
}
|
|
30542
30779
|
if (associations.filter((a) => a.Ipv6CidrBlockState?.State === "associating").length === 0) {
|
|
30543
|
-
this.logger.debug(`No IPv6 CIDR associations found for VPC ${
|
|
30780
|
+
this.logger.debug(`No IPv6 CIDR associations found for VPC ${loggedId}`);
|
|
30544
30781
|
return [];
|
|
30545
30782
|
}
|
|
30546
|
-
this.logger.debug(`VPC ${
|
|
30783
|
+
this.logger.debug(`VPC ${loggedId} IPv6 CIDR still associating (attempt ${attempt}/${maxAttempts}), waiting...`);
|
|
30547
30784
|
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
30548
30785
|
}
|
|
30549
|
-
this.logger.warn(`VPC ${
|
|
30786
|
+
this.logger.warn(`VPC ${loggedId} IPv6 CIDR did not reach 'associated' state after ${maxAttempts} attempts`);
|
|
30550
30787
|
return [];
|
|
30551
30788
|
} catch (error) {
|
|
30552
|
-
this.logger.warn(`Failed to fetch VPC Ipv6CidrBlocks for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
30789
|
+
this.logger.warn(`Failed to fetch VPC Ipv6CidrBlocks for ${this.displayMasked(String(physicalId), context)}: ${this.displayMasked(error instanceof Error ? error.message : String(error), context)}`);
|
|
30553
30790
|
return [];
|
|
30554
30791
|
}
|
|
30555
30792
|
case "DefaultSecurityGroup": {
|
|
@@ -30626,7 +30863,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30626
30863
|
if (resourceType === "AWS::Events::Rule") switch (attributeName) {
|
|
30627
30864
|
case "Arn": {
|
|
30628
30865
|
if (physicalId.startsWith("arn:")) return physicalId;
|
|
30629
|
-
const busRaw = resource.properties?.["EventBusName"];
|
|
30866
|
+
const busRaw = this.noteAttributeSecrecy(logicalId, attributeName, resource.properties?.["EventBusName"], context);
|
|
30630
30867
|
const bus = typeof busRaw === "string" && busRaw && busRaw !== "default" ? busRaw : "";
|
|
30631
30868
|
const busName = bus.startsWith("arn:") ? bus.split("/").pop() || "" : bus;
|
|
30632
30869
|
return busName ? `arn:${partition}:events:${region}:${accountId}:rule/${busName}/${physicalId}` : `arn:${partition}:events:${region}:${accountId}:rule/${physicalId}`;
|
|
@@ -30674,7 +30911,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30674
30911
|
const { GetNamespaceCommand } = await import("@aws-sdk/client-servicediscovery");
|
|
30675
30912
|
return (await (await this.serviceDiscoveryClient()).send(new GetNamespaceCommand({ Id: physicalId }))).Namespace?.Properties?.DnsProperties?.HostedZoneId;
|
|
30676
30913
|
} catch (error) {
|
|
30677
|
-
this.logger.warn(`Failed to fetch HostedZoneId for namespace ${physicalId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
30914
|
+
this.logger.warn(`Failed to fetch HostedZoneId for namespace ${this.displayMasked(String(physicalId), context)}: ${this.displayMasked(error instanceof Error ? error.message : String(error), context)}`);
|
|
30678
30915
|
return;
|
|
30679
30916
|
}
|
|
30680
30917
|
default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
|
|
@@ -30875,7 +31112,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30875
31112
|
const value = attributeName === "LatestVersionNumber" ? lt?.LatestVersionNumber : lt?.DefaultVersionNumber;
|
|
30876
31113
|
if (value !== void 0 && value !== null) return String(value);
|
|
30877
31114
|
} catch (err) {
|
|
30878
|
-
this.logger.warn(`DescribeLaunchTemplates(${physicalId}) failed for ${this.displayMasked(attributeName, context)}: ${this.displayMasked(err instanceof Error ? err.message : String(err), context)}`);
|
|
31115
|
+
this.logger.warn(`DescribeLaunchTemplates(${this.displayMasked(String(physicalId), context)}) failed for ${this.displayMasked(attributeName, context)}: ${this.displayMasked(err instanceof Error ? err.message : String(err), context)}`);
|
|
30879
31116
|
}
|
|
30880
31117
|
return attributeName === "LatestVersionNumber" ? "$Latest" : "$Default";
|
|
30881
31118
|
}
|
|
@@ -30982,7 +31219,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
30982
31219
|
*/
|
|
30983
31220
|
refuseUnservedAttribute(site) {
|
|
30984
31221
|
const { logicalId, attributeName, resourceType, physicalId, context, observed, remedy } = site;
|
|
30985
|
-
throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resourceType}: ${observed}. The physical id "${this.displayMasked(physicalId, context)}" is not a usable ${this.displayMasked(attributeName, context)}, so cdkd refuses to substitute it. ${remedy}`);
|
|
31222
|
+
throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${this.displayMasked(resourceType, context)}: ${observed}. The physical id "${this.displayMasked(physicalId, context)}" is not a usable ${this.displayMasked(attributeName, context)}, so cdkd refuses to substitute it. ${remedy}`);
|
|
30986
31223
|
}
|
|
30987
31224
|
/**
|
|
30988
31225
|
* The `observed` clause of {@link refuseUnservedAttribute} for a live read
|
|
@@ -31028,20 +31265,21 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31028
31265
|
if (context?.staleAttributeHeal?.phase === "probe") throw new StaleAttributeMissSignal();
|
|
31029
31266
|
const healOutcome = context?.staleAttributeHeal?.phase === "settled" ? context.staleAttributeHeal.outcome : void 0;
|
|
31030
31267
|
const recordMayBeStale = healOutcome?.kind === "failed" || healOutcome?.kind === "not-found";
|
|
31268
|
+
const loggedType = this.displayMasked(resourceType, context);
|
|
31031
31269
|
const expectsArnShape = attributeName.endsWith("Arn") && !physicalId.startsWith("arn:");
|
|
31032
31270
|
const expectsUrlShape = attributeName.endsWith("Url") && !/^https?:\/\//.test(physicalId);
|
|
31033
31271
|
if (expectsArnShape || expectsUrlShape) {
|
|
31034
31272
|
const expectedShape = expectsArnShape ? "an ARN (arn:...)" : "a URL (http(s)://...)";
|
|
31035
|
-
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${
|
|
31273
|
+
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${loggedType}: ` + (recordMayBeStale ? `the state record holds no value for it, and the physical ID ` : `attributes are not enriched for this resource type, and the physical ID `) + `fallback "${this.displayMasked(physicalId, context)}" is not ${expectedShape}. CloudFormation would return a different value here, so falling back to the physical ID would silently produce a wrong value (e.g. in stack Outputs). ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
|
|
31036
31274
|
}
|
|
31037
|
-
if (this.strictGetAtt) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${
|
|
31275
|
+
if (this.strictGetAtt) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${loggedType}: ` + (recordMayBeStale ? `the state record holds no value for it, and --strict-getatt ` : `attributes are not enriched for this resource type, and --strict-getatt `) + `rejects the physical ID fallback "${this.displayMasked(physicalId, context)}" (which may not be the value CloudFormation would return). Drop --strict-getatt to fall back with a warning. ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
|
|
31038
31276
|
this.physicalIdFallbackCount++;
|
|
31039
31277
|
if (recordMayBeStale) {
|
|
31040
|
-
this.logger.warn(`The state record for ${this.displayMasked(logicalId, context)} (${
|
|
31278
|
+
this.logger.warn(`The state record for ${this.displayMasked(logicalId, context)} (${loggedType}) holds no ${this.displayMasked(attributeName, context)}, returning physical ID. ` + this.staleRecordRemedy(healOutcome, context));
|
|
31041
31279
|
return physicalId;
|
|
31042
31280
|
}
|
|
31043
31281
|
const withheld = healOutcome?.kind === "read" && this.healWithheld(healOutcome, attributeName) ? `. ${this.withheldRemedy()}` : "";
|
|
31044
|
-
this.logger.warn(`Unknown attribute ${this.displayMasked(attributeName, context)} for resource type ${
|
|
31282
|
+
this.logger.warn(`Unknown attribute ${this.displayMasked(attributeName, context)} for resource type ${loggedType}, returning physical ID${withheld}`);
|
|
31045
31283
|
return physicalId;
|
|
31046
31284
|
}
|
|
31047
31285
|
/**
|
|
@@ -31375,11 +31613,11 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31375
31613
|
const resolvedList = await this.resolveValue(list, context);
|
|
31376
31614
|
if (!Array.isArray(resolvedList)) throw new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`);
|
|
31377
31615
|
if (index < 0 || index >= resolvedList.length) {
|
|
31378
|
-
this.logger.warn(`Fn::Select: index ${index} out of bounds (array length: ${resolvedList.length})`);
|
|
31616
|
+
this.logger.warn(`Fn::Select: index ${this.displayMasked(String(index), context)} out of bounds (array length: ${resolvedList.length})`);
|
|
31379
31617
|
return `{{Fn::Select:${index}:OutOfBounds}}`;
|
|
31380
31618
|
}
|
|
31381
31619
|
const result = resolvedList[index];
|
|
31382
|
-
this.logger.debug(`Resolved Fn::Select: index ${index} -> ${JSON.stringify(this.maskValueLeaves(result, context))}`);
|
|
31620
|
+
this.logger.debug(`Resolved Fn::Select: index ${this.displayMasked(String(index), context)} -> ${JSON.stringify(this.maskValueLeaves(result, context))}`);
|
|
31383
31621
|
return result;
|
|
31384
31622
|
}
|
|
31385
31623
|
/**
|
|
@@ -31524,7 +31762,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31524
31762
|
}
|
|
31525
31763
|
const result = resolvedValue.split(delimiter);
|
|
31526
31764
|
const pieceTwins = this.splitLogTwins(resolvedValue, delimiter, result, context);
|
|
31527
|
-
this.logger.debug(`Resolved Fn::Split: split by "${delimiter}" -> ${JSON.stringify(this.maskValueLeaves(pieceTwins, context))}`);
|
|
31765
|
+
this.logger.debug(`Resolved Fn::Split: split by "${this.displayMasked(String(delimiter), context)}" -> ${JSON.stringify(this.maskValueLeaves(pieceTwins, context))}`);
|
|
31528
31766
|
return result;
|
|
31529
31767
|
}
|
|
31530
31768
|
/**
|
|
@@ -32121,7 +32359,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
32121
32359
|
let roleArn;
|
|
32122
32360
|
if ("RoleArn" in args && args["RoleArn"] !== void 0 && args["RoleArn"] !== null) {
|
|
32123
32361
|
const raw = args["RoleArn"];
|
|
32124
|
-
if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${JSON.stringify(raw).slice(0, 80)})` : ""}.`);
|
|
32362
|
+
if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`);
|
|
32125
32363
|
roleArn = raw;
|
|
32126
32364
|
}
|
|
32127
32365
|
if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack '${this.displayMasked(stackName, context)}' in the same region '${this.displayMasked(loggedRegionText, context)}'`);
|
|
@@ -32265,7 +32503,15 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
32265
32503
|
* {@link positionalNameMask} turns them into the transform and owns why.
|
|
32266
32504
|
*/
|
|
32267
32505
|
maskStateReadError(error, pairs, context) {
|
|
32268
|
-
|
|
32506
|
+
throw this.maskNamedError(error, this.positionalNameMask(pairs), context);
|
|
32507
|
+
}
|
|
32508
|
+
/**
|
|
32509
|
+
* {@link maskStateReadError}'s body, RETURNING the masked clone rather than
|
|
32510
|
+
* throwing it, so {@link namedRequestMasks} can hand the same answer to an
|
|
32511
|
+
* SDK call site (go-to-k/cdkd#3171). `extraMask` is a
|
|
32512
|
+
* {@link positionalNameMask} transform, or `undefined` for none.
|
|
32513
|
+
*/
|
|
32514
|
+
maskNamedError(error, extraMask, context) {
|
|
32269
32515
|
let masked = error;
|
|
32270
32516
|
let positional = extraMask;
|
|
32271
32517
|
for (const bag of [context?.inheritedSecrets, context?.recordedSecretValues]) {
|
|
@@ -32274,7 +32520,57 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
32274
32520
|
positional = void 0;
|
|
32275
32521
|
}
|
|
32276
32522
|
if (positional) masked = maskSecretsInError(masked, /* @__PURE__ */ new Map(), positional);
|
|
32277
|
-
|
|
32523
|
+
return masked;
|
|
32524
|
+
}
|
|
32525
|
+
/**
|
|
32526
|
+
* The three masks an AWS SDK call site owes the text the SDK produces about a
|
|
32527
|
+
* request that carried template-derived NAMES (go-to-k/cdkd#3171).
|
|
32528
|
+
*
|
|
32529
|
+
* The resolver masks every name it prints ITSELF through the name's log text
|
|
32530
|
+
* (go-to-k/cdkd#3150), but an SDK rejection QUOTES the name it refused back —
|
|
32531
|
+
* `ParameterNotFound: <name>`, a region in a describe failure — and that
|
|
32532
|
+
* text reached only the needle mask, whose substring arm has the
|
|
32533
|
+
* {@link MIN_NEEDLE_LENGTH} floor. A name an `Fn::Sub` assembled around a
|
|
32534
|
+
* 1-3 character secret printed masked in the resolver's own words and in the
|
|
32535
|
+
* clear a few characters later, in the SDK's.
|
|
32536
|
+
*
|
|
32537
|
+
* `pairs` are (raw name as SENT, that name's log text), the same shape
|
|
32538
|
+
* {@link positionalNameMask} takes and for the same reason; an unmasked pair
|
|
32539
|
+
* is dropped there. ONE helper returning all three, so a call site cannot
|
|
32540
|
+
* adopt one and miss the others:
|
|
32541
|
+
*
|
|
32542
|
+
* - `error` — a masked CLONE of the whole cause chain
|
|
32543
|
+
* ({@link maskNamedError}), which keeps the class and every own descriptor,
|
|
32544
|
+
* so `isThrottlingError` / `isMarkedNonRetryable` still classify it;
|
|
32545
|
+
* - `text` — a caught message about to be interpolated into a line or a
|
|
32546
|
+
* throw, positional pass first, then {@link displayMasked};
|
|
32547
|
+
* - `retryLogger` — for `withRetry`, whose per-attempt `debug` line and
|
|
32548
|
+
* give-up `warn` interpolate the SDK message verbatim.
|
|
32549
|
+
*
|
|
32550
|
+
* THE WHOLE NAME is the key, never its secret span alone: the substitution
|
|
32551
|
+
* rewrites every occurrence of the raw name wherever the SDK put it (inside
|
|
32552
|
+
* an ARN, after a colon). That is what reaches a sub-floor secret — the
|
|
32553
|
+
* whole name is longer than the secret — and it is also the bound: a name
|
|
32554
|
+
* the SDK re-encodes or truncates before quoting it is not matched, and a
|
|
32555
|
+
* masked name of 1-3 characters is matched only where the SDK quotes it
|
|
32556
|
+
* exactly, which may over-mask unrelated text (the SAFE direction
|
|
32557
|
+
* {@link positionalNameMask} documents).
|
|
32558
|
+
*/
|
|
32559
|
+
namedRequestMasks(pairs, context) {
|
|
32560
|
+
const positional = this.positionalNameMask(this.explicitRegion !== void 0 && this.explicitRegionLogText !== void 0 ? [...pairs, [this.explicitRegion, this.explicitRegionLogText]] : pairs);
|
|
32561
|
+
const text = (message) => this.displayMasked(positional ? positional(message) : message, context);
|
|
32562
|
+
const line = (message) => {
|
|
32563
|
+
const indent = /^ */.exec(message)?.[0] ?? "";
|
|
32564
|
+
return indent + text(message.slice(indent.length));
|
|
32565
|
+
};
|
|
32566
|
+
return {
|
|
32567
|
+
error: (error) => this.maskNamedError(error, positional, context),
|
|
32568
|
+
text,
|
|
32569
|
+
retryLogger: {
|
|
32570
|
+
debug: (message) => this.logger.debug(line(message)),
|
|
32571
|
+
warn: (message) => this.logger.warn(line(message))
|
|
32572
|
+
}
|
|
32573
|
+
};
|
|
32278
32574
|
}
|
|
32279
32575
|
/**
|
|
32280
32576
|
* Read the producer's state from the SAME AWS account (no RoleArn).
|
|
@@ -32453,7 +32749,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
32453
32749
|
Values: ["available"]
|
|
32454
32750
|
}] }))).AvailabilityZones || []).map((az) => az.ZoneName).filter((name) => name !== void 0).sort();
|
|
32455
32751
|
} catch (error) {
|
|
32456
|
-
|
|
32752
|
+
const loggedRegion = this.displayMasked(loggedRegionText ?? region, context);
|
|
32753
|
+
const masks = this.namedRequestMasks([[region, loggedRegion]], context);
|
|
32754
|
+
throw new Error(`Fn::GetAZs: failed to describe availability zones for region '${loggedRegion}': ${masks.text(error instanceof Error ? error.message : String(error))}`);
|
|
32457
32755
|
}
|
|
32458
32756
|
if (azNames.length === 0) throw new Error(`Fn::GetAZs: no availability zones returned for region '${this.displayMasked(loggedRegionText ?? region, context)}'. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`);
|
|
32459
32757
|
cachedAvailabilityZones[region] = azNames;
|
|
@@ -32562,9 +32860,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
32562
32860
|
* One constructor for both walks so neither can grow a second masking rule:
|
|
32563
32861
|
* `subject` and `message` are the only fields a consumer may render, and each
|
|
32564
32862
|
* carries its own route to a plaintext — an assembled reference puts one in
|
|
32565
|
-
* the raw token (issue #2827), and an SDK rejection
|
|
32566
|
-
*
|
|
32567
|
-
*
|
|
32863
|
+
* the raw token (issue #2827), and an SDK rejection echoes the `Name` it was
|
|
32864
|
+
* handed — which `sendWithThrottleRetry` now masks by position before it
|
|
32865
|
+
* rethrows (go-to-k/cdkd#3171), so this is the second layer on that route.
|
|
32866
|
+
* `error` is not re-masked here and is documented as classification-only.
|
|
32568
32867
|
*/
|
|
32569
32868
|
abandonedUnit(unit, subject, error, context, rawInput, preRedact) {
|
|
32570
32869
|
const raw = error instanceof Error ? error.message : String(error);
|
|
@@ -33320,7 +33619,11 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
33320
33619
|
...versionStage && versionStage !== "" && { VersionStage: versionStage },
|
|
33321
33620
|
...versionId && versionId !== "" && { VersionId: versionId }
|
|
33322
33621
|
});
|
|
33323
|
-
const secretString = (await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}
|
|
33622
|
+
const secretString = (await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`, this.namedRequestMasks([
|
|
33623
|
+
[secretId, loggedSecretId],
|
|
33624
|
+
[versionStage, this.displayMasked(nameLogText(versionStage), context)],
|
|
33625
|
+
[versionId, this.displayMasked(nameLogText(versionId), context)]
|
|
33626
|
+
], context))).SecretString;
|
|
33324
33627
|
if (!secretString) throw new Error(`Dynamic reference: secret '${loggedSecretId}' does not contain a SecretString value`);
|
|
33325
33628
|
if (jsonKey) try {
|
|
33326
33629
|
const parsed = JSON.parse(secretString);
|
|
@@ -33355,7 +33658,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
33355
33658
|
const count = Number(await this.resolveValue(rawCount, context));
|
|
33356
33659
|
const cidrBits = Number(await this.resolveValue(rawCidrBits, context));
|
|
33357
33660
|
if (!ipBlock || typeof ipBlock !== "string") throw new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`);
|
|
33358
|
-
this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${count}, cidrBits=${cidrBits}`);
|
|
33661
|
+
this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${this.displayMasked(String(count), context)}, cidrBits=${this.displayMasked(String(cidrBits), context)}`);
|
|
33359
33662
|
const isIpv6 = ipBlock.includes(":");
|
|
33360
33663
|
const results = [];
|
|
33361
33664
|
if (isIpv6) {
|
|
@@ -33451,13 +33754,17 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
33451
33754
|
* sibling in the SAME region still shares the ambient instance, so the
|
|
33452
33755
|
* window survives exactly where the two stacks agree on the region.
|
|
33453
33756
|
*/
|
|
33454
|
-
sendWithThrottleRetry(operation, label) {
|
|
33455
|
-
|
|
33456
|
-
|
|
33457
|
-
|
|
33458
|
-
|
|
33459
|
-
|
|
33460
|
-
|
|
33757
|
+
async sendWithThrottleRetry(operation, label, masks) {
|
|
33758
|
+
try {
|
|
33759
|
+
return await withRetry(operation, label, {
|
|
33760
|
+
maxRetries: MAX_DYNAMIC_REFERENCE_THROTTLE_RETRIES,
|
|
33761
|
+
isRetryable: (_message, error) => isThrottlingError(error),
|
|
33762
|
+
logger: masks.retryLogger,
|
|
33763
|
+
...dynamicReferenceRetryDelays.sleep ? { sleep: dynamicReferenceRetryDelays.sleep } : {}
|
|
33764
|
+
});
|
|
33765
|
+
} catch (error) {
|
|
33766
|
+
throw masks.error(error);
|
|
33767
|
+
}
|
|
33461
33768
|
}
|
|
33462
33769
|
/**
|
|
33463
33770
|
* Resolve an `{{resolve:ssm:...}}` dynamic reference, reporting whether the
|
|
@@ -33484,14 +33791,14 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
33484
33791
|
Name: parameterName,
|
|
33485
33792
|
WithDecryption: decrypt
|
|
33486
33793
|
});
|
|
33487
|
-
const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}
|
|
33794
|
+
const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}`, this.namedRequestMasks([[parameterName, loggedParameterName]], context));
|
|
33488
33795
|
const paramValue = response.Parameter?.Value;
|
|
33489
33796
|
if (paramValue === void 0 || paramValue === null) throw new Error(`Dynamic reference: SSM parameter '${loggedParameterName}' not found or has no value`);
|
|
33490
33797
|
const paramType = response.Parameter?.Type;
|
|
33491
33798
|
const secure = paramType !== "String" && paramType !== "StringList";
|
|
33492
33799
|
if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(parameterName, String(paramType)))) {
|
|
33493
33800
|
this.warnedUnrecognizedSsmTypes.add(injectiveKey(parameterName, String(paramType)));
|
|
33494
|
-
const reported = paramType === void 0 ? "(absent)" : `'${String(paramType)}'`;
|
|
33801
|
+
const reported = paramType === void 0 ? "(absent)" : `'${this.displayMasked(String(paramType), context)}'`;
|
|
33495
33802
|
this.logger.warn(`SSM parameter '${loggedParameterName}' reported an unrecognized Type ${reported} — treating its value as a secret, so cdkd will persist the {{resolve:${service}:...}} expression rather than the resolved value. Declare the parameter as String / StringList if it is public config.`);
|
|
33496
33803
|
}
|
|
33497
33804
|
return {
|
|
@@ -35175,7 +35482,7 @@ var CloudControlProvider = class {
|
|
|
35175
35482
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
35176
35483
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
35177
35484
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
35178
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
35485
|
+
const { ASGProvider } = await import("./asg-provider-_vdcb9QG.js").then((n) => n.n);
|
|
35179
35486
|
const asgProvider = new ASGProvider();
|
|
35180
35487
|
return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
|
|
35181
35488
|
}
|
|
@@ -38598,7 +38905,7 @@ const MUTUALLY_EXCLUSIVE_PROPERTIES = /* @__PURE__ */ new Map([["AWS::EC2::Route
|
|
|
38598
38905
|
* different questions about the shape and should not drift into one another's
|
|
38599
38906
|
* behavior by accident.
|
|
38600
38907
|
*/
|
|
38601
|
-
function isUnresolvedIntrinsic(value) {
|
|
38908
|
+
function isUnresolvedIntrinsic$1(value) {
|
|
38602
38909
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
38603
38910
|
const keys = Object.keys(value);
|
|
38604
38911
|
return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
|
|
@@ -38615,7 +38922,7 @@ function isUnresolvedIntrinsic(value) {
|
|
|
38615
38922
|
* NOT yet known, so it is excluded ahead of the truthiness test.
|
|
38616
38923
|
*/
|
|
38617
38924
|
function isDeclared(value) {
|
|
38618
|
-
if (isUnresolvedIntrinsic(value)) return false;
|
|
38925
|
+
if (isUnresolvedIntrinsic$1(value)) return false;
|
|
38619
38926
|
return Boolean(value);
|
|
38620
38927
|
}
|
|
38621
38928
|
/**
|
|
@@ -38643,7 +38950,7 @@ function findViolationsForRules(resourceType, rules, templateProperties) {
|
|
|
38643
38950
|
for (const rule of rules) {
|
|
38644
38951
|
const declared = rule.properties.filter((property) => isDeclared(templateProperties[property]));
|
|
38645
38952
|
if (declared.length <= 1) continue;
|
|
38646
|
-
const winnerCertain = !rule.properties.slice(0, rule.properties.indexOf(declared[0])).some((property) => isUnresolvedIntrinsic(templateProperties[property]));
|
|
38953
|
+
const winnerCertain = !rule.properties.slice(0, rule.properties.indexOf(declared[0])).some((property) => isUnresolvedIntrinsic$1(templateProperties[property]));
|
|
38647
38954
|
violations.push({
|
|
38648
38955
|
resourceType,
|
|
38649
38956
|
rule,
|
|
@@ -38677,6 +38984,1526 @@ function buildMutuallyExclusiveMessage(logicalId, violation) {
|
|
|
38677
38984
|
return ` - ${logicalId} (${resourceType}) declares ${declared.join(" and ")}\n ${rule.rationale}${winnerNote}\n Declare at most one of: ${rule.properties.join(" / ")}`;
|
|
38678
38985
|
}
|
|
38679
38986
|
|
|
38987
|
+
//#endregion
|
|
38988
|
+
//#region src/provisioning/nested-required.generated.ts
|
|
38989
|
+
/**
|
|
38990
|
+
* AUTO-GENERATED by scripts/gen-nested-required.ts — DO NOT EDIT BY HAND.
|
|
38991
|
+
* Source: the `nestedRequired` section of tests/fixtures/cfn-schemas/*.json.
|
|
38992
|
+
* Regenerate: `vp run gen:nested-required`.
|
|
38993
|
+
*
|
|
38994
|
+
* Per resource type, each nested property PATH (dotted, arrays transparent)
|
|
38995
|
+
* mapped to the members its schema definition lists as `required`. What the
|
|
38996
|
+
* SCHEMA says, not what CloudFormation enforces: the pre-flight refusal in
|
|
38997
|
+
* `nested-required.ts` reads it only for types measured to be enforced.
|
|
38998
|
+
*/
|
|
38999
|
+
const NESTED_REQUIRED = /* @__PURE__ */ new Map([
|
|
39000
|
+
["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Map([["StageDescription.Tags", ["Key", "Value"]]])],
|
|
39001
|
+
["AWS::ApiGateway::Method", /* @__PURE__ */ new Map([
|
|
39002
|
+
["Integration", ["Type"]],
|
|
39003
|
+
["Integration.IntegrationResponses", ["StatusCode"]],
|
|
39004
|
+
["MethodResponses", ["StatusCode"]]
|
|
39005
|
+
])],
|
|
39006
|
+
["AWS::ApiGateway::Stage", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39007
|
+
["AWS::ApiGatewayV2::Route", /* @__PURE__ */ new Map([["RequestParameters", ["Required"]]])],
|
|
39008
|
+
["AWS::AppSync::DataSource", /* @__PURE__ */ new Map([
|
|
39009
|
+
["DynamoDBConfig", ["AwsRegion", "TableName"]],
|
|
39010
|
+
["DynamoDBConfig.DeltaSyncConfig", [
|
|
39011
|
+
"BaseTableTTL",
|
|
39012
|
+
"DeltaSyncTableName",
|
|
39013
|
+
"DeltaSyncTableTTL"
|
|
39014
|
+
]],
|
|
39015
|
+
["ElasticsearchConfig", ["AwsRegion", "Endpoint"]],
|
|
39016
|
+
["EventBridgeConfig", ["EventBusArn"]],
|
|
39017
|
+
["HttpConfig", ["Endpoint"]],
|
|
39018
|
+
["HttpConfig.AuthorizationConfig", ["AuthorizationType"]],
|
|
39019
|
+
["LambdaConfig", ["LambdaFunctionArn"]],
|
|
39020
|
+
["OpenSearchServiceConfig", ["AwsRegion", "Endpoint"]],
|
|
39021
|
+
["RelationalDatabaseConfig", ["RelationalDatabaseSourceType"]],
|
|
39022
|
+
["RelationalDatabaseConfig.RdsHttpEndpointConfig", [
|
|
39023
|
+
"AwsRegion",
|
|
39024
|
+
"AwsSecretStoreArn",
|
|
39025
|
+
"DbClusterIdentifier"
|
|
39026
|
+
]]
|
|
39027
|
+
])],
|
|
39028
|
+
["AWS::AppSync::GraphQLApi", /* @__PURE__ */ new Map([
|
|
39029
|
+
["AdditionalAuthenticationProviders", ["AuthenticationType"]],
|
|
39030
|
+
["EnhancedMetricsConfig", [
|
|
39031
|
+
"DataSourceLevelMetricsBehavior",
|
|
39032
|
+
"OperationLevelMetricsConfig",
|
|
39033
|
+
"ResolverLevelMetricsBehavior"
|
|
39034
|
+
]],
|
|
39035
|
+
["LogConfig", ["CloudWatchLogsRoleArn", "FieldLogLevel"]],
|
|
39036
|
+
["Tags", ["Key", "Value"]]
|
|
39037
|
+
])],
|
|
39038
|
+
["AWS::AppSync::Resolver", /* @__PURE__ */ new Map([
|
|
39039
|
+
["CachingConfig", ["Ttl"]],
|
|
39040
|
+
["Runtime", ["Name", "RuntimeVersion"]],
|
|
39041
|
+
["SyncConfig", ["ConflictDetection"]]
|
|
39042
|
+
])],
|
|
39043
|
+
["AWS::AutoScaling::AutoScalingGroup", /* @__PURE__ */ new Map([
|
|
39044
|
+
["AvailabilityZoneImpairmentPolicy", ["ImpairedZoneHealthCheckBehavior", "ZonalShiftEnabled"]],
|
|
39045
|
+
["CapacityReservationSpecification", ["CapacityReservationPreference"]],
|
|
39046
|
+
["LaunchTemplate", ["Version"]],
|
|
39047
|
+
["LifecycleHookSpecificationList", ["LifecycleHookName", "LifecycleTransition"]],
|
|
39048
|
+
["MetricsCollection", ["Granularity"]],
|
|
39049
|
+
["MixedInstancesPolicy", ["LaunchTemplate"]],
|
|
39050
|
+
["MixedInstancesPolicy.InstancesDistribution.DistributionSegments", ["TargetCapacityTypes"]],
|
|
39051
|
+
["MixedInstancesPolicy.LaunchTemplate", ["LaunchTemplateSpecification"]],
|
|
39052
|
+
["MixedInstancesPolicy.LaunchTemplate.LaunchTemplateSpecification", ["Version"]],
|
|
39053
|
+
["MixedInstancesPolicy.LaunchTemplate.Overrides.InstanceRequirements", ["MemoryMiB", "VCpuCount"]],
|
|
39054
|
+
["MixedInstancesPolicy.LaunchTemplate.Overrides.LaunchTemplateSpecification", ["Version"]],
|
|
39055
|
+
["NotificationConfiguration", ["TopicARN"]],
|
|
39056
|
+
["NotificationConfigurations", ["TopicARN"]],
|
|
39057
|
+
["Tags", [
|
|
39058
|
+
"Key",
|
|
39059
|
+
"PropagateAtLaunch",
|
|
39060
|
+
"Value"
|
|
39061
|
+
]],
|
|
39062
|
+
["TrafficSources", ["Identifier", "Type"]]
|
|
39063
|
+
])],
|
|
39064
|
+
["AWS::BedrockAgentCore::Evaluator", /* @__PURE__ */ new Map([
|
|
39065
|
+
["EvaluatorConfig.CodeBased", ["LambdaConfig"]],
|
|
39066
|
+
["EvaluatorConfig.CodeBased.LambdaConfig", ["LambdaArn"]],
|
|
39067
|
+
["EvaluatorConfig.LlmAsAJudge", [
|
|
39068
|
+
"Instructions",
|
|
39069
|
+
"ModelConfig",
|
|
39070
|
+
"RatingScale"
|
|
39071
|
+
]],
|
|
39072
|
+
["EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig", ["ModelId"]],
|
|
39073
|
+
["EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig", ["ModelId"]],
|
|
39074
|
+
["EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical", ["Definition", "Label"]],
|
|
39075
|
+
["EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical", [
|
|
39076
|
+
"Definition",
|
|
39077
|
+
"Label",
|
|
39078
|
+
"Value"
|
|
39079
|
+
]],
|
|
39080
|
+
["Tags", ["Key", "Value"]]
|
|
39081
|
+
])],
|
|
39082
|
+
["AWS::BedrockAgentCore::Runtime", /* @__PURE__ */ new Map([
|
|
39083
|
+
["AgentRuntimeArtifact.CodeConfiguration", [
|
|
39084
|
+
"Code",
|
|
39085
|
+
"EntryPoint",
|
|
39086
|
+
"Runtime"
|
|
39087
|
+
]],
|
|
39088
|
+
["AgentRuntimeArtifact.CodeConfiguration.Code.S3", ["Bucket", "Prefix"]],
|
|
39089
|
+
["AgentRuntimeArtifact.ContainerConfiguration", ["ContainerUri"]],
|
|
39090
|
+
["AuthorizerConfiguration.CustomJWTAuthorizer", ["DiscoveryUrl"]],
|
|
39091
|
+
["AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments", ["Arn"]],
|
|
39092
|
+
["AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims", [
|
|
39093
|
+
"AuthorizingClaimMatchValue",
|
|
39094
|
+
"InboundTokenClaimName",
|
|
39095
|
+
"InboundTokenClaimValueType"
|
|
39096
|
+
]],
|
|
39097
|
+
["AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims.AuthorizingClaimMatchValue", ["ClaimMatchOperator", "ClaimMatchValue"]],
|
|
39098
|
+
["AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides", ["Domain", "PrivateEndpoint"]],
|
|
39099
|
+
["CapacityProviderConfiguration", ["CapacityProviderArn"]],
|
|
39100
|
+
["FilesystemConfigurations.CapacityProviderVolume", ["MountPath", "VolumeName"]],
|
|
39101
|
+
["FilesystemConfigurations.EfsAccessPoint", ["AccessPointArn", "MountPath"]],
|
|
39102
|
+
["FilesystemConfigurations.S3FilesAccessPoint", ["AccessPointArn", "MountPath"]],
|
|
39103
|
+
["FilesystemConfigurations.SessionStorage", ["MountPath"]],
|
|
39104
|
+
["NetworkConfiguration", ["NetworkMode"]],
|
|
39105
|
+
["NetworkConfiguration.NetworkModeConfig", ["SecurityGroups", "Subnets"]],
|
|
39106
|
+
["WorkloadIdentityDetails", ["WorkloadIdentityArn"]]
|
|
39107
|
+
])],
|
|
39108
|
+
["AWS::Budgets::Budget", /* @__PURE__ */ new Map([
|
|
39109
|
+
["Budget", ["BudgetType", "TimeUnit"]],
|
|
39110
|
+
["Budget.AutoAdjustData", ["AutoAdjustType"]],
|
|
39111
|
+
["Budget.AutoAdjustData.HistoricalOptions", ["BudgetAdjustmentPeriod"]],
|
|
39112
|
+
["Budget.BudgetLimit", ["Amount", "Unit"]],
|
|
39113
|
+
["NotificationsWithSubscribers", ["Notification", "Subscribers"]],
|
|
39114
|
+
["NotificationsWithSubscribers.Notification", [
|
|
39115
|
+
"ComparisonOperator",
|
|
39116
|
+
"NotificationType",
|
|
39117
|
+
"Threshold"
|
|
39118
|
+
]],
|
|
39119
|
+
["NotificationsWithSubscribers.Subscribers", ["Address", "SubscriptionType"]],
|
|
39120
|
+
["ResourceTags", ["Key"]]
|
|
39121
|
+
])],
|
|
39122
|
+
["AWS::CertificateManager::Certificate", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39123
|
+
["AWS::CloudFormation::Stack", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39124
|
+
["AWS::CloudFront::CloudFrontOriginAccessIdentity", /* @__PURE__ */ new Map([["CloudFrontOriginAccessIdentityConfig", ["Comment"]]])],
|
|
39125
|
+
["AWS::CloudFront::Distribution", /* @__PURE__ */ new Map([
|
|
39126
|
+
["DistributionConfig", ["DefaultCacheBehavior", "Enabled"]],
|
|
39127
|
+
["DistributionConfig.CacheBehaviors", [
|
|
39128
|
+
"PathPattern",
|
|
39129
|
+
"TargetOriginId",
|
|
39130
|
+
"ViewerProtocolPolicy"
|
|
39131
|
+
]],
|
|
39132
|
+
["DistributionConfig.CacheBehaviors.ForwardedValues", ["QueryString"]],
|
|
39133
|
+
["DistributionConfig.CacheBehaviors.ForwardedValues.Cookies", ["Forward"]],
|
|
39134
|
+
["DistributionConfig.CacheBehaviors.GrpcConfig", ["Enabled"]],
|
|
39135
|
+
["DistributionConfig.CacheTagConfig", ["HeaderName"]],
|
|
39136
|
+
["DistributionConfig.ConnectionFunctionAssociation", ["Id"]],
|
|
39137
|
+
["DistributionConfig.CustomErrorResponses", ["ErrorCode"]],
|
|
39138
|
+
["DistributionConfig.CustomOrigin", [
|
|
39139
|
+
"DNSName",
|
|
39140
|
+
"OriginProtocolPolicy",
|
|
39141
|
+
"OriginSSLProtocols"
|
|
39142
|
+
]],
|
|
39143
|
+
["DistributionConfig.DefaultCacheBehavior", ["TargetOriginId", "ViewerProtocolPolicy"]],
|
|
39144
|
+
["DistributionConfig.DefaultCacheBehavior.ForwardedValues", ["QueryString"]],
|
|
39145
|
+
["DistributionConfig.DefaultCacheBehavior.ForwardedValues.Cookies", ["Forward"]],
|
|
39146
|
+
["DistributionConfig.DefaultCacheBehavior.GrpcConfig", ["Enabled"]],
|
|
39147
|
+
["DistributionConfig.OriginGroups", ["Quantity"]],
|
|
39148
|
+
["DistributionConfig.OriginGroups.Items", [
|
|
39149
|
+
"FailoverCriteria",
|
|
39150
|
+
"Id",
|
|
39151
|
+
"Members"
|
|
39152
|
+
]],
|
|
39153
|
+
["DistributionConfig.OriginGroups.Items.FailoverCriteria", ["StatusCodes"]],
|
|
39154
|
+
["DistributionConfig.OriginGroups.Items.FailoverCriteria.StatusCodes", ["Items", "Quantity"]],
|
|
39155
|
+
["DistributionConfig.OriginGroups.Items.Members", ["Items", "Quantity"]],
|
|
39156
|
+
["DistributionConfig.OriginGroups.Items.Members.Items", ["OriginId"]],
|
|
39157
|
+
["DistributionConfig.Origins", ["DomainName", "Id"]],
|
|
39158
|
+
["DistributionConfig.Origins.CustomOriginConfig", ["OriginProtocolPolicy"]],
|
|
39159
|
+
["DistributionConfig.Origins.CustomOriginConfig.OriginMtlsConfig", ["ClientCertificateArn"]],
|
|
39160
|
+
["DistributionConfig.Origins.OriginCustomHeaders", ["HeaderName", "HeaderValue"]],
|
|
39161
|
+
["DistributionConfig.Origins.VpcOriginConfig", ["VpcOriginId"]],
|
|
39162
|
+
["DistributionConfig.Restrictions", ["GeoRestriction"]],
|
|
39163
|
+
["DistributionConfig.Restrictions.GeoRestriction", ["RestrictionType"]],
|
|
39164
|
+
["DistributionConfig.S3Origin", ["DNSName"]],
|
|
39165
|
+
["DistributionConfig.TenantConfig.ParameterDefinitions", ["Definition", "Name"]],
|
|
39166
|
+
["DistributionConfig.TenantConfig.ParameterDefinitions.Definition.StringSchema", ["Required"]],
|
|
39167
|
+
["DistributionConfig.ViewerMtlsConfig.TrustStoreConfig", ["TrustStoreId"]],
|
|
39168
|
+
["Tags", ["Key", "Value"]]
|
|
39169
|
+
])],
|
|
39170
|
+
["AWS::CloudFront::OriginAccessControl", /* @__PURE__ */ new Map([["OriginAccessControlConfig", [
|
|
39171
|
+
"Name",
|
|
39172
|
+
"OriginAccessControlOriginType",
|
|
39173
|
+
"SigningBehavior",
|
|
39174
|
+
"SigningProtocol"
|
|
39175
|
+
]]])],
|
|
39176
|
+
["AWS::CloudTrail::Trail", /* @__PURE__ */ new Map([
|
|
39177
|
+
["AdvancedEventSelectors", ["FieldSelectors"]],
|
|
39178
|
+
["AdvancedEventSelectors.FieldSelectors", ["Field"]],
|
|
39179
|
+
["AggregationConfigurations", ["EventCategory", "Templates"]],
|
|
39180
|
+
["EventSelectors.DataResources", ["Type"]],
|
|
39181
|
+
["Tags", ["Key", "Value"]]
|
|
39182
|
+
])],
|
|
39183
|
+
["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Map([
|
|
39184
|
+
["Dimensions", ["Name", "Value"]],
|
|
39185
|
+
["Metrics", ["Id"]],
|
|
39186
|
+
["Metrics.MetricStat", [
|
|
39187
|
+
"Metric",
|
|
39188
|
+
"Period",
|
|
39189
|
+
"Stat"
|
|
39190
|
+
]],
|
|
39191
|
+
["Metrics.MetricStat.Metric.Dimensions", ["Name", "Value"]],
|
|
39192
|
+
["Tags", ["Key", "Value"]]
|
|
39193
|
+
])],
|
|
39194
|
+
["AWS::CloudWatch::AnomalyDetector", /* @__PURE__ */ new Map([
|
|
39195
|
+
["Configuration.ExcludedTimeRanges", ["EndTime", "StartTime"]],
|
|
39196
|
+
["Dimensions", ["Name", "Value"]],
|
|
39197
|
+
["MetricMathAnomalyDetector.MetricDataQueries", ["Id"]],
|
|
39198
|
+
["MetricMathAnomalyDetector.MetricDataQueries.MetricStat", [
|
|
39199
|
+
"Metric",
|
|
39200
|
+
"Period",
|
|
39201
|
+
"Stat"
|
|
39202
|
+
]],
|
|
39203
|
+
["MetricMathAnomalyDetector.MetricDataQueries.MetricStat.Metric", ["MetricName", "Namespace"]],
|
|
39204
|
+
["MetricMathAnomalyDetector.MetricDataQueries.MetricStat.Metric.Dimensions", ["Name", "Value"]],
|
|
39205
|
+
["SingleMetricAnomalyDetector.Dimensions", ["Name", "Value"]]
|
|
39206
|
+
])],
|
|
39207
|
+
["AWS::CodeBuild::Project", /* @__PURE__ */ new Map([
|
|
39208
|
+
["Artifacts", ["Type"]],
|
|
39209
|
+
["Cache", ["Type"]],
|
|
39210
|
+
["Environment", [
|
|
39211
|
+
"ComputeType",
|
|
39212
|
+
"Image",
|
|
39213
|
+
"Type"
|
|
39214
|
+
]],
|
|
39215
|
+
["Environment.DockerServer", ["ComputeType"]],
|
|
39216
|
+
["Environment.EnvironmentVariables", ["Name", "Value"]],
|
|
39217
|
+
["Environment.RegistryCredential", ["Credential", "CredentialProvider"]],
|
|
39218
|
+
["FileSystemLocations", [
|
|
39219
|
+
"Identifier",
|
|
39220
|
+
"Location",
|
|
39221
|
+
"MountPoint",
|
|
39222
|
+
"Type"
|
|
39223
|
+
]],
|
|
39224
|
+
["LogsConfig.CloudWatchLogs", ["Status"]],
|
|
39225
|
+
["LogsConfig.S3Logs", ["Status"]],
|
|
39226
|
+
["SecondaryArtifacts", ["Type"]],
|
|
39227
|
+
["SecondarySourceVersions", ["SourceIdentifier"]],
|
|
39228
|
+
["SecondarySources", ["Type"]],
|
|
39229
|
+
["SecondarySources.Auth", ["Type"]],
|
|
39230
|
+
["SecondarySources.GitSubmodulesConfig", ["FetchSubmodules"]],
|
|
39231
|
+
["Source", ["Type"]],
|
|
39232
|
+
["Source.Auth", ["Type"]],
|
|
39233
|
+
["Source.GitSubmodulesConfig", ["FetchSubmodules"]],
|
|
39234
|
+
["Tags", ["Key", "Value"]],
|
|
39235
|
+
["Triggers.PullRequestBuildPolicy", ["RequiresCommentApproval"]],
|
|
39236
|
+
["Triggers.ScopeConfiguration", ["Name"]]
|
|
39237
|
+
])],
|
|
39238
|
+
["AWS::CodeCommit::Repository", /* @__PURE__ */ new Map([
|
|
39239
|
+
["Code", ["S3"]],
|
|
39240
|
+
["Code.S3", ["Bucket", "Key"]],
|
|
39241
|
+
["Tags", ["Key", "Value"]],
|
|
39242
|
+
["Triggers", [
|
|
39243
|
+
"DestinationArn",
|
|
39244
|
+
"Events",
|
|
39245
|
+
"Name"
|
|
39246
|
+
]]
|
|
39247
|
+
])],
|
|
39248
|
+
["AWS::Cognito::UserPool", /* @__PURE__ */ new Map([["SmsConfiguration.EumsSms", ["CallerArn"]], ["UserAttributeUpdateSettings", ["AttributesRequireVerificationBeforeUpdate"]]])],
|
|
39249
|
+
["AWS::DLM::LifecyclePolicy", /* @__PURE__ */ new Map([
|
|
39250
|
+
["Exclusions.ExcludeTags", ["Key", "Value"]],
|
|
39251
|
+
["PolicyDetails.Actions", ["CrossRegionCopy", "Name"]],
|
|
39252
|
+
["PolicyDetails.Actions.CrossRegionCopy", ["EncryptionConfiguration", "Target"]],
|
|
39253
|
+
["PolicyDetails.Actions.CrossRegionCopy.EncryptionConfiguration", ["Encrypted"]],
|
|
39254
|
+
["PolicyDetails.Actions.CrossRegionCopy.RetainRule", ["Interval", "IntervalUnit"]],
|
|
39255
|
+
["PolicyDetails.EventSource", ["Type"]],
|
|
39256
|
+
["PolicyDetails.EventSource.Parameters", ["EventType", "SnapshotOwner"]],
|
|
39257
|
+
["PolicyDetails.Exclusions.ExcludeTags", ["Key", "Value"]],
|
|
39258
|
+
["PolicyDetails.Parameters.ExcludeDataVolumeTags", ["Key", "Value"]],
|
|
39259
|
+
["PolicyDetails.Schedules.ArchiveRule", ["RetainRule"]],
|
|
39260
|
+
["PolicyDetails.Schedules.ArchiveRule.RetainRule", ["RetentionArchiveTier"]],
|
|
39261
|
+
["PolicyDetails.Schedules.CrossRegionCopyRules", ["Encrypted"]],
|
|
39262
|
+
["PolicyDetails.Schedules.CrossRegionCopyRules.DeprecateRule", ["Interval", "IntervalUnit"]],
|
|
39263
|
+
["PolicyDetails.Schedules.CrossRegionCopyRules.RetainRule", ["Interval", "IntervalUnit"]],
|
|
39264
|
+
["PolicyDetails.Schedules.TagsToAdd", ["Key", "Value"]],
|
|
39265
|
+
["PolicyDetails.Schedules.VariableTags", ["Key", "Value"]],
|
|
39266
|
+
["PolicyDetails.TargetTags", ["Key", "Value"]],
|
|
39267
|
+
["Tags", ["Key", "Value"]]
|
|
39268
|
+
])],
|
|
39269
|
+
["AWS::DocDB::DBCluster", /* @__PURE__ */ new Map([["ServerlessV2ScalingConfiguration", ["MaxCapacity", "MinCapacity"]], ["Tags", ["Key", "Value"]]])],
|
|
39270
|
+
["AWS::DocDB::DBInstance", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39271
|
+
["AWS::DocDB::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39272
|
+
["AWS::DynamoDB::GlobalTable", /* @__PURE__ */ new Map([
|
|
39273
|
+
["AttributeDefinitions", ["AttributeName", "AttributeType"]],
|
|
39274
|
+
["GlobalSecondaryIndexes", [
|
|
39275
|
+
"IndexName",
|
|
39276
|
+
"KeySchema",
|
|
39277
|
+
"Projection"
|
|
39278
|
+
]],
|
|
39279
|
+
["GlobalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
|
|
39280
|
+
["GlobalSecondaryIndexes.WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings", [
|
|
39281
|
+
"MaxCapacity",
|
|
39282
|
+
"MinCapacity",
|
|
39283
|
+
"TargetTrackingScalingPolicyConfiguration"
|
|
39284
|
+
]],
|
|
39285
|
+
["GlobalSecondaryIndexes.WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
|
|
39286
|
+
["KeySchema", ["AttributeName", "KeyType"]],
|
|
39287
|
+
["LocalSecondaryIndexes", [
|
|
39288
|
+
"IndexName",
|
|
39289
|
+
"KeySchema",
|
|
39290
|
+
"Projection"
|
|
39291
|
+
]],
|
|
39292
|
+
["LocalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
|
|
39293
|
+
["Replicas", ["Region"]],
|
|
39294
|
+
["Replicas.ContributorInsightsSpecification", ["Enabled"]],
|
|
39295
|
+
["Replicas.GlobalSecondaryIndexes", ["IndexName"]],
|
|
39296
|
+
["Replicas.GlobalSecondaryIndexes.ContributorInsightsSpecification", ["Enabled"]],
|
|
39297
|
+
["Replicas.GlobalSecondaryIndexes.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings", [
|
|
39298
|
+
"MaxCapacity",
|
|
39299
|
+
"MinCapacity",
|
|
39300
|
+
"TargetTrackingScalingPolicyConfiguration"
|
|
39301
|
+
]],
|
|
39302
|
+
["Replicas.GlobalSecondaryIndexes.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
|
|
39303
|
+
["Replicas.KinesisStreamSpecification", ["StreamArn"]],
|
|
39304
|
+
["Replicas.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings", [
|
|
39305
|
+
"MaxCapacity",
|
|
39306
|
+
"MinCapacity",
|
|
39307
|
+
"TargetTrackingScalingPolicyConfiguration"
|
|
39308
|
+
]],
|
|
39309
|
+
["Replicas.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
|
|
39310
|
+
["Replicas.ReplicaStreamSpecification.ResourcePolicy", ["PolicyDocument"]],
|
|
39311
|
+
["Replicas.ReplicaStreamSpecification.Tags", ["Key", "Value"]],
|
|
39312
|
+
["Replicas.ResourcePolicy", ["PolicyDocument"]],
|
|
39313
|
+
["Replicas.SSESpecification", ["KMSMasterKeyId"]],
|
|
39314
|
+
["Replicas.Tags", ["Key", "Value"]],
|
|
39315
|
+
["SSESpecification", ["SSEEnabled"]],
|
|
39316
|
+
["StreamSpecification", ["StreamViewType"]],
|
|
39317
|
+
["TimeToLiveSpecification", ["Enabled"]],
|
|
39318
|
+
["VectorIndexes", [
|
|
39319
|
+
"Dimensions",
|
|
39320
|
+
"DistanceFunction",
|
|
39321
|
+
"IndexName",
|
|
39322
|
+
"Projection",
|
|
39323
|
+
"VectorAttribute"
|
|
39324
|
+
]],
|
|
39325
|
+
["VectorIndexes.SearchSchema", ["AttributeName", "SearchSchemaElementType"]],
|
|
39326
|
+
["VectorIndexes.VectorAttribute", ["AttributeName"]],
|
|
39327
|
+
["WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings", [
|
|
39328
|
+
"MaxCapacity",
|
|
39329
|
+
"MinCapacity",
|
|
39330
|
+
"TargetTrackingScalingPolicyConfiguration"
|
|
39331
|
+
]],
|
|
39332
|
+
["WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]]
|
|
39333
|
+
])],
|
|
39334
|
+
["AWS::DynamoDB::Table", /* @__PURE__ */ new Map([
|
|
39335
|
+
["AttributeDefinitions", ["AttributeName", "AttributeType"]],
|
|
39336
|
+
["ContributorInsightsSpecification", ["Enabled"]],
|
|
39337
|
+
["GlobalSecondaryIndexes", [
|
|
39338
|
+
"IndexName",
|
|
39339
|
+
"KeySchema",
|
|
39340
|
+
"Projection"
|
|
39341
|
+
]],
|
|
39342
|
+
["GlobalSecondaryIndexes.ContributorInsightsSpecification", ["Enabled"]],
|
|
39343
|
+
["GlobalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
|
|
39344
|
+
["GlobalSecondaryIndexes.ProvisionedThroughput", ["ReadCapacityUnits", "WriteCapacityUnits"]],
|
|
39345
|
+
["ImportSourceSpecification", ["InputFormat", "S3BucketSource"]],
|
|
39346
|
+
["ImportSourceSpecification.S3BucketSource", ["S3Bucket"]],
|
|
39347
|
+
["KinesisStreamSpecification", ["StreamArn"]],
|
|
39348
|
+
["LocalSecondaryIndexes", [
|
|
39349
|
+
"IndexName",
|
|
39350
|
+
"KeySchema",
|
|
39351
|
+
"Projection"
|
|
39352
|
+
]],
|
|
39353
|
+
["LocalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
|
|
39354
|
+
["ProvisionedThroughput", ["ReadCapacityUnits", "WriteCapacityUnits"]],
|
|
39355
|
+
["ResourcePolicy", ["PolicyDocument"]],
|
|
39356
|
+
["SSESpecification", ["SSEEnabled"]],
|
|
39357
|
+
["StreamSpecification", ["StreamViewType"]],
|
|
39358
|
+
["StreamSpecification.ResourcePolicy", ["PolicyDocument"]],
|
|
39359
|
+
["StreamSpecification.Tags", ["Key", "Value"]],
|
|
39360
|
+
["Tags", ["Key", "Value"]],
|
|
39361
|
+
["TimeToLiveSpecification", ["Enabled"]],
|
|
39362
|
+
["VectorIndexes", [
|
|
39363
|
+
"Dimensions",
|
|
39364
|
+
"DistanceFunction",
|
|
39365
|
+
"IndexName",
|
|
39366
|
+
"Projection",
|
|
39367
|
+
"VectorAttribute"
|
|
39368
|
+
]],
|
|
39369
|
+
["VectorIndexes.SearchSchema", ["AttributeName", "SearchSchemaElementType"]],
|
|
39370
|
+
["VectorIndexes.VectorAttribute", ["AttributeName"]]
|
|
39371
|
+
])],
|
|
39372
|
+
["AWS::EC2::EIP", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39373
|
+
["AWS::EC2::Instance", /* @__PURE__ */ new Map([
|
|
39374
|
+
["BlockDeviceMappings", ["DeviceName"]],
|
|
39375
|
+
["ElasticGpuSpecifications", ["Type"]],
|
|
39376
|
+
["ElasticInferenceAccelerators", ["Type"]],
|
|
39377
|
+
["Ipv6Addresses", ["Ipv6Address"]],
|
|
39378
|
+
["LicenseSpecifications", ["LicenseConfigurationArn"]],
|
|
39379
|
+
["NetworkInterfaces", ["DeviceIndex"]],
|
|
39380
|
+
["NetworkInterfaces.Ipv6Addresses", ["Ipv6Address"]],
|
|
39381
|
+
["NetworkInterfaces.PrivateIpAddresses", ["Primary", "PrivateIpAddress"]],
|
|
39382
|
+
["SsmAssociations", ["DocumentName"]],
|
|
39383
|
+
["SsmAssociations.AssociationParameters", ["Key", "Value"]],
|
|
39384
|
+
["Tags", ["Key", "Value"]],
|
|
39385
|
+
["Volumes", ["Device", "VolumeId"]]
|
|
39386
|
+
])],
|
|
39387
|
+
["AWS::EC2::InternetGateway", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39388
|
+
["AWS::EC2::NatGateway", /* @__PURE__ */ new Map([["AvailabilityZoneAddresses", ["AllocationIds"]], ["Tags", ["Key", "Value"]]])],
|
|
39389
|
+
["AWS::EC2::NetworkAcl", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39390
|
+
["AWS::EC2::RouteTable", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39391
|
+
["AWS::EC2::SecurityGroup", /* @__PURE__ */ new Map([
|
|
39392
|
+
["SecurityGroupEgress", ["IpProtocol"]],
|
|
39393
|
+
["SecurityGroupIngress", ["IpProtocol"]],
|
|
39394
|
+
["Tags", ["Key", "Value"]]
|
|
39395
|
+
])],
|
|
39396
|
+
["AWS::EC2::Subnet", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39397
|
+
["AWS::EC2::VPC", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39398
|
+
["AWS::ECR::Repository", /* @__PURE__ */ new Map([
|
|
39399
|
+
["EncryptionConfiguration", ["EncryptionType"]],
|
|
39400
|
+
["ImageTagMutabilityExclusionFilters", ["ImageTagMutabilityExclusionFilterType", "ImageTagMutabilityExclusionFilterValue"]],
|
|
39401
|
+
["Tags", ["Key", "Value"]]
|
|
39402
|
+
])],
|
|
39403
|
+
["AWS::ECS::Service", /* @__PURE__ */ new Map([
|
|
39404
|
+
["DeploymentConfiguration.Alarms", [
|
|
39405
|
+
"AlarmNames",
|
|
39406
|
+
"Enable",
|
|
39407
|
+
"Rollback"
|
|
39408
|
+
]],
|
|
39409
|
+
["DeploymentConfiguration.DeploymentCircuitBreaker", ["Enable", "Rollback"]],
|
|
39410
|
+
["DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration", ["Type", "Value"]],
|
|
39411
|
+
["DeploymentConfiguration.LifecycleHooks", ["LifecycleStages"]],
|
|
39412
|
+
["ForceNewDeployment", ["EnableForceNewDeployment"]],
|
|
39413
|
+
["LoadBalancers.AdvancedConfiguration", ["AlternateTargetGroupArn"]],
|
|
39414
|
+
["Monitoring", ["MetricConfigurations"]],
|
|
39415
|
+
["Monitoring.MetricConfigurations", ["MetricNames", "ResolutionSeconds"]],
|
|
39416
|
+
["PlacementConstraints", ["Type"]],
|
|
39417
|
+
["PlacementStrategies", ["Type"]],
|
|
39418
|
+
["ServiceConnectConfiguration", ["Enabled"]],
|
|
39419
|
+
["ServiceConnectConfiguration.AccessLogConfiguration", ["Format"]],
|
|
39420
|
+
["ServiceConnectConfiguration.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
|
|
39421
|
+
["ServiceConnectConfiguration.Services", ["PortName"]],
|
|
39422
|
+
["ServiceConnectConfiguration.Services.ClientAliases", ["Port"]],
|
|
39423
|
+
["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules", ["Header"]],
|
|
39424
|
+
["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules.Header", ["Name"]],
|
|
39425
|
+
["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules.Header.Value", ["Exact"]],
|
|
39426
|
+
["ServiceConnectConfiguration.Services.Tls", ["IssuerCertificateAuthority"]],
|
|
39427
|
+
["VolumeConfigurations", ["Name"]],
|
|
39428
|
+
["VolumeConfigurations.ManagedEBSVolume", ["RoleArn"]],
|
|
39429
|
+
["VolumeConfigurations.ManagedEBSVolume.TagSpecifications", ["ResourceType"]],
|
|
39430
|
+
["VpcLatticeConfigurations", [
|
|
39431
|
+
"PortName",
|
|
39432
|
+
"RoleArn",
|
|
39433
|
+
"TargetGroupArn"
|
|
39434
|
+
]]
|
|
39435
|
+
])],
|
|
39436
|
+
["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Map([
|
|
39437
|
+
["ContainerDefinitions", ["Image", "Name"]],
|
|
39438
|
+
["ContainerDefinitions.LinuxParameters.Tmpfs", ["Size"]],
|
|
39439
|
+
["ContainerDefinitions.LogConfiguration", ["LogDriver"]],
|
|
39440
|
+
["ContainerDefinitions.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
|
|
39441
|
+
["ContainerDefinitions.ResourceRequirements", ["Type", "Value"]],
|
|
39442
|
+
["ContainerDefinitions.Secrets", ["Name", "ValueFrom"]],
|
|
39443
|
+
["ContainerDefinitions.Ulimits", [
|
|
39444
|
+
"HardLimit",
|
|
39445
|
+
"Name",
|
|
39446
|
+
"SoftLimit"
|
|
39447
|
+
]],
|
|
39448
|
+
["PlacementConstraints", ["Type"]],
|
|
39449
|
+
["ProxyConfiguration", ["ContainerName"]],
|
|
39450
|
+
["Volumes.EFSVolumeConfiguration", ["FilesystemId"]],
|
|
39451
|
+
["Volumes.FSxWindowsFileServerVolumeConfiguration", ["FileSystemId", "RootDirectory"]],
|
|
39452
|
+
["Volumes.FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig", ["CredentialsParameter", "Domain"]],
|
|
39453
|
+
["Volumes.S3FilesVolumeConfiguration", ["FileSystemArn"]]
|
|
39454
|
+
])],
|
|
39455
|
+
["AWS::EFS::AccessPoint", /* @__PURE__ */ new Map([["PosixUser", ["Gid", "Uid"]], ["RootDirectory.CreationInfo", [
|
|
39456
|
+
"OwnerGid",
|
|
39457
|
+
"OwnerUid",
|
|
39458
|
+
"Permissions"
|
|
39459
|
+
]]])],
|
|
39460
|
+
["AWS::EFS::FileSystem", /* @__PURE__ */ new Map([["BackupPolicy", ["Status"]], ["FileSystemTags", ["Key", "Value"]]])],
|
|
39461
|
+
["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Map([
|
|
39462
|
+
["LogDeliveryConfigurations", [
|
|
39463
|
+
"DestinationDetails",
|
|
39464
|
+
"DestinationType",
|
|
39465
|
+
"LogFormat",
|
|
39466
|
+
"LogType"
|
|
39467
|
+
]],
|
|
39468
|
+
["LogDeliveryConfigurations.DestinationDetails.CloudWatchLogsDetails", ["LogGroup"]],
|
|
39469
|
+
["LogDeliveryConfigurations.DestinationDetails.KinesisFirehoseDetails", ["DeliveryStream"]],
|
|
39470
|
+
["Tags", ["Key", "Value"]]
|
|
39471
|
+
])],
|
|
39472
|
+
["AWS::ElastiCache::SubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39473
|
+
["AWS::ElasticLoadBalancingV2::Listener", /* @__PURE__ */ new Map([
|
|
39474
|
+
["DefaultActions", ["Type"]],
|
|
39475
|
+
["DefaultActions.AuthenticateCognitoConfig", [
|
|
39476
|
+
"UserPoolArn",
|
|
39477
|
+
"UserPoolClientId",
|
|
39478
|
+
"UserPoolDomain"
|
|
39479
|
+
]],
|
|
39480
|
+
["DefaultActions.AuthenticateOidcConfig", [
|
|
39481
|
+
"AuthorizationEndpoint",
|
|
39482
|
+
"ClientId",
|
|
39483
|
+
"Issuer",
|
|
39484
|
+
"TokenEndpoint",
|
|
39485
|
+
"UserInfoEndpoint"
|
|
39486
|
+
]],
|
|
39487
|
+
["DefaultActions.FixedResponseConfig", ["StatusCode"]],
|
|
39488
|
+
["DefaultActions.JwtValidationConfig", ["Issuer", "JwksEndpoint"]],
|
|
39489
|
+
["DefaultActions.JwtValidationConfig.AdditionalClaims", [
|
|
39490
|
+
"Format",
|
|
39491
|
+
"Name",
|
|
39492
|
+
"Values"
|
|
39493
|
+
]],
|
|
39494
|
+
["DefaultActions.RedirectConfig", ["StatusCode"]],
|
|
39495
|
+
["Tags", ["Key", "Value"]]
|
|
39496
|
+
])],
|
|
39497
|
+
["AWS::ElasticLoadBalancingV2::LoadBalancer", /* @__PURE__ */ new Map([
|
|
39498
|
+
["MinimumLoadBalancerCapacity", ["CapacityUnits"]],
|
|
39499
|
+
["SubnetMappings", ["SubnetId"]],
|
|
39500
|
+
["Tags", ["Key"]]
|
|
39501
|
+
])],
|
|
39502
|
+
["AWS::ElasticLoadBalancingV2::TargetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]], ["Targets", ["Id"]]])],
|
|
39503
|
+
["AWS::EMR::Cluster", /* @__PURE__ */ new Map([
|
|
39504
|
+
["BootstrapActions", ["Name", "ScriptBootstrapAction"]],
|
|
39505
|
+
["BootstrapActions.ScriptBootstrapAction", ["Path"]],
|
|
39506
|
+
["Instances.CoreInstanceFleet.InstanceTypeConfigs", ["InstanceType"]],
|
|
39507
|
+
["Instances.CoreInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39508
|
+
["Instances.CoreInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39509
|
+
["Instances.CoreInstanceFleet.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
|
|
39510
|
+
["Instances.CoreInstanceFleet.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
|
|
39511
|
+
["Instances.CoreInstanceGroup", ["InstanceCount", "InstanceType"]],
|
|
39512
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy", ["Constraints", "Rules"]],
|
|
39513
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
|
|
39514
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules", [
|
|
39515
|
+
"Action",
|
|
39516
|
+
"Name",
|
|
39517
|
+
"Trigger"
|
|
39518
|
+
]],
|
|
39519
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
|
|
39520
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
|
|
39521
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
|
|
39522
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
|
|
39523
|
+
"ComparisonOperator",
|
|
39524
|
+
"MetricName",
|
|
39525
|
+
"Period",
|
|
39526
|
+
"Threshold"
|
|
39527
|
+
]],
|
|
39528
|
+
["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
|
|
39529
|
+
["Instances.CoreInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39530
|
+
["Instances.CoreInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39531
|
+
["Instances.MasterInstanceFleet.InstanceTypeConfigs", ["InstanceType"]],
|
|
39532
|
+
["Instances.MasterInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39533
|
+
["Instances.MasterInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39534
|
+
["Instances.MasterInstanceFleet.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
|
|
39535
|
+
["Instances.MasterInstanceFleet.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
|
|
39536
|
+
["Instances.MasterInstanceGroup", ["InstanceCount", "InstanceType"]],
|
|
39537
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy", ["Constraints", "Rules"]],
|
|
39538
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
|
|
39539
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules", [
|
|
39540
|
+
"Action",
|
|
39541
|
+
"Name",
|
|
39542
|
+
"Trigger"
|
|
39543
|
+
]],
|
|
39544
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
|
|
39545
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
|
|
39546
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
|
|
39547
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
|
|
39548
|
+
"ComparisonOperator",
|
|
39549
|
+
"MetricName",
|
|
39550
|
+
"Period",
|
|
39551
|
+
"Threshold"
|
|
39552
|
+
]],
|
|
39553
|
+
["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
|
|
39554
|
+
["Instances.MasterInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39555
|
+
["Instances.MasterInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39556
|
+
["Instances.Placement", ["AvailabilityZone"]],
|
|
39557
|
+
["Instances.TaskInstanceFleets.InstanceTypeConfigs", ["InstanceType"]],
|
|
39558
|
+
["Instances.TaskInstanceFleets.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39559
|
+
["Instances.TaskInstanceFleets.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39560
|
+
["Instances.TaskInstanceFleets.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
|
|
39561
|
+
["Instances.TaskInstanceFleets.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
|
|
39562
|
+
["Instances.TaskInstanceGroups", ["InstanceCount", "InstanceType"]],
|
|
39563
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy", ["Constraints", "Rules"]],
|
|
39564
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
|
|
39565
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules", [
|
|
39566
|
+
"Action",
|
|
39567
|
+
"Name",
|
|
39568
|
+
"Trigger"
|
|
39569
|
+
]],
|
|
39570
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
|
|
39571
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
|
|
39572
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
|
|
39573
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
|
|
39574
|
+
"ComparisonOperator",
|
|
39575
|
+
"MetricName",
|
|
39576
|
+
"Period",
|
|
39577
|
+
"Threshold"
|
|
39578
|
+
]],
|
|
39579
|
+
["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
|
|
39580
|
+
["Instances.TaskInstanceGroups.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39581
|
+
["Instances.TaskInstanceGroups.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39582
|
+
["KerberosAttributes", ["KdcAdminPassword", "Realm"]],
|
|
39583
|
+
["ManagedScalingPolicy.ComputeLimits", [
|
|
39584
|
+
"MaximumCapacityUnits",
|
|
39585
|
+
"MinimumCapacityUnits",
|
|
39586
|
+
"UnitType"
|
|
39587
|
+
]],
|
|
39588
|
+
["PlacementGroupConfigs", ["InstanceRole"]],
|
|
39589
|
+
["Steps", ["HadoopJarStep", "Name"]],
|
|
39590
|
+
["Steps.HadoopJarStep", ["Jar"]],
|
|
39591
|
+
["Tags", ["Key", "Value"]]
|
|
39592
|
+
])],
|
|
39593
|
+
["AWS::EMR::InstanceFleetConfig", /* @__PURE__ */ new Map([
|
|
39594
|
+
["InstanceTypeConfigs", ["InstanceType"]],
|
|
39595
|
+
["InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39596
|
+
["InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
|
|
39597
|
+
["LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
|
|
39598
|
+
["LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]]
|
|
39599
|
+
])],
|
|
39600
|
+
["AWS::EMR::InstanceGroupConfig", /* @__PURE__ */ new Map([
|
|
39601
|
+
["AutoScalingPolicy", ["Constraints", "Rules"]],
|
|
39602
|
+
["AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
|
|
39603
|
+
["AutoScalingPolicy.Rules", [
|
|
39604
|
+
"Action",
|
|
39605
|
+
"Name",
|
|
39606
|
+
"Trigger"
|
|
39607
|
+
]],
|
|
39608
|
+
["AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
|
|
39609
|
+
["AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
|
|
39610
|
+
["AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
|
|
39611
|
+
["AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
|
|
39612
|
+
"ComparisonOperator",
|
|
39613
|
+
"MetricName",
|
|
39614
|
+
"Period",
|
|
39615
|
+
"Threshold"
|
|
39616
|
+
]],
|
|
39617
|
+
["AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
|
|
39618
|
+
["EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
|
|
39619
|
+
["EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]]
|
|
39620
|
+
])],
|
|
39621
|
+
["AWS::Events::EventBus", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39622
|
+
["AWS::Events::Rule", /* @__PURE__ */ new Map([
|
|
39623
|
+
["Targets", ["Arn", "Id"]],
|
|
39624
|
+
["Targets.AppSyncParameters", ["GraphQLOperation"]],
|
|
39625
|
+
["Targets.BatchParameters", ["JobDefinition", "JobName"]],
|
|
39626
|
+
["Targets.EcsParameters", ["TaskDefinitionArn"]],
|
|
39627
|
+
["Targets.EcsParameters.CapacityProviderStrategy", ["CapacityProvider"]],
|
|
39628
|
+
["Targets.EcsParameters.NetworkConfiguration.AwsVpcConfiguration", ["Subnets"]],
|
|
39629
|
+
["Targets.InputTransformer", ["InputTemplate"]],
|
|
39630
|
+
["Targets.KinesisParameters", ["PartitionKeyPath"]],
|
|
39631
|
+
["Targets.RedshiftDataParameters", ["Database"]],
|
|
39632
|
+
["Targets.RunCommandParameters", ["RunCommandTargets"]],
|
|
39633
|
+
["Targets.RunCommandParameters.RunCommandTargets", ["Key", "Values"]],
|
|
39634
|
+
["Targets.SageMakerPipelineParameters.PipelineParameterList", ["Name", "Value"]],
|
|
39635
|
+
["Targets.SqsParameters", ["MessageGroupId"]]
|
|
39636
|
+
])],
|
|
39637
|
+
["AWS::FSx::FileSystem", /* @__PURE__ */ new Map([
|
|
39638
|
+
["LustreConfiguration.LogConfiguration", ["Level"]],
|
|
39639
|
+
["OntapConfiguration", ["DeploymentType"]],
|
|
39640
|
+
["OpenZFSConfiguration", ["DeploymentType"]],
|
|
39641
|
+
["Tags", ["Key", "Value"]],
|
|
39642
|
+
["WindowsConfiguration", ["ThroughputCapacity"]],
|
|
39643
|
+
["WindowsConfiguration.AuditLogConfiguration", ["FileAccessAuditLogLevel", "FileShareAccessAuditLogLevel"]],
|
|
39644
|
+
["WindowsConfiguration.FsrmConfiguration", ["FsrmServiceEnabled"]]
|
|
39645
|
+
])],
|
|
39646
|
+
["AWS::Glue::Connection", /* @__PURE__ */ new Map([["ConnectionInput", ["ConnectionType"]], ["ConnectionInput.AuthenticationConfiguration", ["AuthenticationType"]]])],
|
|
39647
|
+
["AWS::Glue::Table", /* @__PURE__ */ new Map([
|
|
39648
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput", ["Location", "Schema"]],
|
|
39649
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec", ["Fields"]],
|
|
39650
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec.Fields", [
|
|
39651
|
+
"Name",
|
|
39652
|
+
"SourceId",
|
|
39653
|
+
"Transform"
|
|
39654
|
+
]],
|
|
39655
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.Schema", ["Fields"]],
|
|
39656
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.Schema.Fields", [
|
|
39657
|
+
"Id",
|
|
39658
|
+
"Name",
|
|
39659
|
+
"Required",
|
|
39660
|
+
"Type"
|
|
39661
|
+
]],
|
|
39662
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder", ["Fields", "OrderId"]],
|
|
39663
|
+
["OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder.Fields", [
|
|
39664
|
+
"Direction",
|
|
39665
|
+
"NullOrder",
|
|
39666
|
+
"SourceId",
|
|
39667
|
+
"Transform"
|
|
39668
|
+
]],
|
|
39669
|
+
["TableInput.PartitionKeys", ["Name"]],
|
|
39670
|
+
["TableInput.StorageDescriptor.Columns", ["Name"]],
|
|
39671
|
+
["TableInput.StorageDescriptor.SortColumns", ["Column", "SortOrder"]]
|
|
39672
|
+
])],
|
|
39673
|
+
["AWS::Glue::Trigger", /* @__PURE__ */ new Map([["EventBatchingCondition", ["BatchSize"]]])],
|
|
39674
|
+
["AWS::IAM::Group", /* @__PURE__ */ new Map([["Policies", ["PolicyDocument", "PolicyName"]]])],
|
|
39675
|
+
["AWS::IAM::Role", /* @__PURE__ */ new Map([["Policies", ["PolicyDocument", "PolicyName"]], ["Tags", ["Key", "Value"]]])],
|
|
39676
|
+
["AWS::IAM::User", /* @__PURE__ */ new Map([
|
|
39677
|
+
["LoginProfile", ["Password"]],
|
|
39678
|
+
["Policies", ["PolicyDocument", "PolicyName"]],
|
|
39679
|
+
["Tags", ["Key", "Value"]]
|
|
39680
|
+
])],
|
|
39681
|
+
["AWS::Kinesis::Stream", /* @__PURE__ */ new Map([
|
|
39682
|
+
["StreamEncryption", ["EncryptionType", "KeyId"]],
|
|
39683
|
+
["StreamModeDetails", ["StreamMode"]],
|
|
39684
|
+
["Tags", ["Key", "Value"]]
|
|
39685
|
+
])],
|
|
39686
|
+
["AWS::Kinesis::StreamConsumer", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39687
|
+
["AWS::KinesisFirehose::DeliveryStream", /* @__PURE__ */ new Map([
|
|
39688
|
+
["AmazonOpenSearchServerlessDestinationConfiguration", [
|
|
39689
|
+
"IndexName",
|
|
39690
|
+
"RoleARN",
|
|
39691
|
+
"S3Configuration"
|
|
39692
|
+
]],
|
|
39693
|
+
["AmazonOpenSearchServerlessDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39694
|
+
["AmazonOpenSearchServerlessDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39695
|
+
["AmazonOpenSearchServerlessDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39696
|
+
["AmazonOpenSearchServerlessDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39697
|
+
["AmazonOpenSearchServerlessDestinationConfiguration.VpcConfiguration", [
|
|
39698
|
+
"RoleARN",
|
|
39699
|
+
"SecurityGroupIds",
|
|
39700
|
+
"SubnetIds"
|
|
39701
|
+
]],
|
|
39702
|
+
["AmazonopensearchserviceDestinationConfiguration", [
|
|
39703
|
+
"IndexName",
|
|
39704
|
+
"RoleARN",
|
|
39705
|
+
"S3Configuration"
|
|
39706
|
+
]],
|
|
39707
|
+
["AmazonopensearchserviceDestinationConfiguration.DocumentIdOptions", ["DefaultDocumentIdFormat"]],
|
|
39708
|
+
["AmazonopensearchserviceDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39709
|
+
["AmazonopensearchserviceDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39710
|
+
["AmazonopensearchserviceDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39711
|
+
["AmazonopensearchserviceDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39712
|
+
["AmazonopensearchserviceDestinationConfiguration.VpcConfiguration", [
|
|
39713
|
+
"RoleARN",
|
|
39714
|
+
"SecurityGroupIds",
|
|
39715
|
+
"SubnetIds"
|
|
39716
|
+
]],
|
|
39717
|
+
["DatabaseSourceConfiguration", [
|
|
39718
|
+
"DatabaseSourceAuthenticationConfiguration",
|
|
39719
|
+
"DatabaseSourceVPCConfiguration",
|
|
39720
|
+
"Databases",
|
|
39721
|
+
"Endpoint",
|
|
39722
|
+
"Port",
|
|
39723
|
+
"SnapshotWatermarkTable",
|
|
39724
|
+
"Tables",
|
|
39725
|
+
"Type"
|
|
39726
|
+
]],
|
|
39727
|
+
["DatabaseSourceConfiguration.DatabaseSourceAuthenticationConfiguration", ["SecretsManagerConfiguration"]],
|
|
39728
|
+
["DatabaseSourceConfiguration.DatabaseSourceAuthenticationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
|
|
39729
|
+
["DatabaseSourceConfiguration.DatabaseSourceVPCConfiguration", ["VpcEndpointServiceName"]],
|
|
39730
|
+
["DeliveryStreamEncryptionConfigurationInput", ["KeyType"]],
|
|
39731
|
+
["ElasticsearchDestinationConfiguration", [
|
|
39732
|
+
"IndexName",
|
|
39733
|
+
"RoleARN",
|
|
39734
|
+
"S3Configuration"
|
|
39735
|
+
]],
|
|
39736
|
+
["ElasticsearchDestinationConfiguration.DocumentIdOptions", ["DefaultDocumentIdFormat"]],
|
|
39737
|
+
["ElasticsearchDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39738
|
+
["ElasticsearchDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39739
|
+
["ElasticsearchDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39740
|
+
["ElasticsearchDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39741
|
+
["ElasticsearchDestinationConfiguration.VpcConfiguration", [
|
|
39742
|
+
"RoleARN",
|
|
39743
|
+
"SecurityGroupIds",
|
|
39744
|
+
"SubnetIds"
|
|
39745
|
+
]],
|
|
39746
|
+
["ExtendedS3DestinationConfiguration", ["BucketARN", "RoleARN"]],
|
|
39747
|
+
["ExtendedS3DestinationConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39748
|
+
["ExtendedS3DestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39749
|
+
["ExtendedS3DestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39750
|
+
["ExtendedS3DestinationConfiguration.S3BackupConfiguration", ["BucketARN", "RoleARN"]],
|
|
39751
|
+
["ExtendedS3DestinationConfiguration.S3BackupConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39752
|
+
["HttpEndpointDestinationConfiguration", ["EndpointConfiguration", "S3Configuration"]],
|
|
39753
|
+
["HttpEndpointDestinationConfiguration.EndpointConfiguration", ["Url"]],
|
|
39754
|
+
["HttpEndpointDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39755
|
+
["HttpEndpointDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39756
|
+
["HttpEndpointDestinationConfiguration.RequestConfiguration.CommonAttributes", ["AttributeName", "AttributeValue"]],
|
|
39757
|
+
["HttpEndpointDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39758
|
+
["HttpEndpointDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39759
|
+
["HttpEndpointDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
|
|
39760
|
+
["IcebergDestinationConfiguration", [
|
|
39761
|
+
"CatalogConfiguration",
|
|
39762
|
+
"RoleARN",
|
|
39763
|
+
"S3Configuration"
|
|
39764
|
+
]],
|
|
39765
|
+
["IcebergDestinationConfiguration.DestinationTableConfigurationList", ["DestinationDatabaseName", "DestinationTableName"]],
|
|
39766
|
+
["IcebergDestinationConfiguration.DestinationTableConfigurationList.PartitionSpec.Identity", ["SourceName"]],
|
|
39767
|
+
["IcebergDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39768
|
+
["IcebergDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39769
|
+
["IcebergDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39770
|
+
["IcebergDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39771
|
+
["KinesisStreamSourceConfiguration", ["KinesisStreamARN", "RoleARN"]],
|
|
39772
|
+
["MSKSourceConfiguration", [
|
|
39773
|
+
"AuthenticationConfiguration",
|
|
39774
|
+
"MSKClusterARN",
|
|
39775
|
+
"TopicName"
|
|
39776
|
+
]],
|
|
39777
|
+
["MSKSourceConfiguration.AuthenticationConfiguration", ["Connectivity", "RoleARN"]],
|
|
39778
|
+
["RedshiftDestinationConfiguration", [
|
|
39779
|
+
"ClusterJDBCURL",
|
|
39780
|
+
"CopyCommand",
|
|
39781
|
+
"RoleARN",
|
|
39782
|
+
"S3Configuration"
|
|
39783
|
+
]],
|
|
39784
|
+
["RedshiftDestinationConfiguration.CopyCommand", ["DataTableName"]],
|
|
39785
|
+
["RedshiftDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39786
|
+
["RedshiftDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39787
|
+
["RedshiftDestinationConfiguration.S3BackupConfiguration", ["BucketARN", "RoleARN"]],
|
|
39788
|
+
["RedshiftDestinationConfiguration.S3BackupConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39789
|
+
["RedshiftDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39790
|
+
["RedshiftDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39791
|
+
["RedshiftDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
|
|
39792
|
+
["S3DestinationConfiguration", ["BucketARN", "RoleARN"]],
|
|
39793
|
+
["S3DestinationConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39794
|
+
["SnowflakeDestinationConfiguration", [
|
|
39795
|
+
"AccountUrl",
|
|
39796
|
+
"Database",
|
|
39797
|
+
"RoleARN",
|
|
39798
|
+
"S3Configuration",
|
|
39799
|
+
"Schema",
|
|
39800
|
+
"Table"
|
|
39801
|
+
]],
|
|
39802
|
+
["SnowflakeDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39803
|
+
["SnowflakeDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39804
|
+
["SnowflakeDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39805
|
+
["SnowflakeDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39806
|
+
["SnowflakeDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
|
|
39807
|
+
["SnowflakeDestinationConfiguration.SnowflakeVpcConfiguration", ["PrivateLinkVpceId"]],
|
|
39808
|
+
["SplunkDestinationConfiguration", [
|
|
39809
|
+
"HECEndpoint",
|
|
39810
|
+
"HECEndpointType",
|
|
39811
|
+
"S3Configuration"
|
|
39812
|
+
]],
|
|
39813
|
+
["SplunkDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
|
|
39814
|
+
["SplunkDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
|
|
39815
|
+
["SplunkDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
|
|
39816
|
+
["SplunkDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
|
|
39817
|
+
["SplunkDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
|
|
39818
|
+
["Tags", ["Key"]]
|
|
39819
|
+
])],
|
|
39820
|
+
["AWS::KMS::Key", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39821
|
+
["AWS::Lambda::EventInvokeConfig", /* @__PURE__ */ new Map([["DestinationConfig.OnFailure", ["Destination"]], ["DestinationConfig.OnSuccess", ["Destination"]]])],
|
|
39822
|
+
["AWS::Lambda::EventSourceMapping", /* @__PURE__ */ new Map([["Tags", ["Key"]]])],
|
|
39823
|
+
["AWS::Lambda::Function", /* @__PURE__ */ new Map([
|
|
39824
|
+
["CapacityProviderConfig", ["LambdaManagedInstancesCapacityProviderConfig"]],
|
|
39825
|
+
["CapacityProviderConfig.LambdaManagedInstancesCapacityProviderConfig", ["CapacityProviderArn"]],
|
|
39826
|
+
["DurableConfig", ["ExecutionTimeout"]],
|
|
39827
|
+
["EphemeralStorage", ["Size"]],
|
|
39828
|
+
["FileSystemConfigs", ["Arn", "LocalMountPath"]],
|
|
39829
|
+
["RuntimeManagementConfig", ["UpdateRuntimeOn"]],
|
|
39830
|
+
["SnapStart", ["ApplyOn"]],
|
|
39831
|
+
["Tags", ["Key"]],
|
|
39832
|
+
["TenancyConfig", ["TenantIsolationMode"]]
|
|
39833
|
+
])],
|
|
39834
|
+
["AWS::Lambda::LayerVersion", /* @__PURE__ */ new Map([["Content", ["S3Bucket", "S3Key"]]])],
|
|
39835
|
+
["AWS::Lambda::MicrovmImage", /* @__PURE__ */ new Map([
|
|
39836
|
+
["CodeArtifact", ["Uri"]],
|
|
39837
|
+
["CpuConfigurations", ["Architecture"]],
|
|
39838
|
+
["EnvironmentVariables", ["Key", "Value"]],
|
|
39839
|
+
["Resources", ["MinimumMemoryInMiB"]],
|
|
39840
|
+
["Tags", ["Key"]]
|
|
39841
|
+
])],
|
|
39842
|
+
["AWS::Logs::LogGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39843
|
+
["AWS::Neptune::DBCluster", /* @__PURE__ */ new Map([
|
|
39844
|
+
["AssociatedRoles", ["RoleArn"]],
|
|
39845
|
+
["ServerlessScalingConfiguration", ["MaxCapacity", "MinCapacity"]],
|
|
39846
|
+
["Tags", ["Key"]]
|
|
39847
|
+
])],
|
|
39848
|
+
["AWS::Neptune::DBInstance", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39849
|
+
["AWS::Neptune::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39850
|
+
["AWS::RDS::DBCluster", /* @__PURE__ */ new Map([["AssociatedRoles", ["RoleArn"]], ["Tags", ["Key"]]])],
|
|
39851
|
+
["AWS::RDS::DBInstance", /* @__PURE__ */ new Map([["AssociatedRoles", ["FeatureName", "RoleArn"]], ["Tags", ["Key"]]])],
|
|
39852
|
+
["AWS::RDS::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key"]]])],
|
|
39853
|
+
["AWS::Route53::HostedZone", /* @__PURE__ */ new Map([
|
|
39854
|
+
["HostedZoneTags", ["Key", "Value"]],
|
|
39855
|
+
["QueryLoggingConfig", ["CloudWatchLogsLogGroupArn"]],
|
|
39856
|
+
["VPCs", ["VPCId", "VPCRegion"]]
|
|
39857
|
+
])],
|
|
39858
|
+
["AWS::Route53::RecordSet", /* @__PURE__ */ new Map([["AliasTarget", ["DNSName", "HostedZoneId"]], ["CidrRoutingConfig", ["CollectionId", "LocationName"]]])],
|
|
39859
|
+
["AWS::S3::Bucket", /* @__PURE__ */ new Map([
|
|
39860
|
+
["AccelerateConfiguration", ["AccelerationStatus"]],
|
|
39861
|
+
["AnalyticsConfigurations", ["Id", "StorageClassAnalysis"]],
|
|
39862
|
+
["AnalyticsConfigurations.StorageClassAnalysis.DataExport", ["Destination", "OutputSchemaVersion"]],
|
|
39863
|
+
["AnalyticsConfigurations.StorageClassAnalysis.DataExport.Destination", ["BucketArn", "Format"]],
|
|
39864
|
+
["AnalyticsConfigurations.TagFilters", ["Key", "Value"]],
|
|
39865
|
+
["BucketEncryption", ["ServerSideEncryptionConfiguration"]],
|
|
39866
|
+
["BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault", ["SSEAlgorithm"]],
|
|
39867
|
+
["CorsConfiguration", ["CorsRules"]],
|
|
39868
|
+
["CorsConfiguration.CorsRules", ["AllowedMethods", "AllowedOrigins"]],
|
|
39869
|
+
["IntelligentTieringConfigurations", [
|
|
39870
|
+
"Id",
|
|
39871
|
+
"Status",
|
|
39872
|
+
"Tierings"
|
|
39873
|
+
]],
|
|
39874
|
+
["IntelligentTieringConfigurations.TagFilters", ["Key", "Value"]],
|
|
39875
|
+
["IntelligentTieringConfigurations.Tierings", ["AccessTier", "Days"]],
|
|
39876
|
+
["InventoryConfigurations", [
|
|
39877
|
+
"Destination",
|
|
39878
|
+
"Enabled",
|
|
39879
|
+
"Id",
|
|
39880
|
+
"IncludedObjectVersions",
|
|
39881
|
+
"ScheduleFrequency"
|
|
39882
|
+
]],
|
|
39883
|
+
["InventoryConfigurations.Destination", ["BucketArn", "Format"]],
|
|
39884
|
+
["LifecycleConfiguration", ["Rules"]],
|
|
39885
|
+
["LifecycleConfiguration.Rules", ["Status"]],
|
|
39886
|
+
["LifecycleConfiguration.Rules.AbortIncompleteMultipartUpload", ["DaysAfterInitiation"]],
|
|
39887
|
+
["LifecycleConfiguration.Rules.NoncurrentVersionExpiration", ["NoncurrentDays"]],
|
|
39888
|
+
["LifecycleConfiguration.Rules.NoncurrentVersionTransition", ["StorageClass", "TransitionInDays"]],
|
|
39889
|
+
["LifecycleConfiguration.Rules.NoncurrentVersionTransitions", ["StorageClass", "TransitionInDays"]],
|
|
39890
|
+
["LifecycleConfiguration.Rules.TagFilters", ["Key", "Value"]],
|
|
39891
|
+
["LifecycleConfiguration.Rules.Transition", ["StorageClass"]],
|
|
39892
|
+
["LifecycleConfiguration.Rules.Transitions", ["StorageClass"]],
|
|
39893
|
+
["MetadataConfiguration", ["JournalTableConfiguration"]],
|
|
39894
|
+
["MetadataConfiguration.AnnotationTableConfiguration", ["ConfigurationState"]],
|
|
39895
|
+
["MetadataConfiguration.AnnotationTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
|
|
39896
|
+
["MetadataConfiguration.Destination", ["TableBucketType"]],
|
|
39897
|
+
["MetadataConfiguration.InventoryTableConfiguration", ["ConfigurationState"]],
|
|
39898
|
+
["MetadataConfiguration.InventoryTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
|
|
39899
|
+
["MetadataConfiguration.JournalTableConfiguration", ["RecordExpiration"]],
|
|
39900
|
+
["MetadataConfiguration.JournalTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
|
|
39901
|
+
["MetadataConfiguration.JournalTableConfiguration.RecordExpiration", ["Expiration"]],
|
|
39902
|
+
["MetadataTableConfiguration", ["S3TablesDestination"]],
|
|
39903
|
+
["MetadataTableConfiguration.S3TablesDestination", ["TableBucketArn", "TableName"]],
|
|
39904
|
+
["MetricsConfigurations", ["Id"]],
|
|
39905
|
+
["MetricsConfigurations.TagFilters", ["Key", "Value"]],
|
|
39906
|
+
["NotificationConfiguration.EventBridgeConfiguration", ["EventBridgeEnabled"]],
|
|
39907
|
+
["NotificationConfiguration.LambdaConfigurations", ["Event", "Function"]],
|
|
39908
|
+
["NotificationConfiguration.LambdaConfigurations.Filter", ["S3Key"]],
|
|
39909
|
+
["NotificationConfiguration.LambdaConfigurations.Filter.S3Key", ["Rules"]],
|
|
39910
|
+
["NotificationConfiguration.LambdaConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
|
|
39911
|
+
["NotificationConfiguration.QueueConfigurations", ["Event", "Queue"]],
|
|
39912
|
+
["NotificationConfiguration.QueueConfigurations.Filter", ["S3Key"]],
|
|
39913
|
+
["NotificationConfiguration.QueueConfigurations.Filter.S3Key", ["Rules"]],
|
|
39914
|
+
["NotificationConfiguration.QueueConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
|
|
39915
|
+
["NotificationConfiguration.TopicConfigurations", ["Event", "Topic"]],
|
|
39916
|
+
["NotificationConfiguration.TopicConfigurations.Filter", ["S3Key"]],
|
|
39917
|
+
["NotificationConfiguration.TopicConfigurations.Filter.S3Key", ["Rules"]],
|
|
39918
|
+
["NotificationConfiguration.TopicConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
|
|
39919
|
+
["OwnershipControls", ["Rules"]],
|
|
39920
|
+
["ReplicationConfiguration", ["Role", "Rules"]],
|
|
39921
|
+
["ReplicationConfiguration.Rules", ["Destination", "Status"]],
|
|
39922
|
+
["ReplicationConfiguration.Rules.Destination", ["Bucket"]],
|
|
39923
|
+
["ReplicationConfiguration.Rules.Destination.AccessControlTranslation", ["Owner"]],
|
|
39924
|
+
["ReplicationConfiguration.Rules.Destination.EncryptionConfiguration", ["ReplicaKmsKeyID"]],
|
|
39925
|
+
["ReplicationConfiguration.Rules.Destination.Metrics", ["Status"]],
|
|
39926
|
+
["ReplicationConfiguration.Rules.Destination.Metrics.EventThreshold", ["Minutes"]],
|
|
39927
|
+
["ReplicationConfiguration.Rules.Destination.ReplicationTime", ["Status", "Time"]],
|
|
39928
|
+
["ReplicationConfiguration.Rules.Destination.ReplicationTime.Time", ["Minutes"]],
|
|
39929
|
+
["ReplicationConfiguration.Rules.Filter.And.TagFilters", ["Key", "Value"]],
|
|
39930
|
+
["ReplicationConfiguration.Rules.Filter.TagFilter", ["Key", "Value"]],
|
|
39931
|
+
["ReplicationConfiguration.Rules.SourceSelectionCriteria.ReplicaModifications", ["Status"]],
|
|
39932
|
+
["ReplicationConfiguration.Rules.SourceSelectionCriteria.SseKmsEncryptedObjects", ["Status"]],
|
|
39933
|
+
["Tags", ["Key", "Value"]],
|
|
39934
|
+
["VersioningConfiguration", ["Status"]],
|
|
39935
|
+
["WebsiteConfiguration.RedirectAllRequestsTo", ["HostName"]],
|
|
39936
|
+
["WebsiteConfiguration.RoutingRules", ["RedirectRule"]]
|
|
39937
|
+
])],
|
|
39938
|
+
["AWS::S3Express::DirectoryBucket", /* @__PURE__ */ new Map([
|
|
39939
|
+
["BucketEncryption", ["ServerSideEncryptionConfiguration"]],
|
|
39940
|
+
["BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault", ["SSEAlgorithm"]],
|
|
39941
|
+
["InventoryConfigurations", [
|
|
39942
|
+
"Destination",
|
|
39943
|
+
"Enabled",
|
|
39944
|
+
"Id",
|
|
39945
|
+
"IncludedObjectVersions",
|
|
39946
|
+
"ScheduleFrequency"
|
|
39947
|
+
]],
|
|
39948
|
+
["InventoryConfigurations.Destination", ["BucketArn", "Format"]],
|
|
39949
|
+
["LifecycleConfiguration", ["Rules"]],
|
|
39950
|
+
["LifecycleConfiguration.Rules", ["Status"]],
|
|
39951
|
+
["LifecycleConfiguration.Rules.AbortIncompleteMultipartUpload", ["DaysAfterInitiation"]],
|
|
39952
|
+
["MetricsConfigurations", ["Id"]],
|
|
39953
|
+
["Tags", ["Key", "Value"]]
|
|
39954
|
+
])],
|
|
39955
|
+
["AWS::S3Tables::Table", /* @__PURE__ */ new Map([
|
|
39956
|
+
["IcebergMetadata.IcebergPartitionSpec", ["Fields"]],
|
|
39957
|
+
["IcebergMetadata.IcebergPartitionSpec.Fields", [
|
|
39958
|
+
"Name",
|
|
39959
|
+
"SourceId",
|
|
39960
|
+
"Transform"
|
|
39961
|
+
]],
|
|
39962
|
+
["IcebergMetadata.IcebergSchema", ["SchemaFieldList"]],
|
|
39963
|
+
["IcebergMetadata.IcebergSchema.SchemaFieldList", ["Name", "Type"]],
|
|
39964
|
+
["IcebergMetadata.IcebergSchemaV2", ["SchemaV2FieldList", "SchemaV2FieldType"]],
|
|
39965
|
+
["IcebergMetadata.IcebergSchemaV2.SchemaV2FieldList", [
|
|
39966
|
+
"Id",
|
|
39967
|
+
"Name",
|
|
39968
|
+
"Required",
|
|
39969
|
+
"Type"
|
|
39970
|
+
]],
|
|
39971
|
+
["IcebergMetadata.IcebergSortOrder", ["Fields"]],
|
|
39972
|
+
["IcebergMetadata.IcebergSortOrder.Fields", [
|
|
39973
|
+
"Direction",
|
|
39974
|
+
"NullOrder",
|
|
39975
|
+
"SourceId",
|
|
39976
|
+
"Transform"
|
|
39977
|
+
]],
|
|
39978
|
+
["Tags", ["Key", "Value"]]
|
|
39979
|
+
])],
|
|
39980
|
+
["AWS::S3Tables::TableBucket", /* @__PURE__ */ new Map([
|
|
39981
|
+
["ReplicationConfiguration", ["Role", "Rules"]],
|
|
39982
|
+
["ReplicationConfiguration.Rules", ["Destinations"]],
|
|
39983
|
+
["ReplicationConfiguration.Rules.Destinations", ["DestinationTableBucketARN"]],
|
|
39984
|
+
["Tags", ["Key", "Value"]]
|
|
39985
|
+
])],
|
|
39986
|
+
["AWS::S3Vectors::VectorBucket", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39987
|
+
["AWS::Scheduler::Schedule", /* @__PURE__ */ new Map([
|
|
39988
|
+
["FlexibleTimeWindow", ["Mode"]],
|
|
39989
|
+
["Target", ["Arn", "RoleArn"]],
|
|
39990
|
+
["Target.EcsParameters", ["TaskDefinitionArn"]],
|
|
39991
|
+
["Target.EcsParameters.CapacityProviderStrategy", ["CapacityProvider"]],
|
|
39992
|
+
["Target.EcsParameters.NetworkConfiguration.AwsvpcConfiguration", ["Subnets"]],
|
|
39993
|
+
["Target.EventBridgeParameters", ["DetailType", "Source"]],
|
|
39994
|
+
["Target.KinesisParameters", ["PartitionKey"]],
|
|
39995
|
+
["Target.SageMakerPipelineParameters.PipelineParameterList", ["Name", "Value"]]
|
|
39996
|
+
])],
|
|
39997
|
+
["AWS::SecretsManager::Secret", /* @__PURE__ */ new Map([["ReplicaRegions", ["Region"]], ["Tags", ["Key", "Value"]]])],
|
|
39998
|
+
["AWS::ServiceDiscovery::HttpNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
39999
|
+
["AWS::ServiceDiscovery::PrivateDnsNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
40000
|
+
["AWS::ServiceDiscovery::PublicDnsNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
40001
|
+
["AWS::ServiceDiscovery::Service", /* @__PURE__ */ new Map([
|
|
40002
|
+
["DnsConfig", ["DnsRecords"]],
|
|
40003
|
+
["DnsConfig.DnsRecords", ["TTL", "Type"]],
|
|
40004
|
+
["HealthCheckConfig", ["Type"]],
|
|
40005
|
+
["Tags", ["Key", "Value"]]
|
|
40006
|
+
])],
|
|
40007
|
+
["AWS::SNS::Topic", /* @__PURE__ */ new Map([
|
|
40008
|
+
["DeliveryStatusLogging", ["Protocol"]],
|
|
40009
|
+
["Subscription", ["Endpoint", "Protocol"]],
|
|
40010
|
+
["Tags", ["Key", "Value"]]
|
|
40011
|
+
])],
|
|
40012
|
+
["AWS::SQS::Queue", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
|
|
40013
|
+
["AWS::StepFunctions::StateMachine", /* @__PURE__ */ new Map([
|
|
40014
|
+
["DefinitionS3Location", ["Bucket", "Key"]],
|
|
40015
|
+
["EncryptionConfiguration", ["Type"]],
|
|
40016
|
+
["Tags", ["Key", "Value"]]
|
|
40017
|
+
])],
|
|
40018
|
+
["AWS::WAFv2::WebACL", /* @__PURE__ */ new Map([
|
|
40019
|
+
["ApplicationConfig", ["Attributes"]],
|
|
40020
|
+
["ApplicationConfig.Attributes", ["Name", "Values"]],
|
|
40021
|
+
["CaptchaConfig.ImmunityTimeProperty", ["ImmunityTime"]],
|
|
40022
|
+
["ChallengeConfig.ImmunityTimeProperty", ["ImmunityTime"]],
|
|
40023
|
+
["DataProtectionConfig", ["DataProtections"]],
|
|
40024
|
+
["DataProtectionConfig.DataProtections", ["Action", "Field"]],
|
|
40025
|
+
["DataProtectionConfig.DataProtections.Field", ["FieldType"]],
|
|
40026
|
+
["DefaultAction.Allow.CustomRequestHandling", ["InsertHeaders"]],
|
|
40027
|
+
["DefaultAction.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40028
|
+
["DefaultAction.Block.CustomResponse", ["ResponseCode"]],
|
|
40029
|
+
["DefaultAction.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
|
|
40030
|
+
["MonetizationConfig.CryptoConfig", ["PaymentNetworks"]],
|
|
40031
|
+
["MonetizationConfig.CryptoConfig.PaymentNetworks", [
|
|
40032
|
+
"Chain",
|
|
40033
|
+
"Prices",
|
|
40034
|
+
"WalletAddress"
|
|
40035
|
+
]],
|
|
40036
|
+
["MonetizationConfig.CryptoConfig.PaymentNetworks.Prices", ["Amount", "Currency"]],
|
|
40037
|
+
["OnSourceDDoSProtectionConfig", ["ALBLowReputationMode"]],
|
|
40038
|
+
["Rules", [
|
|
40039
|
+
"Name",
|
|
40040
|
+
"Priority",
|
|
40041
|
+
"Statement",
|
|
40042
|
+
"VisibilityConfig"
|
|
40043
|
+
]],
|
|
40044
|
+
["Rules.Action.Allow.CustomRequestHandling", ["InsertHeaders"]],
|
|
40045
|
+
["Rules.Action.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40046
|
+
["Rules.Action.Block.CustomResponse", ["ResponseCode"]],
|
|
40047
|
+
["Rules.Action.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
|
|
40048
|
+
["Rules.Action.Captcha.CustomRequestHandling", ["InsertHeaders"]],
|
|
40049
|
+
["Rules.Action.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40050
|
+
["Rules.Action.Challenge.CustomRequestHandling", ["InsertHeaders"]],
|
|
40051
|
+
["Rules.Action.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40052
|
+
["Rules.Action.Count.CustomRequestHandling", ["InsertHeaders"]],
|
|
40053
|
+
["Rules.Action.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40054
|
+
["Rules.CaptchaConfig.ImmunityTimeProperty", ["ImmunityTime"]],
|
|
40055
|
+
["Rules.ChallengeConfig.ImmunityTimeProperty", ["ImmunityTime"]],
|
|
40056
|
+
["Rules.RuleLabels", ["Name"]],
|
|
40057
|
+
["Rules.Statement.AndStatement", ["Statements"]],
|
|
40058
|
+
["Rules.Statement.AsnMatchStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
|
|
40059
|
+
["Rules.Statement.ByteMatchStatement", [
|
|
40060
|
+
"FieldToMatch",
|
|
40061
|
+
"PositionalConstraint",
|
|
40062
|
+
"TextTransformations"
|
|
40063
|
+
]],
|
|
40064
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.Cookies", [
|
|
40065
|
+
"MatchPattern",
|
|
40066
|
+
"MatchScope",
|
|
40067
|
+
"OversizeHandling"
|
|
40068
|
+
]],
|
|
40069
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40070
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.Headers", [
|
|
40071
|
+
"MatchPattern",
|
|
40072
|
+
"MatchScope",
|
|
40073
|
+
"OversizeHandling"
|
|
40074
|
+
]],
|
|
40075
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40076
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40077
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40078
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40079
|
+
["Rules.Statement.ByteMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40080
|
+
["Rules.Statement.ByteMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40081
|
+
["Rules.Statement.ByteMatchStatement.TextTransformations", ["Priority", "Type"]],
|
|
40082
|
+
["Rules.Statement.GeoMatchStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
|
|
40083
|
+
["Rules.Statement.IPSetReferenceStatement", ["Arn"]],
|
|
40084
|
+
["Rules.Statement.IPSetReferenceStatement.IPSetForwardedIPConfig", [
|
|
40085
|
+
"FallbackBehavior",
|
|
40086
|
+
"HeaderName",
|
|
40087
|
+
"Position"
|
|
40088
|
+
]],
|
|
40089
|
+
["Rules.Statement.LabelMatchStatement", ["Key", "Scope"]],
|
|
40090
|
+
["Rules.Statement.ManagedRuleGroupStatement", ["Name", "VendorName"]],
|
|
40091
|
+
["Rules.Statement.ManagedRuleGroupStatement.ExcludedRules", ["Name"]],
|
|
40092
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet", [
|
|
40093
|
+
"CreationPath",
|
|
40094
|
+
"RegistrationPagePath",
|
|
40095
|
+
"RequestInspection"
|
|
40096
|
+
]],
|
|
40097
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection", ["PayloadType"]],
|
|
40098
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.AddressFields", ["Identifier"]],
|
|
40099
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.EmailField", ["Identifier"]],
|
|
40100
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.PasswordField", ["Identifier"]],
|
|
40101
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.PhoneNumberFields", ["Identifier"]],
|
|
40102
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.UsernameField", ["Identifier"]],
|
|
40103
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.BodyContains", ["FailureStrings", "SuccessStrings"]],
|
|
40104
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.Header", [
|
|
40105
|
+
"FailureValues",
|
|
40106
|
+
"Name",
|
|
40107
|
+
"SuccessValues"
|
|
40108
|
+
]],
|
|
40109
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.Json", [
|
|
40110
|
+
"FailureValues",
|
|
40111
|
+
"Identifier",
|
|
40112
|
+
"SuccessValues"
|
|
40113
|
+
]],
|
|
40114
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.StatusCode", ["FailureCodes", "SuccessCodes"]],
|
|
40115
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet", ["LoginPath"]],
|
|
40116
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection", [
|
|
40117
|
+
"PasswordField",
|
|
40118
|
+
"PayloadType",
|
|
40119
|
+
"UsernameField"
|
|
40120
|
+
]],
|
|
40121
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection.PasswordField", ["Identifier"]],
|
|
40122
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection.UsernameField", ["Identifier"]],
|
|
40123
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.BodyContains", ["FailureStrings", "SuccessStrings"]],
|
|
40124
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.Header", [
|
|
40125
|
+
"FailureValues",
|
|
40126
|
+
"Name",
|
|
40127
|
+
"SuccessValues"
|
|
40128
|
+
]],
|
|
40129
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.Json", [
|
|
40130
|
+
"FailureValues",
|
|
40131
|
+
"Identifier",
|
|
40132
|
+
"SuccessValues"
|
|
40133
|
+
]],
|
|
40134
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.StatusCode", ["FailureCodes", "SuccessCodes"]],
|
|
40135
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet", ["ClientSideActionConfig"]],
|
|
40136
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet.ClientSideActionConfig", ["Challenge"]],
|
|
40137
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet.ClientSideActionConfig.Challenge", ["UsageOfAction"]],
|
|
40138
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesBotControlRuleSet", ["InspectionLevel"]],
|
|
40139
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.PasswordField", ["Identifier"]],
|
|
40140
|
+
["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.UsernameField", ["Identifier"]],
|
|
40141
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides", ["ActionToUse", "Name"]],
|
|
40142
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling", ["InsertHeaders"]],
|
|
40143
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40144
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse", ["ResponseCode"]],
|
|
40145
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
|
|
40146
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling", ["InsertHeaders"]],
|
|
40147
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40148
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling", ["InsertHeaders"]],
|
|
40149
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40150
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling", ["InsertHeaders"]],
|
|
40151
|
+
["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40152
|
+
["Rules.Statement.NotStatement", ["Statement"]],
|
|
40153
|
+
["Rules.Statement.OrStatement", ["Statements"]],
|
|
40154
|
+
["Rules.Statement.RateBasedStatement", ["AggregateKeyType", "Limit"]],
|
|
40155
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.Cookie", ["Name", "TextTransformations"]],
|
|
40156
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.Cookie.TextTransformations", ["Priority", "Type"]],
|
|
40157
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.Header", ["Name", "TextTransformations"]],
|
|
40158
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.Header.TextTransformations", ["Priority", "Type"]],
|
|
40159
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40160
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40161
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.LabelNamespace", ["Namespace"]],
|
|
40162
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.QueryArgument", ["Name", "TextTransformations"]],
|
|
40163
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.QueryArgument.TextTransformations", ["Priority", "Type"]],
|
|
40164
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.QueryString", ["TextTransformations"]],
|
|
40165
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.QueryString.TextTransformations", ["Priority", "Type"]],
|
|
40166
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.UriPath", ["TextTransformations"]],
|
|
40167
|
+
["Rules.Statement.RateBasedStatement.CustomKeys.UriPath.TextTransformations", ["Priority", "Type"]],
|
|
40168
|
+
["Rules.Statement.RateBasedStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
|
|
40169
|
+
["Rules.Statement.RegexMatchStatement", [
|
|
40170
|
+
"FieldToMatch",
|
|
40171
|
+
"RegexString",
|
|
40172
|
+
"TextTransformations"
|
|
40173
|
+
]],
|
|
40174
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.Cookies", [
|
|
40175
|
+
"MatchPattern",
|
|
40176
|
+
"MatchScope",
|
|
40177
|
+
"OversizeHandling"
|
|
40178
|
+
]],
|
|
40179
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40180
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.Headers", [
|
|
40181
|
+
"MatchPattern",
|
|
40182
|
+
"MatchScope",
|
|
40183
|
+
"OversizeHandling"
|
|
40184
|
+
]],
|
|
40185
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40186
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40187
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40188
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40189
|
+
["Rules.Statement.RegexMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40190
|
+
["Rules.Statement.RegexMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40191
|
+
["Rules.Statement.RegexMatchStatement.TextTransformations", ["Priority", "Type"]],
|
|
40192
|
+
["Rules.Statement.RegexPatternSetReferenceStatement", [
|
|
40193
|
+
"Arn",
|
|
40194
|
+
"FieldToMatch",
|
|
40195
|
+
"TextTransformations"
|
|
40196
|
+
]],
|
|
40197
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.Cookies", [
|
|
40198
|
+
"MatchPattern",
|
|
40199
|
+
"MatchScope",
|
|
40200
|
+
"OversizeHandling"
|
|
40201
|
+
]],
|
|
40202
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40203
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.Headers", [
|
|
40204
|
+
"MatchPattern",
|
|
40205
|
+
"MatchScope",
|
|
40206
|
+
"OversizeHandling"
|
|
40207
|
+
]],
|
|
40208
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40209
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40210
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40211
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40212
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40213
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40214
|
+
["Rules.Statement.RegexPatternSetReferenceStatement.TextTransformations", ["Priority", "Type"]],
|
|
40215
|
+
["Rules.Statement.RuleGroupReferenceStatement", ["Arn"]],
|
|
40216
|
+
["Rules.Statement.RuleGroupReferenceStatement.ExcludedRules", ["Name"]],
|
|
40217
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides", ["ActionToUse", "Name"]],
|
|
40218
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling", ["InsertHeaders"]],
|
|
40219
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40220
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse", ["ResponseCode"]],
|
|
40221
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
|
|
40222
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling", ["InsertHeaders"]],
|
|
40223
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40224
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling", ["InsertHeaders"]],
|
|
40225
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40226
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling", ["InsertHeaders"]],
|
|
40227
|
+
["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
|
|
40228
|
+
["Rules.Statement.SizeConstraintStatement", [
|
|
40229
|
+
"ComparisonOperator",
|
|
40230
|
+
"FieldToMatch",
|
|
40231
|
+
"Size",
|
|
40232
|
+
"TextTransformations"
|
|
40233
|
+
]],
|
|
40234
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.Cookies", [
|
|
40235
|
+
"MatchPattern",
|
|
40236
|
+
"MatchScope",
|
|
40237
|
+
"OversizeHandling"
|
|
40238
|
+
]],
|
|
40239
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40240
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.Headers", [
|
|
40241
|
+
"MatchPattern",
|
|
40242
|
+
"MatchScope",
|
|
40243
|
+
"OversizeHandling"
|
|
40244
|
+
]],
|
|
40245
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40246
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40247
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40248
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40249
|
+
["Rules.Statement.SizeConstraintStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40250
|
+
["Rules.Statement.SizeConstraintStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40251
|
+
["Rules.Statement.SizeConstraintStatement.TextTransformations", ["Priority", "Type"]],
|
|
40252
|
+
["Rules.Statement.SqliMatchStatement", ["FieldToMatch", "TextTransformations"]],
|
|
40253
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.Cookies", [
|
|
40254
|
+
"MatchPattern",
|
|
40255
|
+
"MatchScope",
|
|
40256
|
+
"OversizeHandling"
|
|
40257
|
+
]],
|
|
40258
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40259
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.Headers", [
|
|
40260
|
+
"MatchPattern",
|
|
40261
|
+
"MatchScope",
|
|
40262
|
+
"OversizeHandling"
|
|
40263
|
+
]],
|
|
40264
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40265
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40266
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40267
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40268
|
+
["Rules.Statement.SqliMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40269
|
+
["Rules.Statement.SqliMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40270
|
+
["Rules.Statement.SqliMatchStatement.TextTransformations", ["Priority", "Type"]],
|
|
40271
|
+
["Rules.Statement.XssMatchStatement", ["FieldToMatch", "TextTransformations"]],
|
|
40272
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.Cookies", [
|
|
40273
|
+
"MatchPattern",
|
|
40274
|
+
"MatchScope",
|
|
40275
|
+
"OversizeHandling"
|
|
40276
|
+
]],
|
|
40277
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
|
|
40278
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.Headers", [
|
|
40279
|
+
"MatchPattern",
|
|
40280
|
+
"MatchScope",
|
|
40281
|
+
"OversizeHandling"
|
|
40282
|
+
]],
|
|
40283
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
|
|
40284
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
|
|
40285
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
|
|
40286
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
|
|
40287
|
+
["Rules.Statement.XssMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
|
|
40288
|
+
["Rules.Statement.XssMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
|
|
40289
|
+
["Rules.Statement.XssMatchStatement.TextTransformations", ["Priority", "Type"]],
|
|
40290
|
+
["Rules.VisibilityConfig", [
|
|
40291
|
+
"CloudWatchMetricsEnabled",
|
|
40292
|
+
"MetricName",
|
|
40293
|
+
"SampledRequestsEnabled"
|
|
40294
|
+
]],
|
|
40295
|
+
["VisibilityConfig", [
|
|
40296
|
+
"CloudWatchMetricsEnabled",
|
|
40297
|
+
"MetricName",
|
|
40298
|
+
"SampledRequestsEnabled"
|
|
40299
|
+
]]
|
|
40300
|
+
])]
|
|
40301
|
+
]);
|
|
40302
|
+
|
|
40303
|
+
//#endregion
|
|
40304
|
+
//#region src/provisioning/nested-required.ts
|
|
40305
|
+
/**
|
|
40306
|
+
* Pre-flight rule: a PRESENT nested property block must carry every member its
|
|
40307
|
+
* schema definition lists as `required` (issue
|
|
40308
|
+
* [#1802](https://github.com/go-to-k/cdkd/issues/1802)).
|
|
40309
|
+
*
|
|
40310
|
+
* CloudFormation refuses such a block before it touches AWS. cdkd forwarded
|
|
40311
|
+
* it, and where the service API replaces the nested struct wholesale the
|
|
40312
|
+
* result was a silent change to a live setting: a kept
|
|
40313
|
+
* `AWS::ECS::Service.DeploymentConfiguration.DeploymentCircuitBreaker` without
|
|
40314
|
+
* `Rollback` flipped the live `rollback` from true to false. Cloud Control
|
|
40315
|
+
* validates against the same schema server-side, so the gap is SDK-provider
|
|
40316
|
+
* scoped; running the check for every resource is correct-but-redundant on the
|
|
40317
|
+
* Cloud Control route. Same layer and same reasons as
|
|
40318
|
+
* {@link ./mutually-exclusive-properties}: pre-flight runs on every deploy, not
|
|
40319
|
+
* only when the provider is called.
|
|
40320
|
+
*
|
|
40321
|
+
* ## Refuse only what CloudFormation refuses
|
|
40322
|
+
*
|
|
40323
|
+
* - An ABSENT block is never a violation — only a present one missing a member.
|
|
40324
|
+
* - Pre-flight runs BEFORE intrinsic resolution, so any value along the path
|
|
40325
|
+
* that is an unresolved intrinsic (`Fn::If`, `Ref`, ...) is UNKNOWN and its
|
|
40326
|
+
* subtree is skipped. A member is present when its KEY is, whatever the value
|
|
40327
|
+
* (`false`, `0`, `null`, or an intrinsic that may resolve to
|
|
40328
|
+
* `AWS::NoValue`). Every doubt passes through: a false refusal blocks a valid
|
|
40329
|
+
* deploy with no escape hatch, a missed one reaches AWS as it did before.
|
|
40330
|
+
* - {@link CFN_ENFORCED_TYPES} gates the whole check. A schema's `required`
|
|
40331
|
+
* list is NOT evidence that CloudFormation enforces it: measured, CFn accepted
|
|
40332
|
+
* an `AWS::Logs::LogGroup` tag with neither `Key` nor `Value`, and sent an
|
|
40333
|
+
* `AWS::EC2::SecurityGroup` ingress rule without `IpProtocol` to the EC2 API.
|
|
40334
|
+
*
|
|
40335
|
+
* ## No override flag, by design
|
|
40336
|
+
*
|
|
40337
|
+
* The violation is in the TEMPLATE, CloudFormation rejects it too, and the
|
|
40338
|
+
* remedy (declare the missing member) is always available.
|
|
40339
|
+
*/
|
|
40340
|
+
/**
|
|
40341
|
+
* Types whose nested `required` lists CloudFormation was MEASURED to enforce.
|
|
40342
|
+
* One template per type declared
|
|
40343
|
+
* every nested block of `NESTED_REQUIRED` empty; a type is listed only when
|
|
40344
|
+
* CloudFormation refused EVERY missing member the table predicts:
|
|
40345
|
+
*
|
|
40346
|
+
* - 64 types by early validation of a CREATE change set (nothing provisioned):
|
|
40347
|
+
* `PROPERTY_VALIDATION` / "Required property [X] not found".
|
|
40348
|
+
* - 7 types early validation passed, refused at execution before any API call:
|
|
40349
|
+
* `Model validation failed` / `Properties validation failed` /
|
|
40350
|
+
* `Property validation failure` (ECS Service + TaskDefinition, EFS
|
|
40351
|
+
* AccessPoint, Lambda EventSourceMapping, Step Functions StateMachine,
|
|
40352
|
+
* API Gateway Method, AppSync GraphQLApi).
|
|
40353
|
+
* - 7 types with no registry handler, refused at execution by CloudFormation's
|
|
40354
|
+
* own `Property validation failure` list (Budgets Budget, CloudWatch
|
|
40355
|
+
* AnomalyDetector, CodeBuild Project, DocDB DBCluster + DBInstance, FSx
|
|
40356
|
+
* FileSystem, Glue Table).
|
|
40357
|
+
*
|
|
40358
|
+
* Measured NOT enforced by a schema check (a handler or service error instead,
|
|
40359
|
+
* or an accepted create): ApiGatewayV2 Route, CloudFormation Stack, EC2
|
|
40360
|
+
* SecurityGroup, ECR Repository, EFS FileSystem, ELBv2 Listener, KMS Key,
|
|
40361
|
+
* KinesisFirehose DeliveryStream, Logs LogGroup, Route53 HostedZone, WAFv2
|
|
40362
|
+
* WebACL. Left out because CloudFormation reports only the FIRST missing member
|
|
40363
|
+
* (`Property X cannot be empty.`), so the rest of the table was not confirmed:
|
|
40364
|
+
* EMR Cluster, InstanceFleetConfig, InstanceGroupConfig. A type in none of
|
|
40365
|
+
* these lists (added later) is not checked until it is measured.
|
|
40366
|
+
*/
|
|
40367
|
+
const CFN_ENFORCED_TYPES = /* @__PURE__ */ new Set([
|
|
40368
|
+
"AWS::ApiGateway::Deployment",
|
|
40369
|
+
"AWS::ApiGateway::Method",
|
|
40370
|
+
"AWS::ApiGateway::Stage",
|
|
40371
|
+
"AWS::AppSync::DataSource",
|
|
40372
|
+
"AWS::AppSync::GraphQLApi",
|
|
40373
|
+
"AWS::AppSync::Resolver",
|
|
40374
|
+
"AWS::AutoScaling::AutoScalingGroup",
|
|
40375
|
+
"AWS::BedrockAgentCore::Evaluator",
|
|
40376
|
+
"AWS::BedrockAgentCore::Runtime",
|
|
40377
|
+
"AWS::Budgets::Budget",
|
|
40378
|
+
"AWS::CertificateManager::Certificate",
|
|
40379
|
+
"AWS::CloudFront::CloudFrontOriginAccessIdentity",
|
|
40380
|
+
"AWS::CloudFront::Distribution",
|
|
40381
|
+
"AWS::CloudFront::OriginAccessControl",
|
|
40382
|
+
"AWS::CloudTrail::Trail",
|
|
40383
|
+
"AWS::CloudWatch::Alarm",
|
|
40384
|
+
"AWS::CloudWatch::AnomalyDetector",
|
|
40385
|
+
"AWS::CodeBuild::Project",
|
|
40386
|
+
"AWS::CodeCommit::Repository",
|
|
40387
|
+
"AWS::Cognito::UserPool",
|
|
40388
|
+
"AWS::DLM::LifecyclePolicy",
|
|
40389
|
+
"AWS::DocDB::DBCluster",
|
|
40390
|
+
"AWS::DocDB::DBInstance",
|
|
40391
|
+
"AWS::DocDB::DBSubnetGroup",
|
|
40392
|
+
"AWS::DynamoDB::GlobalTable",
|
|
40393
|
+
"AWS::DynamoDB::Table",
|
|
40394
|
+
"AWS::EC2::EIP",
|
|
40395
|
+
"AWS::EC2::Instance",
|
|
40396
|
+
"AWS::EC2::InternetGateway",
|
|
40397
|
+
"AWS::EC2::NatGateway",
|
|
40398
|
+
"AWS::EC2::NetworkAcl",
|
|
40399
|
+
"AWS::EC2::RouteTable",
|
|
40400
|
+
"AWS::EC2::Subnet",
|
|
40401
|
+
"AWS::EC2::VPC",
|
|
40402
|
+
"AWS::ECS::Service",
|
|
40403
|
+
"AWS::ECS::TaskDefinition",
|
|
40404
|
+
"AWS::EFS::AccessPoint",
|
|
40405
|
+
"AWS::ElastiCache::CacheCluster",
|
|
40406
|
+
"AWS::ElastiCache::SubnetGroup",
|
|
40407
|
+
"AWS::ElasticLoadBalancingV2::LoadBalancer",
|
|
40408
|
+
"AWS::ElasticLoadBalancingV2::TargetGroup",
|
|
40409
|
+
"AWS::Events::EventBus",
|
|
40410
|
+
"AWS::Events::Rule",
|
|
40411
|
+
"AWS::FSx::FileSystem",
|
|
40412
|
+
"AWS::Glue::Connection",
|
|
40413
|
+
"AWS::Glue::Table",
|
|
40414
|
+
"AWS::Glue::Trigger",
|
|
40415
|
+
"AWS::IAM::Group",
|
|
40416
|
+
"AWS::IAM::Role",
|
|
40417
|
+
"AWS::IAM::User",
|
|
40418
|
+
"AWS::Kinesis::Stream",
|
|
40419
|
+
"AWS::Kinesis::StreamConsumer",
|
|
40420
|
+
"AWS::Lambda::EventInvokeConfig",
|
|
40421
|
+
"AWS::Lambda::EventSourceMapping",
|
|
40422
|
+
"AWS::Lambda::Function",
|
|
40423
|
+
"AWS::Lambda::LayerVersion",
|
|
40424
|
+
"AWS::Lambda::MicrovmImage",
|
|
40425
|
+
"AWS::Neptune::DBCluster",
|
|
40426
|
+
"AWS::Neptune::DBInstance",
|
|
40427
|
+
"AWS::Neptune::DBSubnetGroup",
|
|
40428
|
+
"AWS::RDS::DBCluster",
|
|
40429
|
+
"AWS::RDS::DBInstance",
|
|
40430
|
+
"AWS::RDS::DBSubnetGroup",
|
|
40431
|
+
"AWS::Route53::RecordSet",
|
|
40432
|
+
"AWS::S3::Bucket",
|
|
40433
|
+
"AWS::S3Express::DirectoryBucket",
|
|
40434
|
+
"AWS::S3Tables::Table",
|
|
40435
|
+
"AWS::S3Tables::TableBucket",
|
|
40436
|
+
"AWS::S3Vectors::VectorBucket",
|
|
40437
|
+
"AWS::SNS::Topic",
|
|
40438
|
+
"AWS::SQS::Queue",
|
|
40439
|
+
"AWS::Scheduler::Schedule",
|
|
40440
|
+
"AWS::SecretsManager::Secret",
|
|
40441
|
+
"AWS::ServiceDiscovery::HttpNamespace",
|
|
40442
|
+
"AWS::ServiceDiscovery::PrivateDnsNamespace",
|
|
40443
|
+
"AWS::ServiceDiscovery::PublicDnsNamespace",
|
|
40444
|
+
"AWS::ServiceDiscovery::Service",
|
|
40445
|
+
"AWS::StepFunctions::StateMachine"
|
|
40446
|
+
]);
|
|
40447
|
+
/**
|
|
40448
|
+
* True for a single-key object whose key is `Ref` or `Fn::*`. The same
|
|
40449
|
+
* predicate as `mutually-exclusive-properties.ts` keeps local, for the same
|
|
40450
|
+
* reason: the modules answer different questions about the shape.
|
|
40451
|
+
*/
|
|
40452
|
+
function isUnresolvedIntrinsic(value) {
|
|
40453
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
40454
|
+
const keys = Object.keys(value);
|
|
40455
|
+
return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
|
|
40456
|
+
}
|
|
40457
|
+
/** A plain object whose members can be checked: not an array, not an intrinsic. */
|
|
40458
|
+
function isConcreteObject(value) {
|
|
40459
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !isUnresolvedIntrinsic(value);
|
|
40460
|
+
}
|
|
40461
|
+
/**
|
|
40462
|
+
* Find every present nested block of this resource that lacks a required
|
|
40463
|
+
* member. `table` defaults to the generated one gated by
|
|
40464
|
+
* {@link CFN_ENFORCED_TYPES}; tests pass their own to reach every shape.
|
|
40465
|
+
*/
|
|
40466
|
+
function findNestedRequiredViolations(resourceType, templateProperties, table = CFN_ENFORCED_TYPES.has(resourceType) ? NESTED_REQUIRED.get(resourceType) : void 0) {
|
|
40467
|
+
if (!table || !isConcreteObject(templateProperties)) return [];
|
|
40468
|
+
const violations = [];
|
|
40469
|
+
for (const [path, required] of table) {
|
|
40470
|
+
const segments = path.split(".");
|
|
40471
|
+
const check = (value, display) => {
|
|
40472
|
+
if (Array.isArray(value)) {
|
|
40473
|
+
value.forEach((element, i) => check(element, `${display}[${i}]`));
|
|
40474
|
+
return;
|
|
40475
|
+
}
|
|
40476
|
+
if (!isConcreteObject(value)) return;
|
|
40477
|
+
const missing = required.filter((member) => !hasOwnKey(value, member));
|
|
40478
|
+
if (missing.length > 0) violations.push({
|
|
40479
|
+
resourceType,
|
|
40480
|
+
path: display,
|
|
40481
|
+
missing
|
|
40482
|
+
});
|
|
40483
|
+
};
|
|
40484
|
+
const visit = (value, depth, display) => {
|
|
40485
|
+
if (depth === segments.length) {
|
|
40486
|
+
check(value, display);
|
|
40487
|
+
return;
|
|
40488
|
+
}
|
|
40489
|
+
if (Array.isArray(value)) {
|
|
40490
|
+
value.forEach((element, i) => visit(element, depth, `${display}[${i}]`));
|
|
40491
|
+
return;
|
|
40492
|
+
}
|
|
40493
|
+
if (!isConcreteObject(value)) return;
|
|
40494
|
+
const segment = segments[depth];
|
|
40495
|
+
if (!hasOwnKey(value, segment)) return;
|
|
40496
|
+
visit(value[segment], depth + 1, display ? `${display}.${segment}` : segment);
|
|
40497
|
+
};
|
|
40498
|
+
visit(templateProperties, 0, "");
|
|
40499
|
+
}
|
|
40500
|
+
return violations;
|
|
40501
|
+
}
|
|
40502
|
+
/** Render one violation as a per-resource error line. */
|
|
40503
|
+
function buildNestedRequiredMessage(logicalId, violation) {
|
|
40504
|
+
return ` - ${logicalId} (${violation.resourceType}): ${violation.path} is missing required ${violation.missing.length === 1 ? "member" : "members"} ${violation.missing.join(", ")}`;
|
|
40505
|
+
}
|
|
40506
|
+
|
|
38680
40507
|
//#endregion
|
|
38681
40508
|
//#region src/provisioning/provider-registry.ts
|
|
38682
40509
|
/**
|
|
@@ -39003,7 +40830,10 @@ var ProviderRegistry = class {
|
|
|
39003
40830
|
* ALSO runs the mutually-exclusive-property check
|
|
39004
40831
|
* ({@link validateMutuallyExclusiveProperties}), which throws BEFORE any
|
|
39005
40832
|
* routing decision is logged — a template CloudFormation itself rejects
|
|
39006
|
-
* should not first produce a page of routing chatter.
|
|
40833
|
+
* should not first produce a page of routing chatter. Issue
|
|
40834
|
+
* [#1802](https://github.com/go-to-k/cdkd/issues/1802) adds the nested
|
|
40835
|
+
* `required` check ({@link validateNestedRequiredProperties}) at the same
|
|
40836
|
+
* point, for the same reason.
|
|
39007
40837
|
*
|
|
39008
40838
|
* @see findAutoRouteHits for the pure-functional pre-deploy plan-builder
|
|
39009
40839
|
* that returns the same information without logging.
|
|
@@ -39011,6 +40841,7 @@ var ProviderRegistry = class {
|
|
|
39011
40841
|
validateResourceProperties(resources) {
|
|
39012
40842
|
const materialized = [...resources];
|
|
39013
40843
|
this.validateMutuallyExclusiveProperties(materialized);
|
|
40844
|
+
this.validateNestedRequiredProperties(materialized);
|
|
39014
40845
|
this.reportSilentDropDecisions(materialized);
|
|
39015
40846
|
}
|
|
39016
40847
|
/**
|
|
@@ -39036,6 +40867,23 @@ var ProviderRegistry = class {
|
|
|
39036
40867
|
throw new Error(`The following resources declare mutually exclusive properties:\n` + lines.join("\n") + "\n\nCloudFormation rejects these combinations too — edit the template to declare only one of each set.");
|
|
39037
40868
|
}
|
|
39038
40869
|
/**
|
|
40870
|
+
* Reject a template whose PRESENT nested property block lacks a member the
|
|
40871
|
+
* type's schema requires there, for the types CloudFormation was measured to
|
|
40872
|
+
* enforce that on (issue [#1802](https://github.com/go-to-k/cdkd/issues/1802);
|
|
40873
|
+
* the rule, its fail-safe bias and the measurement live in
|
|
40874
|
+
* `nested-required.ts`).
|
|
40875
|
+
*
|
|
40876
|
+
* Aggregated into ONE error, like {@link validateMutuallyExclusiveProperties},
|
|
40877
|
+
* and with no `--allow-*` escape hatch for the same reason: CloudFormation
|
|
40878
|
+
* rejects the template too, and declaring the member is always possible.
|
|
40879
|
+
*/
|
|
40880
|
+
validateNestedRequiredProperties(resources) {
|
|
40881
|
+
const lines = [];
|
|
40882
|
+
for (const { logicalId, resourceType, properties } of resources) for (const violation of findNestedRequiredViolations(resourceType, properties)) lines.push(buildNestedRequiredMessage(logicalId, violation));
|
|
40883
|
+
if (lines.length === 0) return;
|
|
40884
|
+
throw new Error(`The following resources declare a nested property block without a member it requires:\n` + lines.join("\n") + "\n\nCloudFormation rejects these blocks too. Declare the missing members; leaving a whole block out is not a violation.");
|
|
40885
|
+
}
|
|
40886
|
+
/**
|
|
39039
40887
|
* Info-log every silent-drop routing decision (auto-route via CC API) and
|
|
39040
40888
|
* warn-log every silent drop the user explicitly opted into via
|
|
39041
40889
|
* `--allow-unsupported-properties` (forced SDK path, the property will
|
|
@@ -48884,5 +50732,5 @@ var DeployEngine = class DeployEngine {
|
|
|
48884
50732
|
};
|
|
48885
50733
|
|
|
48886
50734
|
//#endregion
|
|
48887
|
-
export { yellow as $,
|
|
48888
|
-
//# sourceMappingURL=deploy-engine-
|
|
50735
|
+
export { yellow as $, describeAwsFailure as $a, expectedOwnerParam as $i, repairMalformedResourcePropertiesForReadOnly as $n, rewriteTemplateAssetReferences as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, LocalStartServiceError as Aa, getDefaultStateBucketName as Ai, malformedOutputsRefusalMessage as An, buildForceUnlockCommand as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, StateError as Ba, warnDeprecatedNoPrefixCliFlag as Bi, refuseMalformedOrphansForDestroy as Bn, hasUnverifiableParameterRefusal as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, ConfigError as Ca, runDockerStreaming as Ci, isReadableResourceEntry as Cn, recoverMaskedOutput as Cr, slowCcOperationTimeoutMs as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, DynamicReferenceRegionAmbiguousError as Da, getDockerImageBySourceHash as Di, malformedOrphanRecordsWarning as Dn, S3StateBackend as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, DeployCancelledError as Ea, AssetManifestLoader as Ei, malformedLocalOutputsWarning as En, LockManager as Er, deleteSkipReason as Et, extractDeploymentEventError as F, ProvisioningError as Fa, resolveSkipPrefix as Fi, malformedResourcesWarning as Fn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, withErrorHandling as Ga, findLargeInlineResources as Gi, refuseMalformedResourceEntries as Gn, orphansCarriedFrom as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, formatError as Ha, CFN_TEMPLATE_BODY_LIMIT as Hi, refuseMalformedOutputs as Hn, importableOutputs as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, ResourceTimeoutError as Ia, resolveStateBucketWithDefault as Ii, malformedStateRefusalMessage as In, DEFAULT_STATE_PREFIX as Ir, isNamelessDynamicReferenceError as It, bold as J, isThrottlingError as Ja, injectiveKey as Ji, refuseMalformedResourcesForDestroy as Jn, stringifyValue as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, isMarkedNonRetryable as Ka, uploadCfnTemplate as Ki, refuseMalformedResourceEntriesForOrphan as Kn, shouldRetainResource as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, ResourceUpdateNotSupportedError as La, resolveStateBucketWithDefaultAndSource as Li, refuseDivergentRecordRegionForDestroy as Ln, exportNamesCarriedFrom as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, MalformedProducerRecordRefusalError as Ma, resolveApp as Mi, malformedRenderedContainersWarning as Mn, forceQuitRecoveryClause as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, NestedStackChildDirectDestroyError as Na, resolveAutoAssetStorage as Ni, malformedResourceEntriesWarning as Nn, formatLockExpiry as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, IntrinsicResolutionRefusalError as Oa, Synthesizer as Oi, malformedOrphansRefusalMessage as On, rebuildClientForBucketRegion as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, PartialFailureError as Pa, resolveCaptureObservedState as Pi, malformedResourcePropertiesWarning as Pn, shellQuote as Pr, getAccountInfo as Pt, red as Q, retryClassificationText as Qa, decodeListingKey as Qi, repairMalformedResourceEntriesForReadOnly as Qn, loadPublishableAssetManifest as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, StackHasActiveImportsError as Ra, resolveUseCdkBootstrapAssets as Ri, refuseMalformedNestedChildOutputs as Rn, hasReadableExportSet as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, CdkdError as Sa, runDockerForeground as Si, hasReadableResources as Sn, recordMaskOnlyValue as Sr, isWaitAbandonedError as St, resourcesNamingDeclaredParameter as T, DependencyError as Ta, stripControlChars as Ti, malformedExportSourceWarning as Tn, scrubResourceRecord as Tr, deleteIndeterminateGuards as Tt, coerceWarmThroughput as U, isCdkdError as Ua, CFN_TEMPLATE_URL_LIMIT as Ui, refuseMalformedOutputsForDestroy as Un, isReadableBag as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, SynthesisError as Va, ssmResolvedValueType as Vi, refuseMalformedOrphansForOrphan as Vn, importableOutputKeys as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, normalizeAwsError as Wa, MIGRATE_TMP_PREFIX as Wi, refuseMalformedResourceAttributesForOrphan as Wn, orphansAfterRollback as Wr, assertRegionMatch as Wt, gray as X, markNonRetryable as Xa, producerCoordinateKey as Xi, repairMalformedOrphansForReadOnly as Xn, buildAssetRedirectMap as Xr, readConfigString as Xt, cyan as Y, isTransientServerError as Ya, injectiveKeyPrefix as Yi, refuseMalformedState as Yn, WorkGraph as Yr, configStringRefusal as Yt, green as Z, markRedactedCause as Za, producerRecordKey as Zi, repairMalformedOutputsForReadOnly as Zn, createAssetRedirectResolver as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, AwsClients as _a, dockerSpawnEnvWithSensitive as _i, UNREADABLE_ORPHANS_CONTAINER_ROW as _n, identityKeyFor as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, globMatches as aa, isCrossRegionRedirect as ai, s3BucketDomainName as an, describeTypeWithThrottleRetry as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, setAwsClients as ba, partitionSensitiveEnv as bi, hasReadableOrphans as bn, maskSecretsInError as br, startInterruptWatch as bt, replayFailedOperations as c, hasOwnKey as ca, validateAssetBucketName as ci, s3BucketWebsiteUrl as cn, TemplateParser as cr, IAMRoleProvider as ct, updatePartialMessage as d, ownValue as da, buildDockerImage as di, applyCallerIdentityCredentials as dn, STATE_SOURCED_READBACK_RULES as dr, ProviderRegistry as dt, PARTITION_TABLE as ea, AssetModeResolver as ei, requireConfigString as en, safeStringify$1 as eo, repairMalformedResourcesForReadOnly as er, collectDeclaredOutputNames as et, updatePartialReason as f, absoluteAssemblyPathEscape as fa, resolveDockerContextDirectory as fi, callerEnvCredentials as fn, TEMPLATE_SOURCED_RULES as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, resolveBucketRegion as ga, describeDockerFailure as gi, STATE_RESOURCES_MALFORMED as gn, errorCauseChain as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, clearBucketRegionCache as ha, describeDockerExecFailure as hi, INTRINSIC_KEYS as hn, dynamicReferenceTokens as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, failedStageNote as ia, getBootstrapMarkerKey as ii, s3BucketArn as in, findSilentDropProperties as ir, secretBearing as it, isFinalSnapshotError as j, LockError as ja, getLegacyStateBucketName as ji, malformedOutputsWarning as jn, buildLockContentionMessage as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, LocalInvokeBuildError as ka, synthesisStatusMessage as ki, malformedOrphansWarning as kn, UNREPRODUCIBLE_LOCK_CLAUSE as kr, IntrinsicFunctionResolver as kt, replayRollback as l, hasPlainPrototype$1 as la, validateContainerRepoName as li, applyRoleArnIfSet as ln, STATE_SOURCED_BASELINE_RULES as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, resolveAssemblyPath as ma, describeDockerCapturedOutput as mi, DiffCalculator as mn, createSecretMasker as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, derivePartitionAndUrlSuffix as na, assertAssetBucketRegion as ni, producerRegionsFromState as nn, safeStackName as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, processStackMessages as oa, parseBootstrapMarker as oi, s3BucketDualStackDomainName as on, withRetry as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, renderAssemblyPathEscape as pa, warnManifestExecutable as pi, envCredentialsAreAssumedRole as pn, carriesSecretMask as pr, createMaskedRetryLogger as pt, formatResourceLine as q, isRetryableTransientError as qa, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as qi, refuseMalformedResourcePropertiesForOrphan as qn, AssetPublisher as qr, configBooleanRefusal as qt, DeployEngine as r, AssemblyReader as ra, ensureAssetStorage as ri, withSharedDrainBudget as rn, findActionableSilentDrops as rr, isExportAliasCollision as rt, planRollback as s, defineOwnKey as sa, readBootstrapMarkerBody as si, s3BucketRegionalDomainName as sn, DagBuilder as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, canonicalizeRegion as ta, BOOTSTRAP_MARKER_PREFIX as ti, classifyReplaySecretRegion as tn, __exportAll as to, safeRegion as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, nullPrototypeRecord as ua, buildDenyExternalAccessPolicy as ui, AWS_CREDENTIAL_ENV_KEYS as un, STATE_SOURCED_CROSS_GENERATION_RULES as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, getAwsClients as va, formatDockerLoginError as vi, UNREADABLE_RESOURCES_MAP_ROW as vn, isSingleDynamicReferenceToken as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, CrossAccountSecretRefusalError as wa, escapeRegExp$1 as wi, malformedExportNamesWarning as wn, redactSecretsForState as wr, UNSPECIFIED_SKIP_REASON as wt, bindingSkippedOutputs as x, AssetError as xa, redactDockerArgvValues as xi, hasReadableOutputs as xn, maskSecretsInText as xr, CloudControlProvider as xt, keptWholeReasonText as y, resetAwsClients as ya, getDockerCmd as yi, displayLogicalId as yn, markSameGenerationBag as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, StackTerminationProtectionError as za, stateBucketExistenceConfirmed as zi, refuseMalformedOrphans as zn, hasReasonlessBaselineRefusal as zr, refStateLookupFromResource as zt };
|
|
50736
|
+
//# sourceMappingURL=deploy-engine-CpMT9Bmm.js.map
|