@go-to-k/cdkd 0.296.30 → 0.297.0
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-BaabA371.js → asg-provider-D9Po293s.js} +3 -3
- package/dist/{asg-provider-BaabA371.js.map → asg-provider-D9Po293s.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-BuPc2Dfc.js → deploy-engine-dvf1UDuo.js} +588 -60
- package/dist/deploy-engine-dvf1UDuo.js.map +1 -0
- package/dist/{iam-role-provider-CAiMUBcP.js → iam-role-provider--5HuX51Z.js} +2 -2
- package/dist/{iam-role-provider-CAiMUBcP.js.map → iam-role-provider--5HuX51Z.js.map} +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/{neptune-provider-5yc_bOJ-.js → neptune-provider-xROL9y31.js} +2 -2
- package/dist/{neptune-provider-5yc_bOJ-.js.map → neptune-provider-xROL9y31.js.map} +1 -1
- package/dist/{program-CIxuz2zX.js → program-NRnM6vPK.js} +361 -49
- package/dist/program-NRnM6vPK.js.map +1 -0
- package/dist/{provider-classes-DmZ0J68L.js → provider-classes-uUFRfL9s.js} +20 -20
- package/dist/{provider-classes-DmZ0J68L.js.map → provider-classes-uUFRfL9s.js.map} +1 -1
- package/dist/{rds-provider-IBY6fDvN.js → rds-provider-CU0LZr05.js} +4 -4
- package/dist/{rds-provider-IBY6fDvN.js.map → rds-provider-CU0LZr05.js.map} +1 -1
- package/dist/{version-B__YmKBy.js → version-DE-djeB0.js} +2 -2
- package/dist/{version-B__YmKBy.js.map → version-DE-djeB0.js.map} +1 -1
- package/package.json +2 -1
- package/dist/deploy-engine-BuPc2Dfc.js.map +0 -1
- package/dist/program-CIxuz2zX.js.map +0 -1
|
@@ -2,10 +2,10 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js"
|
|
|
2
2
|
import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-BaWeCWRz.js";
|
|
3
3
|
import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Cz2tPxXk.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-D0q0z4dG.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-DE-djeB0.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
|
-
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
8
|
+
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
9
9
|
import { CloudControlClient, CreateResourceCommand, DeleteResourceCommand, GetResourceCommand, GetResourceRequestStatusCommand, ListResourcesCommand, UpdateResourceCommand } from "@aws-sdk/client-cloudcontrol";
|
|
10
10
|
import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
|
|
11
11
|
import { GetFunctionCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
|
|
@@ -204,17 +204,37 @@ var AppExecutor = class {
|
|
|
204
204
|
|
|
205
205
|
//#endregion
|
|
206
206
|
//#region src/types/assembly.ts
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
const ASSEMBLY_REGION_PREFIX = /^[a-z0-9-]+/;
|
|
208
|
+
const CDK_ENVIRONMENT_PATTERN = /aws:\/\/([a-zA-Z0-9@._-]+)\/([a-z0-9-]+)/;
|
|
209
|
+
const CANONICAL_ASSEMBLY_REGION = /^[a-z0-9-]+$/;
|
|
210
|
+
function parseEnvironment(env, stackName) {
|
|
211
|
+
const match = env.match(/^aws:\/\/([^/]+)\/([\s\S]+)$/);
|
|
209
212
|
if (!match) return {
|
|
210
213
|
account: "unknown-account",
|
|
211
214
|
region: "unknown-region"
|
|
212
215
|
};
|
|
213
|
-
|
|
216
|
+
const raw = match[2];
|
|
217
|
+
const region = ASSEMBLY_REGION_PREFIX.exec(raw)?.[0];
|
|
218
|
+
if (region !== void 0) return {
|
|
214
219
|
account: match[1] === "unknown-account" ? "unknown-account" : match[1],
|
|
215
|
-
region
|
|
220
|
+
region
|
|
221
|
+
};
|
|
222
|
+
const cdk = CDK_ENVIRONMENT_PATTERN.exec(env);
|
|
223
|
+
if (cdk === null) throw new SynthesisError(unparsableRegionMessage(raw, stackName));
|
|
224
|
+
return {
|
|
225
|
+
account: cdk[1],
|
|
226
|
+
region: cdk[2]
|
|
216
227
|
};
|
|
217
228
|
}
|
|
229
|
+
function unparsableRegionMessage(region, stackName) {
|
|
230
|
+
const subject = stackName === void 0 ? "The cloud assembly" : `Stack ${displayStackName(stackName)} in the cloud assembly`;
|
|
231
|
+
const lower = region.toLowerCase();
|
|
232
|
+
const caseOnly = CANONICAL_ASSEMBLY_REGION.test(lower);
|
|
233
|
+
const fix = caseOnly ? `Re-synthesize with the region spelled ${displayIdent(lower)}.` : "Re-synthesize with a canonical region, e.g. env: { region: 'us-east-1' }.";
|
|
234
|
+
const head = `${subject} declares region ${displayIdent(region)}, which is not a canonical AWS region spelling (lowercase letters, digits and '-'). The AWS CDK CLI refuses this assembly too ("Unable to parse environment specification"). ${fix}`;
|
|
235
|
+
if (!caseOnly) return head;
|
|
236
|
+
return `${head}\nIf an earlier cdkd version deployed this stack from such an assembly, it recorded the stack's state under that raw region spelling, and a deploy using the canonical spelling will not find that state: it starts the stack from no state at all. 'cdkd state show' and 'cdkd state orphan' still reach that record when '--stack-region' is given the exact raw spelling; 'state orphan' removes the record and leaves its AWS resources in place, unmanaged by cdkd.`;
|
|
237
|
+
}
|
|
218
238
|
|
|
219
239
|
//#endregion
|
|
220
240
|
//#region src/utils/assembly-path.ts
|
|
@@ -606,7 +626,7 @@ var AssemblyReader = class {
|
|
|
606
626
|
}
|
|
607
627
|
if (dependencyNames.length > 0) this.logger.debug(`Stack ${displayStackName(stackName)} depends on: [${dependencyNames.map((n) => displaySafe(n)).join(", ")}]`);
|
|
608
628
|
let env;
|
|
609
|
-
if (artifact.environment) env = parseEnvironment(artifact.environment);
|
|
629
|
+
if (artifact.environment) env = parseEnvironment(artifact.environment, stackName);
|
|
610
630
|
const nestedTemplates = nullPrototypeRecord();
|
|
611
631
|
for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
|
|
612
632
|
if (resource?.Type !== "AWS::CloudFormation::Stack") continue;
|
|
@@ -5000,7 +5020,7 @@ function isNotImplemented(error) {
|
|
|
5000
5020
|
const status = error?.$metadata?.httpStatusCode;
|
|
5001
5021
|
return name === "NotImplemented" || status === 501;
|
|
5002
5022
|
}
|
|
5003
|
-
function isAccessDenied(error) {
|
|
5023
|
+
function isAccessDenied$1(error) {
|
|
5004
5024
|
let current = error;
|
|
5005
5025
|
for (let depth = 0; depth < 5 && current !== null && typeof current === "object"; depth++) {
|
|
5006
5026
|
const name = current.name;
|
|
@@ -5028,7 +5048,7 @@ async function scanOtherPrefixesForStack(target, stackName, region) {
|
|
|
5028
5048
|
try {
|
|
5029
5049
|
segments = await target.listTopLevelPrefixes();
|
|
5030
5050
|
} catch (error) {
|
|
5031
|
-
return isAccessDenied(error) ? {
|
|
5051
|
+
return isAccessDenied$1(error) ? {
|
|
5032
5052
|
kind: "denied",
|
|
5033
5053
|
error,
|
|
5034
5054
|
stage: "list"
|
|
@@ -5051,7 +5071,7 @@ async function scanOtherPrefixesForStack(target, stackName, region) {
|
|
|
5051
5071
|
if (held === "holder") found.push(prefix);
|
|
5052
5072
|
else if (held === "empty") stale.push(prefix);
|
|
5053
5073
|
} catch (error) {
|
|
5054
|
-
if (isAccessDenied(error)) denied ??= error;
|
|
5074
|
+
if (isAccessDenied$1(error)) denied ??= error;
|
|
5055
5075
|
else failed ??= error;
|
|
5056
5076
|
}
|
|
5057
5077
|
}
|
|
@@ -5491,7 +5511,7 @@ var S3StateBackend = class S3StateBackend {
|
|
|
5491
5511
|
async verifyBucketExists(options = {}) {
|
|
5492
5512
|
await this.ensureClientForBucket();
|
|
5493
5513
|
if (options.existenceAlreadyProbed) {
|
|
5494
|
-
this.logger.debug(`Skipping the redundant HeadBucket on '${this.config.bucket}' — the default-name resolution already confirmed it exists with these credentials
|
|
5514
|
+
this.logger.debug(`Skipping the redundant HeadBucket on '${this.config.bucket}' — the default-name resolution already confirmed it exists with these credentials.`);
|
|
5495
5515
|
return;
|
|
5496
5516
|
}
|
|
5497
5517
|
try {
|
|
@@ -13794,7 +13814,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
13794
13814
|
["Description", "CFn-only informational — no semantic effect on the recursive deploy"],
|
|
13795
13815
|
["DisableRollback", "CFn-only — cdkd controls rollback via the top-level deploy-engine --no-rollback flag, not per nested stack"],
|
|
13796
13816
|
["EnableTerminationProtection", "CFn-only per-nested-stack flag — cdkd records stack-level terminationProtection at CDK synth time (parent only) and `cdkd destroy` consults that for refusal"],
|
|
13797
|
-
["NotificationARNs", "CFn-only SNS-on-stack-event surface — cdkd has no equivalent
|
|
13817
|
+
["NotificationARNs", "CFn-only SNS-on-stack-event surface — cdkd has no equivalent"],
|
|
13798
13818
|
["RoleARN", "CFn-only role-assumption — cdkd uses the caller credentials directly, no per-resource role assumption"],
|
|
13799
13819
|
["StackName", "cdkd derives the child stack name as `<parent>~<logicalId>` per design §3 (state-key uniqueness); a user-provided StackName has no effect"],
|
|
13800
13820
|
["StackPolicyBody", "CFn-only stack-update policy — cdkd has no equivalent (per-resource diff replaces stack-level policy)"],
|
|
@@ -13802,7 +13822,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
13802
13822
|
["StackStatusReason", "CFn-only read-only output — never a real input property"],
|
|
13803
13823
|
["Tags", "CFn-only — cdkd does not tag the synthesized \"stack\" (the parent's synthesized ARN is a cdkd-local placeholder, not a real AWS resource)"],
|
|
13804
13824
|
["TemplateBody", "CFn-only inline template — cdkd reads the child template from the synth output via Metadata['aws:asset:path'] instead of accepting it inline"],
|
|
13805
|
-
["TimeoutInMinutes", "CFn-only stack-create deadline — cdkd uses per-resource --resource-timeout instead
|
|
13825
|
+
["TimeoutInMinutes", "CFn-only stack-create deadline — cdkd uses per-resource --resource-timeout instead"]
|
|
13806
13826
|
]),
|
|
13807
13827
|
createOnlyDrops: /* @__PURE__ */ new Set(["StackName"]),
|
|
13808
13828
|
readOnly: /* @__PURE__ */ new Set([
|
|
@@ -14578,7 +14598,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
14578
14598
|
"PosixUser",
|
|
14579
14599
|
"RootDirectory"
|
|
14580
14600
|
]),
|
|
14581
|
-
silentDrop: /* @__PURE__ */ new Map([["ClientToken", "cdkd supplies its own retry-stable ClientToken on CreateAccessPoint
|
|
14601
|
+
silentDrop: /* @__PURE__ */ new Map([["ClientToken", "cdkd supplies its own retry-stable ClientToken on CreateAccessPoint, so a template-supplied value would be overwritten. The SDK does not own this field either: an omitted ClientToken is auto-filled with a FRESH uuid per attempt, which leaves a retried 500 free to mint a second access point, while a caller-supplied value goes on the wire verbatim."]]),
|
|
14582
14602
|
createOnlyDrops: /* @__PURE__ */ new Set(["ClientToken"]),
|
|
14583
14603
|
readOnly: /* @__PURE__ */ new Set(["AccessPointId", "Arn"]),
|
|
14584
14604
|
ccRouteUnavailable: false
|
|
@@ -14598,7 +14618,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
14598
14618
|
"ProvisionedThroughputInMibps",
|
|
14599
14619
|
"ThroughputMode"
|
|
14600
14620
|
]),
|
|
14601
|
-
silentDrop: /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider.
|
|
14621
|
+
silentDrop: /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider."]]),
|
|
14602
14622
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
14603
14623
|
readOnly: /* @__PURE__ */ new Set(["Arn", "FileSystemId"]),
|
|
14604
14624
|
ccRouteUnavailable: false
|
|
@@ -15528,7 +15548,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
15528
15548
|
["DBClusterParameterGroupName", "not yet implemented by cdkd"],
|
|
15529
15549
|
["DBInstanceParameterGroupName", "not yet implemented by cdkd"],
|
|
15530
15550
|
["DBSystemId", "not yet implemented by cdkd"],
|
|
15531
|
-
["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it
|
|
15551
|
+
["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it; kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot, which this flag does not control"],
|
|
15532
15552
|
["Domain", "not yet implemented by cdkd"],
|
|
15533
15553
|
["DomainIAMRoleName", "not yet implemented by cdkd"],
|
|
15534
15554
|
["EnableCloudwatchLogsExports", "not yet implemented by cdkd"],
|
|
@@ -15628,7 +15648,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
15628
15648
|
["DBSnapshotIdentifier", "not yet implemented by cdkd"],
|
|
15629
15649
|
["DBSystemId", "not yet implemented by cdkd"],
|
|
15630
15650
|
["DedicatedLogVolume", "not yet implemented by cdkd"],
|
|
15631
|
-
["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it
|
|
15651
|
+
["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it; kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot, which this flag does not control"],
|
|
15632
15652
|
["Domain", "not yet implemented by cdkd"],
|
|
15633
15653
|
["DomainAuthSecretArn", "not yet implemented by cdkd"],
|
|
15634
15654
|
["DomainDnsIps", "not yet implemented by cdkd"],
|
|
@@ -19651,7 +19671,7 @@ function recordSecretNamedRead(logicalId, value, context) {
|
|
|
19651
19671
|
}
|
|
19652
19672
|
function rejectPlaceholderArnAttribute(resource, attributeName, value, logicalId, context, healOutcome) {
|
|
19653
19673
|
if (!isStalePlaceholderArnAttribute(resource.resourceType, attributeName, value)) return;
|
|
19654
|
-
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: the recorded value ${quotedRender(stringifyValue(this.maskValueLeaves(value, context)), "\"")} is a placeholder written by
|
|
19674
|
+
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: the recorded value ${quotedRender(stringifyValue(this.maskValueLeaves(value, context)), "\"")} is a placeholder written by an older cdkd version — its region and account fields are literal wildcards, so it is not a usable ARN. ` + this.staleRecordRemedy(healOutcome, context)));
|
|
19655
19675
|
}
|
|
19656
19676
|
async function constructAttribute(resource, attributeName, context, logicalId, accountInfo) {
|
|
19657
19677
|
const { resourceType, physicalId } = resource;
|
|
@@ -20922,7 +20942,7 @@ async function resolveSplit(splitArgs, context) {
|
|
|
20922
20942
|
const source = this.describeSplitValueSource(value);
|
|
20923
20943
|
const sourceClause = source ? ` (from ${this.displayMasked(source.label, context)})` : "";
|
|
20924
20944
|
if (Array.isArray(resolvedValue)) {
|
|
20925
|
-
const remedy = source?.kind === "ref" ? "A list-typed parameter — any List<...> type (List<AWS::EC2::Subnet::Id>, List<Number>, …) or CommaDelimitedList — is already a list." : source?.kind === "getatt" ? "A list-valued Fn::GetAtt (for example AWS::Route53::HostedZone.NameServers or AWS::EC2::VPC.Ipv6CidrBlocks) already returns a list. If you wrote the Fn::Split as a workaround for cdkd resolving that attribute to a comma-delimited string, that bug is fixed
|
|
20945
|
+
const remedy = source?.kind === "ref" ? "A list-typed parameter — any List<...> type (List<AWS::EC2::Subnet::Id>, List<Number>, …) or CommaDelimitedList — is already a list." : source?.kind === "getatt" ? "A list-valued Fn::GetAtt (for example AWS::Route53::HostedZone.NameServers or AWS::EC2::VPC.Ipv6CidrBlocks) already returns a list. If you wrote the Fn::Split as a workaround for cdkd resolving that attribute to a comma-delimited string, that bug is fixed and the workaround is no longer needed." : "Several intrinsics already return a list — among them a list-valued Fn::GetAtt, a Ref to a list-typed parameter (any List<...> type or CommaDelimitedList), Fn::GetAZs, Fn::Cidr, and Fn::Split itself.";
|
|
20926
20946
|
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Split: the value to split${sourceClause} is ALREADY a list (an array of ${resolvedValue.length} item${resolvedValue.length === 1 ? "" : "s"}), not a string. CloudFormation rejects Fn::Split over a list too, so this template is not valid CloudFormation either. Remove the Fn::Split and use the value directly. ${remedy}`));
|
|
20927
20947
|
}
|
|
20928
20948
|
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Split: the value to split${sourceClause} must be a string, got ${resolvedValue === null ? "null" : typeof resolvedValue}. Fn::Split accepts only a string; check the value or the intrinsic that produced it.`));
|
|
@@ -22347,7 +22367,7 @@ var DiffCalculator = class DiffCalculator {
|
|
|
22347
22367
|
requiresReplacement: await this.maskedEditRequiresReplacement(desiredResource.Type, key, oldValue, newValue),
|
|
22348
22368
|
maskedExpressionChanged: true
|
|
22349
22369
|
});
|
|
22350
|
-
this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed
|
|
22370
|
+
this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed`);
|
|
22351
22371
|
}
|
|
22352
22372
|
const attributeChanges = this.compareAttributes(currentResource, desiredResource);
|
|
22353
22373
|
if (propertyChanges.length > 0 || attributeChanges.length > 0) {
|
|
@@ -23125,9 +23145,167 @@ function escapeRegExp$1(text) {
|
|
|
23125
23145
|
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
23126
23146
|
}
|
|
23127
23147
|
|
|
23148
|
+
//#endregion
|
|
23149
|
+
//#region src/provisioning/getatt-attributes.generated.ts
|
|
23150
|
+
const WRITABLE_GETATT_ATTRIBUTES = {
|
|
23151
|
+
"AWS::Amplify::Branch": ["BranchName"],
|
|
23152
|
+
"AWS::Amplify::Domain": [
|
|
23153
|
+
"AutoSubDomainCreationPatterns",
|
|
23154
|
+
"AutoSubDomainIAMRole",
|
|
23155
|
+
"DomainName",
|
|
23156
|
+
"EnableAutoSubDomain"
|
|
23157
|
+
],
|
|
23158
|
+
"AWS::AppMesh::GatewayRoute": [
|
|
23159
|
+
"GatewayRouteName",
|
|
23160
|
+
"MeshName",
|
|
23161
|
+
"MeshOwner",
|
|
23162
|
+
"VirtualGatewayName"
|
|
23163
|
+
],
|
|
23164
|
+
"AWS::AppMesh::Mesh": ["MeshName"],
|
|
23165
|
+
"AWS::AppMesh::Route": [
|
|
23166
|
+
"MeshName",
|
|
23167
|
+
"MeshOwner",
|
|
23168
|
+
"RouteName",
|
|
23169
|
+
"VirtualRouterName"
|
|
23170
|
+
],
|
|
23171
|
+
"AWS::AppMesh::VirtualGateway": [
|
|
23172
|
+
"MeshName",
|
|
23173
|
+
"MeshOwner",
|
|
23174
|
+
"VirtualGatewayName"
|
|
23175
|
+
],
|
|
23176
|
+
"AWS::AppMesh::VirtualNode": [
|
|
23177
|
+
"MeshName",
|
|
23178
|
+
"MeshOwner",
|
|
23179
|
+
"VirtualNodeName"
|
|
23180
|
+
],
|
|
23181
|
+
"AWS::AppMesh::VirtualRouter": [
|
|
23182
|
+
"MeshName",
|
|
23183
|
+
"MeshOwner",
|
|
23184
|
+
"VirtualRouterName"
|
|
23185
|
+
],
|
|
23186
|
+
"AWS::AppMesh::VirtualService": [
|
|
23187
|
+
"MeshName",
|
|
23188
|
+
"MeshOwner",
|
|
23189
|
+
"VirtualServiceName"
|
|
23190
|
+
],
|
|
23191
|
+
"AWS::AppSync::DataSource": ["Name"],
|
|
23192
|
+
"AWS::AppSync::DomainName": ["DomainName"],
|
|
23193
|
+
"AWS::AppSync::FunctionConfiguration": ["DataSourceName", "Name"],
|
|
23194
|
+
"AWS::AppSync::Resolver": ["FieldName", "TypeName"],
|
|
23195
|
+
"AWS::Backup::BackupSelection": ["BackupPlanId"],
|
|
23196
|
+
"AWS::Backup::BackupVault": ["BackupVaultName"],
|
|
23197
|
+
"AWS::CleanRooms::AnalysisTemplate": ["Schema"],
|
|
23198
|
+
"AWS::Cloud9::EnvironmentEC2": ["Name"],
|
|
23199
|
+
"AWS::CloudWatch::InsightRule": ["RuleName"],
|
|
23200
|
+
"AWS::CodeArtifact::Domain": ["EncryptionKey"],
|
|
23201
|
+
"AWS::CodeArtifact::Repository": ["DomainName", "DomainOwner"],
|
|
23202
|
+
"AWS::EC2::CapacityReservation": [
|
|
23203
|
+
"AvailabilityZone",
|
|
23204
|
+
"InstanceType",
|
|
23205
|
+
"Tenancy"
|
|
23206
|
+
],
|
|
23207
|
+
"AWS::EC2::Instance": ["AvailabilityZone"],
|
|
23208
|
+
"AWS::EC2::SecurityGroup": ["VpcId"],
|
|
23209
|
+
"AWS::EC2::Subnet": [
|
|
23210
|
+
"AvailabilityZone",
|
|
23211
|
+
"AvailabilityZoneId",
|
|
23212
|
+
"CidrBlock",
|
|
23213
|
+
"OutpostArn",
|
|
23214
|
+
"VpcId"
|
|
23215
|
+
],
|
|
23216
|
+
"AWS::EC2::VPC": ["CidrBlock"],
|
|
23217
|
+
"AWS::EFS::MountTarget": ["IpAddress"],
|
|
23218
|
+
"AWS::EKS::Nodegroup": ["ClusterName", "NodegroupName"],
|
|
23219
|
+
"AWS::ElasticLoadBalancingV2::LoadBalancer": ["SecurityGroups"],
|
|
23220
|
+
"AWS::EventSchemas::Discoverer": ["CrossAccount"],
|
|
23221
|
+
"AWS::EventSchemas::Registry": ["RegistryName"],
|
|
23222
|
+
"AWS::EventSchemas::Schema": ["SchemaName"],
|
|
23223
|
+
"AWS::Events::EventBus": ["Name"],
|
|
23224
|
+
"AWS::GameLift::GameSessionQueue": ["Name"],
|
|
23225
|
+
"AWS::GameLift::MatchmakingConfiguration": ["Name"],
|
|
23226
|
+
"AWS::GameLift::MatchmakingRuleSet": ["Name"],
|
|
23227
|
+
"AWS::Grafana::Workspace": ["GrafanaVersion"],
|
|
23228
|
+
"AWS::Greengrass::ConnectorDefinition": ["Name"],
|
|
23229
|
+
"AWS::Greengrass::CoreDefinition": ["Name"],
|
|
23230
|
+
"AWS::Greengrass::DeviceDefinition": ["Name"],
|
|
23231
|
+
"AWS::Greengrass::FunctionDefinition": ["Name"],
|
|
23232
|
+
"AWS::Greengrass::Group": ["Name", "RoleArn"],
|
|
23233
|
+
"AWS::Greengrass::LoggerDefinition": ["Name"],
|
|
23234
|
+
"AWS::Greengrass::ResourceDefinition": ["Name"],
|
|
23235
|
+
"AWS::Greengrass::SubscriptionDefinition": ["Name"],
|
|
23236
|
+
"AWS::ImageBuilder::Component": ["Name"],
|
|
23237
|
+
"AWS::ImageBuilder::ContainerRecipe": ["Name"],
|
|
23238
|
+
"AWS::ImageBuilder::DistributionConfiguration": ["Name"],
|
|
23239
|
+
"AWS::ImageBuilder::ImagePipeline": ["Name"],
|
|
23240
|
+
"AWS::ImageBuilder::ImageRecipe": ["Name"],
|
|
23241
|
+
"AWS::ImageBuilder::InfrastructureConfiguration": ["Name"],
|
|
23242
|
+
"AWS::Kinesis::StreamConsumer": ["ConsumerName", "StreamARN"],
|
|
23243
|
+
"AWS::MSK::Cluster": ["CurrentVersion"],
|
|
23244
|
+
"AWS::ManagedBlockchain::Member": ["NetworkId"],
|
|
23245
|
+
"AWS::ManagedBlockchain::Node": ["MemberId", "NetworkId"],
|
|
23246
|
+
"AWS::MediaConvert::JobTemplate": ["Name"],
|
|
23247
|
+
"AWS::MediaConvert::Preset": ["Name"],
|
|
23248
|
+
"AWS::MediaConvert::Queue": ["Name"],
|
|
23249
|
+
"AWS::OpsWorks::Instance": ["AvailabilityZone"],
|
|
23250
|
+
"AWS::OpsWorks::UserProfile": ["SshUsername"],
|
|
23251
|
+
"AWS::QuickSight::Analysis": ["Errors", "Sheets"],
|
|
23252
|
+
"AWS::RDS::DBInstance": ["DBSystemId"],
|
|
23253
|
+
"AWS::RDS::DBParameterGroup": ["DBParameterGroupName"],
|
|
23254
|
+
"AWS::RedshiftServerless::Workgroup": ["Workgroup"],
|
|
23255
|
+
"AWS::RoboMaker::RobotApplication": ["CurrentRevisionId"],
|
|
23256
|
+
"AWS::RoboMaker::SimulationApplication": ["CurrentRevisionId"],
|
|
23257
|
+
"AWS::Route53Resolver::ResolverEndpoint": [
|
|
23258
|
+
"Direction",
|
|
23259
|
+
"Name",
|
|
23260
|
+
"OutpostArn",
|
|
23261
|
+
"PreferredInstanceType",
|
|
23262
|
+
"ResolverEndpointType"
|
|
23263
|
+
],
|
|
23264
|
+
"AWS::Route53Resolver::ResolverRule": [
|
|
23265
|
+
"DomainName",
|
|
23266
|
+
"Name",
|
|
23267
|
+
"ResolverEndpointId",
|
|
23268
|
+
"TargetIps"
|
|
23269
|
+
],
|
|
23270
|
+
"AWS::Route53Resolver::ResolverRuleAssociation": [
|
|
23271
|
+
"Name",
|
|
23272
|
+
"ResolverRuleId",
|
|
23273
|
+
"VPCId"
|
|
23274
|
+
],
|
|
23275
|
+
"AWS::S3::AccessPoint": ["Name"],
|
|
23276
|
+
"AWS::SNS::Topic": ["TopicName"],
|
|
23277
|
+
"AWS::SQS::Queue": ["QueueName"],
|
|
23278
|
+
"AWS::SSM::Parameter": ["Type"],
|
|
23279
|
+
"AWS::SSM::ResourceDataSync": ["SyncName"],
|
|
23280
|
+
"AWS::SageMaker::CodeRepository": ["CodeRepositoryName"],
|
|
23281
|
+
"AWS::SageMaker::Endpoint": ["EndpointName"],
|
|
23282
|
+
"AWS::SageMaker::EndpointConfig": ["EndpointConfigName"],
|
|
23283
|
+
"AWS::SageMaker::Model": ["ModelName"],
|
|
23284
|
+
"AWS::SageMaker::ModelPackage": ["LastModifiedTime"],
|
|
23285
|
+
"AWS::SageMaker::NotebookInstance": ["NotebookInstanceName"],
|
|
23286
|
+
"AWS::SageMaker::NotebookInstanceLifecycleConfig": ["NotebookInstanceLifecycleConfigName"],
|
|
23287
|
+
"AWS::SageMaker::Workteam": ["WorkteamName"],
|
|
23288
|
+
"AWS::ServiceDiscovery::Service": ["Name"],
|
|
23289
|
+
"AWS::Signer::SigningProfile": ["ProfileName"],
|
|
23290
|
+
"AWS::StepFunctions::Activity": ["Name"],
|
|
23291
|
+
"AWS::Transfer::User": ["ServerId", "UserName"]
|
|
23292
|
+
};
|
|
23293
|
+
|
|
23128
23294
|
//#endregion
|
|
23129
23295
|
//#region src/provisioning/read-only-properties.ts
|
|
23130
23296
|
const readOnlyPropertiesCache = /* @__PURE__ */ new Map();
|
|
23297
|
+
const attributeNamesCache = /* @__PURE__ */ new Map();
|
|
23298
|
+
async function getTopLevelAttributeNames(resourceType) {
|
|
23299
|
+
const readOnly = await getTopLevelReadOnlyProperties(resourceType);
|
|
23300
|
+
if (readOnly === void 0) return void 0;
|
|
23301
|
+
const writable = Object.hasOwn(WRITABLE_GETATT_ATTRIBUTES, resourceType) ? WRITABLE_GETATT_ATTRIBUTES[resourceType] : void 0;
|
|
23302
|
+
if (!writable || writable.length === 0) return readOnly;
|
|
23303
|
+
const cached = attributeNamesCache.get(resourceType);
|
|
23304
|
+
if (cached) return cached;
|
|
23305
|
+
const names = /* @__PURE__ */ new Set([...readOnly, ...writable]);
|
|
23306
|
+
attributeNamesCache.set(resourceType, names);
|
|
23307
|
+
return names;
|
|
23308
|
+
}
|
|
23131
23309
|
function getTopLevelReadOnlyProperties(resourceType) {
|
|
23132
23310
|
if (hasNoRegistrySchema(resourceType)) return Promise.resolve(void 0);
|
|
23133
23311
|
const cached = readOnlyPropertiesCache.get(resourceType);
|
|
@@ -23710,7 +23888,7 @@ var CloudControlProvider = class {
|
|
|
23710
23888
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
23711
23889
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
23712
23890
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
23713
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
23891
|
+
const { ASGProvider } = await import("./asg-provider-D9Po293s.js");
|
|
23714
23892
|
const delegateRegion = ambientRegion();
|
|
23715
23893
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
23716
23894
|
if (asgProvider === void 0) {
|
|
@@ -23816,7 +23994,7 @@ var CloudControlProvider = class {
|
|
|
23816
23994
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
23817
23995
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
23818
23996
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
23819
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
23997
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-CU0LZr05.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-xROL9y31.js"))).NeptuneProvider({ region: ccRegion });
|
|
23820
23998
|
this.sdkDeleteDelegates.set(family, {
|
|
23821
23999
|
region: ccRegion,
|
|
23822
24000
|
provider
|
|
@@ -24501,7 +24679,7 @@ var CloudControlProvider = class {
|
|
|
24501
24679
|
async maskUncertifiedModelValues(model, resourceType, physicalId) {
|
|
24502
24680
|
const safeType = displaySafe(resourceType, { asciiOnly: true });
|
|
24503
24681
|
const safeId = displaySafe(physicalId, { asciiOnly: true });
|
|
24504
|
-
const attributeNames = await
|
|
24682
|
+
const attributeNames = await getTopLevelAttributeNames(resourceType);
|
|
24505
24683
|
if (attributeNames === void 0) {
|
|
24506
24684
|
if (!this.warnedUnresolvableSchemaTypes.has(resourceType)) {
|
|
24507
24685
|
this.warnedUnresolvableSchemaTypes.add(resourceType);
|
|
@@ -24515,7 +24693,7 @@ var CloudControlProvider = class {
|
|
|
24515
24693
|
masked[key] = maskLeavesDeep(value);
|
|
24516
24694
|
maskedCount++;
|
|
24517
24695
|
}
|
|
24518
|
-
if (maskedCount > 0 && attributeNames !== void 0) this.logger.debug(`Masked ${maskedCount} non-attribute key(s) out of the ${safeType} Cloud Control model for ${safeId}: they are not
|
|
24696
|
+
if (maskedCount > 0 && attributeNames !== void 0) this.logger.debug(`Masked ${maskedCount} non-attribute key(s) out of the ${safeType} Cloud Control model for ${safeId}: they are not Fn::GetAtt attributes of the type, so CloudFormation would reject an Fn::GetAtt naming them and cdkd has no evidence they are safe to persist.`);
|
|
24519
24697
|
return masked;
|
|
24520
24698
|
}
|
|
24521
24699
|
};
|
|
@@ -24626,6 +24804,124 @@ function maskLeavesDeep(value) {
|
|
|
24626
24804
|
return "***";
|
|
24627
24805
|
}
|
|
24628
24806
|
|
|
24807
|
+
//#endregion
|
|
24808
|
+
//#region src/state/state-bucket-lifecycle.ts
|
|
24809
|
+
const CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID = "cdkd-custom-resource-responses-expiration";
|
|
24810
|
+
const CUSTOM_RESOURCE_RESPONSE_EXPIRATION_DAYS = 1;
|
|
24811
|
+
const CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX = `${CUSTOM_RESOURCE_RESPONSE_PREFIX}/cdkd-1`;
|
|
24812
|
+
function buildCustomResourceResponseLifecycleRule(legacyPrefix) {
|
|
24813
|
+
const prefix = CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX;
|
|
24814
|
+
return {
|
|
24815
|
+
ID: CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID,
|
|
24816
|
+
Status: "Enabled",
|
|
24817
|
+
...legacyPrefix ? { Prefix: prefix } : { Filter: { Prefix: prefix } },
|
|
24818
|
+
Expiration: { Days: 1 },
|
|
24819
|
+
NoncurrentVersionExpiration: { NoncurrentDays: 1 }
|
|
24820
|
+
};
|
|
24821
|
+
}
|
|
24822
|
+
async function applyCustomResourceResponseExpiration(s3, bucket, opts = {}) {
|
|
24823
|
+
const owner = opts.expectedBucketOwner ? { ExpectedBucketOwner: opts.expectedBucketOwner } : {};
|
|
24824
|
+
const first = await readLifecycle(s3, bucket, owner);
|
|
24825
|
+
if ("failed" in first) return first.failed;
|
|
24826
|
+
if (first.rules.some((rule) => rule.ID === "cdkd-custom-resource-responses-expiration")) return { status: "present" };
|
|
24827
|
+
let collision;
|
|
24828
|
+
try {
|
|
24829
|
+
collision = await findStateUnderResponsePrefix(s3, bucket, owner);
|
|
24830
|
+
} catch (error) {
|
|
24831
|
+
return failedOutcome("ListObjectsV2", error);
|
|
24832
|
+
}
|
|
24833
|
+
if (collision !== void 0) return {
|
|
24834
|
+
status: "refused",
|
|
24835
|
+
reason: `${CUSTOM_RESOURCE_RESPONSE_PREFIX}/${displaySafe(collision) || "<unrenderable>"} holds objects other than custom-resource responses (a stack deployed with --state-prefix ${CUSTOM_RESOURCE_RESPONSE_PREFIX}), and the rule would expire them`
|
|
24836
|
+
};
|
|
24837
|
+
const latest = await readLifecycle(s3, bucket, owner);
|
|
24838
|
+
if ("failed" in latest) return latest.failed;
|
|
24839
|
+
if (latest.rules.some((rule) => rule.ID === "cdkd-custom-resource-responses-expiration")) return { status: "present" };
|
|
24840
|
+
const existing = latest.rules;
|
|
24841
|
+
const minimumObjectSize = latest.minimumObjectSize;
|
|
24842
|
+
const legacyPrefix = existing.some((rule) => rule.Prefix !== void 0);
|
|
24843
|
+
try {
|
|
24844
|
+
await s3.send(new PutBucketLifecycleConfigurationCommand({
|
|
24845
|
+
Bucket: bucket,
|
|
24846
|
+
...owner,
|
|
24847
|
+
LifecycleConfiguration: { Rules: [...existing, buildCustomResourceResponseLifecycleRule(legacyPrefix)] },
|
|
24848
|
+
...minimumObjectSize !== void 0 && { TransitionDefaultMinimumObjectSize: minimumObjectSize }
|
|
24849
|
+
}));
|
|
24850
|
+
} catch (error) {
|
|
24851
|
+
return failedOutcome("PutBucketLifecycleConfiguration", error);
|
|
24852
|
+
}
|
|
24853
|
+
return { status: "added" };
|
|
24854
|
+
}
|
|
24855
|
+
async function readLifecycle(s3, bucket, owner) {
|
|
24856
|
+
try {
|
|
24857
|
+
const current = await s3.send(new GetBucketLifecycleConfigurationCommand({
|
|
24858
|
+
Bucket: bucket,
|
|
24859
|
+
...owner
|
|
24860
|
+
}));
|
|
24861
|
+
return {
|
|
24862
|
+
rules: current.Rules ?? [],
|
|
24863
|
+
minimumObjectSize: current.TransitionDefaultMinimumObjectSize
|
|
24864
|
+
};
|
|
24865
|
+
} catch (error) {
|
|
24866
|
+
if (error?.name === "NoSuchLifecycleConfiguration") return {
|
|
24867
|
+
rules: [],
|
|
24868
|
+
minimumObjectSize: void 0
|
|
24869
|
+
};
|
|
24870
|
+
return { failed: failedOutcome("GetBucketLifecycleConfiguration", error) };
|
|
24871
|
+
}
|
|
24872
|
+
}
|
|
24873
|
+
function isAccessDenied(error) {
|
|
24874
|
+
const e = error;
|
|
24875
|
+
return e?.name === "AccessDenied" || e?.$metadata?.httpStatusCode === 403;
|
|
24876
|
+
}
|
|
24877
|
+
function failedOutcome(operation, error) {
|
|
24878
|
+
return {
|
|
24879
|
+
status: "failed",
|
|
24880
|
+
reason: failureReason(operation, error),
|
|
24881
|
+
accessDenied: isAccessDenied(error)
|
|
24882
|
+
};
|
|
24883
|
+
}
|
|
24884
|
+
async function findStateUnderResponsePrefix(s3, bucket, owner) {
|
|
24885
|
+
let token;
|
|
24886
|
+
do {
|
|
24887
|
+
const page = await s3.send(new ListObjectsV2Command({
|
|
24888
|
+
Bucket: bucket,
|
|
24889
|
+
...owner,
|
|
24890
|
+
Prefix: CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX,
|
|
24891
|
+
Delimiter: "/",
|
|
24892
|
+
EncodingType: "url",
|
|
24893
|
+
...token !== void 0 && { ContinuationToken: token }
|
|
24894
|
+
}));
|
|
24895
|
+
const first = decodeListingKey(page.CommonPrefixes?.find((p) => p.Prefix)?.Prefix);
|
|
24896
|
+
if (first !== void 0) return first.slice(CUSTOM_RESOURCE_RESPONSE_PREFIX.length + 1);
|
|
24897
|
+
token = page.IsTruncated ? page.NextContinuationToken : void 0;
|
|
24898
|
+
} while (token !== void 0);
|
|
24899
|
+
}
|
|
24900
|
+
function failureReason(operation, error) {
|
|
24901
|
+
return `${operation} failed: ${displaySafe(describeAwsFailure(error).detail) || "<unrenderable>"}`;
|
|
24902
|
+
}
|
|
24903
|
+
function customResourceResponseExpirationWarning(bucket, outcome) {
|
|
24904
|
+
const remedy = outcome.status === "refused" ? `To add the rule, move that stack to a different --state-prefix.` : outcome.accessDenied ? "To add the rule, grant s3:GetLifecycleConfiguration, s3:PutLifecycleConfiguration and s3:ListBucket on the bucket, and check that this account owns it." : `To add the rule, review the bucket's lifecycle configuration against the reason above.`;
|
|
24905
|
+
return `Could not add the ${1}-day expiration lifecycle rule for ${CUSTOM_RESOURCE_RESPONSE_PREFIX}/ to state bucket ${displaySafe(bucket, { asciiOnly: true }) || "<unrenderable>"} (${outcome.reason}). The bucket's lifecycle configuration was left unchanged. Custom-resource response objects left by an interrupted run stay until 'cdkd gc' removes them. ${remedy}`;
|
|
24906
|
+
}
|
|
24907
|
+
const ensured = /* @__PURE__ */ new Map();
|
|
24908
|
+
function ensureCustomResourceResponseExpirationOnce(s3, bucket, log) {
|
|
24909
|
+
const memo = ensured.get(bucket);
|
|
24910
|
+
if (memo) return memo;
|
|
24911
|
+
const run = (async () => {
|
|
24912
|
+
try {
|
|
24913
|
+
const owner = await expectedOwnerParam(s3);
|
|
24914
|
+
const outcome = await applyCustomResourceResponseExpiration(s3, bucket, { ...owner.ExpectedBucketOwner && { expectedBucketOwner: owner.ExpectedBucketOwner } });
|
|
24915
|
+
if (outcome.status === "failed" || outcome.status === "refused") log.warn(customResourceResponseExpirationWarning(bucket, outcome));
|
|
24916
|
+
else if (outcome.status === "added") log.debug(`Added the ${1}-day expiration lifecycle rule for ${CUSTOM_RESOURCE_RESPONSE_PREFIX}/ to the state bucket.`);
|
|
24917
|
+
} catch (error) {
|
|
24918
|
+
log.warn(customResourceResponseExpirationWarning(bucket, failedOutcome("lifecycle check", error)));
|
|
24919
|
+
}
|
|
24920
|
+
})();
|
|
24921
|
+
ensured.set(bucket, run);
|
|
24922
|
+
return run;
|
|
24923
|
+
}
|
|
24924
|
+
|
|
24629
24925
|
//#endregion
|
|
24630
24926
|
//#region src/deployment/resource-secrets-scope.ts
|
|
24631
24927
|
const currentResourceSecretsStore = new AsyncLocalStorage();
|
|
@@ -25779,6 +26075,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
25779
26075
|
if (!this.responseBucket) return "https://localhost/cfn-response-not-configured";
|
|
25780
26076
|
await this.ensureResponseClient();
|
|
25781
26077
|
const bucket = this.responseBucket;
|
|
26078
|
+
if (this.responsePrefix === "custom-resource-responses") ensureCustomResourceResponseExpirationOnce(this.s3Client, bucket, this.logger);
|
|
25782
26079
|
try {
|
|
25783
26080
|
await withRetry(() => this.s3Client.send(new PutObjectCommand({
|
|
25784
26081
|
Bucket: bucket,
|
|
@@ -28615,6 +28912,162 @@ const PRINCIPAL_KINDS = {
|
|
|
28615
28912
|
"AWS::IAM::Group": "group",
|
|
28616
28913
|
"AWS::IAM::User": "user"
|
|
28617
28914
|
};
|
|
28915
|
+
function isInlinePolicyPrincipalType(resourceType) {
|
|
28916
|
+
return Object.hasOwn(PRINCIPAL_KINDS, resourceType);
|
|
28917
|
+
}
|
|
28918
|
+
function principalKindOf(resourceType) {
|
|
28919
|
+
return Object.hasOwn(PRINCIPAL_KINDS, resourceType) ? PRINCIPAL_KINDS[resourceType] : void 0;
|
|
28920
|
+
}
|
|
28921
|
+
const ANY = "*";
|
|
28922
|
+
const PRINCIPAL_NAME_FIELDS = {
|
|
28923
|
+
role: "RoleName",
|
|
28924
|
+
group: "GroupName",
|
|
28925
|
+
user: "UserName"
|
|
28926
|
+
};
|
|
28927
|
+
function nameKey(value) {
|
|
28928
|
+
return typeof value === "string" && IAM_NAME.test(value) ? value.toLowerCase() : ANY;
|
|
28929
|
+
}
|
|
28930
|
+
function templatePrincipalKeys(entry, kind, templateResources, stateResources) {
|
|
28931
|
+
if (typeof entry === "string") return [nameKey(entry)];
|
|
28932
|
+
const ref = typeof entry === "object" && entry !== null && !Array.isArray(entry) ? entry["Ref"] : void 0;
|
|
28933
|
+
if (typeof ref !== "string" || !Object.hasOwn(templateResources, ref)) return [ANY];
|
|
28934
|
+
const target = templateResources[ref];
|
|
28935
|
+
if (principalKindOf(target.Type) !== kind) return [ANY];
|
|
28936
|
+
return principalSelfKeys(ref, kind, target, stateResources);
|
|
28937
|
+
}
|
|
28938
|
+
function principalSelfKeys(logicalId, kind, template, stateResources) {
|
|
28939
|
+
const keys = [`ref:${logicalId}`];
|
|
28940
|
+
const declared = template?.Properties?.[PRINCIPAL_NAME_FIELDS[kind]];
|
|
28941
|
+
const declaredKey = nameKey(declared);
|
|
28942
|
+
if (declaredKey !== ANY) keys.push(declaredKey);
|
|
28943
|
+
const record = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
|
|
28944
|
+
if (record !== void 0 && principalKindOf(record.resourceType) === kind) {
|
|
28945
|
+
const recordedKey = nameKey(record.physicalId);
|
|
28946
|
+
if (recordedKey !== ANY) keys.push(recordedKey);
|
|
28947
|
+
}
|
|
28948
|
+
return keys;
|
|
28949
|
+
}
|
|
28950
|
+
function policiesNames(policies) {
|
|
28951
|
+
if (policies === void 0 || policies === null) return [];
|
|
28952
|
+
if (!Array.isArray(policies)) return [ANY];
|
|
28953
|
+
return policies.map((entry) => typeof entry === "object" && entry !== null && !Array.isArray(entry) ? nameKey(entry["PolicyName"]) : ANY);
|
|
28954
|
+
}
|
|
28955
|
+
function inlinePolicyClaimsOf(logicalId, change, templateResources, stateResources) {
|
|
28956
|
+
const template = Object.hasOwn(templateResources, logicalId) ? templateResources[logicalId] : void 0;
|
|
28957
|
+
const record = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
|
|
28958
|
+
const recorded = record?.resourceType === change.resourceType ? record : void 0;
|
|
28959
|
+
const claims = [];
|
|
28960
|
+
const cross = (kind, principals, names) => {
|
|
28961
|
+
for (const principal of new Set(principals)) for (const name of new Set(names)) claims.push({
|
|
28962
|
+
kind,
|
|
28963
|
+
principal,
|
|
28964
|
+
name
|
|
28965
|
+
});
|
|
28966
|
+
};
|
|
28967
|
+
if (change.resourceType === "AWS::IAM::Policy") {
|
|
28968
|
+
const desired = template?.Properties ?? {};
|
|
28969
|
+
const old = recorded?.properties ?? {};
|
|
28970
|
+
const names = [];
|
|
28971
|
+
if (desired["PolicyName"] !== void 0) names.push(nameKey(desired["PolicyName"]));
|
|
28972
|
+
if (old["PolicyName"] !== void 0) names.push(nameKey(old["PolicyName"]));
|
|
28973
|
+
if (recorded !== void 0) names.push(nameKey(typeof recorded.physicalId === "string" ? recorded.physicalId.split(":")[0] : recorded.physicalId));
|
|
28974
|
+
if (names.length === 0) return claims;
|
|
28975
|
+
for (const kind of [
|
|
28976
|
+
"role",
|
|
28977
|
+
"group",
|
|
28978
|
+
"user"
|
|
28979
|
+
]) {
|
|
28980
|
+
const field = POLICY_LIST_FIELDS[kind];
|
|
28981
|
+
const principals = [];
|
|
28982
|
+
const listed = desired[field];
|
|
28983
|
+
if (Array.isArray(listed)) for (const entry of listed) principals.push(...templatePrincipalKeys(entry, kind, templateResources, stateResources));
|
|
28984
|
+
else if (listed !== void 0) principals.push(ANY);
|
|
28985
|
+
const held = old[field];
|
|
28986
|
+
if (Array.isArray(held)) principals.push(...held.map(nameKey));
|
|
28987
|
+
else if (held !== void 0 && held !== null) principals.push(ANY);
|
|
28988
|
+
cross(kind, principals, names);
|
|
28989
|
+
}
|
|
28990
|
+
return claims;
|
|
28991
|
+
}
|
|
28992
|
+
const kind = principalKindOf(change.resourceType);
|
|
28993
|
+
if (kind === void 0) return claims;
|
|
28994
|
+
if (!(change.changeType === "CREATE" || (change.propertyChanges ?? []).some((c) => c.requiresReplacement) || ownPoliciesChange(change))) return claims;
|
|
28995
|
+
cross(kind, principalSelfKeys(logicalId, kind, template, stateResources), [...policiesNames(template?.Properties?.["Policies"]), ...policiesNames(recorded?.properties?.["Policies"])]);
|
|
28996
|
+
return claims;
|
|
28997
|
+
}
|
|
28998
|
+
function orderInlinePolicyWriters(args) {
|
|
28999
|
+
const { writes, changes, templateResources, stateResources, dependencies, rank } = args;
|
|
29000
|
+
const writers = writes.filter((id) => {
|
|
29001
|
+
const type = changes.get(id)?.resourceType;
|
|
29002
|
+
return type === "AWS::IAM::Policy" || type !== void 0 && isInlinePolicyPrincipalType(type);
|
|
29003
|
+
});
|
|
29004
|
+
if (writers.length < 2) return [];
|
|
29005
|
+
const exact = /* @__PURE__ */ new Map();
|
|
29006
|
+
const loose = [];
|
|
29007
|
+
const all = [];
|
|
29008
|
+
for (const id of writers) for (const claim of inlinePolicyClaimsOf(id, changes.get(id), templateResources, stateResources)) {
|
|
29009
|
+
all.push({
|
|
29010
|
+
id,
|
|
29011
|
+
claim
|
|
29012
|
+
});
|
|
29013
|
+
if (claim.principal === ANY || claim.name === ANY) {
|
|
29014
|
+
loose.push({
|
|
29015
|
+
id,
|
|
29016
|
+
claim
|
|
29017
|
+
});
|
|
29018
|
+
continue;
|
|
29019
|
+
}
|
|
29020
|
+
const key = JSON.stringify([
|
|
29021
|
+
claim.kind,
|
|
29022
|
+
claim.principal,
|
|
29023
|
+
claim.name
|
|
29024
|
+
]);
|
|
29025
|
+
const ids = exact.get(key) ?? /* @__PURE__ */ new Set();
|
|
29026
|
+
ids.add(id);
|
|
29027
|
+
exact.set(key, ids);
|
|
29028
|
+
}
|
|
29029
|
+
const principalRows = new Set(writers.filter((id) => isInlinePolicyPrincipalType(changes.get(id).resourceType)));
|
|
29030
|
+
const pairs = /* @__PURE__ */ new Map();
|
|
29031
|
+
const pair = (a, b) => {
|
|
29032
|
+
if (a === b || principalRows.has(a) && principalRows.has(b)) return;
|
|
29033
|
+
const [x, y] = rank(a) < rank(b) || rank(a) === rank(b) && a < b ? [a, b] : [b, a];
|
|
29034
|
+
pairs.set(JSON.stringify([x, y]), [x, y]);
|
|
29035
|
+
};
|
|
29036
|
+
for (const ids of exact.values()) {
|
|
29037
|
+
const list = [...ids];
|
|
29038
|
+
for (let i = 0; i < list.length; i++) for (let j = i + 1; j < list.length; j++) pair(list[i], list[j]);
|
|
29039
|
+
}
|
|
29040
|
+
const meets = (a, b) => a === ANY || b === ANY || a === b;
|
|
29041
|
+
for (const { id, claim } of loose) for (const other of all) {
|
|
29042
|
+
if (other.claim.kind !== claim.kind) continue;
|
|
29043
|
+
if (meets(claim.principal, other.claim.principal) && meets(claim.name, other.claim.name)) pair(id, other.id);
|
|
29044
|
+
}
|
|
29045
|
+
if (pairs.size === 0) return [];
|
|
29046
|
+
const reaches = (from, to) => {
|
|
29047
|
+
const seen = /* @__PURE__ */ new Set();
|
|
29048
|
+
const stack = [from];
|
|
29049
|
+
while (stack.length > 0) {
|
|
29050
|
+
const id = stack.pop();
|
|
29051
|
+
if (id === to) return true;
|
|
29052
|
+
if (seen.has(id)) continue;
|
|
29053
|
+
seen.add(id);
|
|
29054
|
+
for (const dep of dependencies.get(id) ?? []) stack.push(dep);
|
|
29055
|
+
}
|
|
29056
|
+
return false;
|
|
29057
|
+
};
|
|
29058
|
+
const added = [];
|
|
29059
|
+
for (const [before, after] of pairs.values()) {
|
|
29060
|
+
if (reaches(after, before) || reaches(before, after)) continue;
|
|
29061
|
+
const deps = dependencies.get(after) ?? /* @__PURE__ */ new Set();
|
|
29062
|
+
deps.add(before);
|
|
29063
|
+
dependencies.set(after, deps);
|
|
29064
|
+
added.push({
|
|
29065
|
+
before,
|
|
29066
|
+
after
|
|
29067
|
+
});
|
|
29068
|
+
}
|
|
29069
|
+
return added;
|
|
29070
|
+
}
|
|
28618
29071
|
function ownPoliciesChange(change) {
|
|
28619
29072
|
return (change?.propertyChanges ?? []).some((c) => c.path === "Policies" && c.inPlacePropagated !== true && c.replacementPropagated !== true);
|
|
28620
29073
|
}
|
|
@@ -29490,13 +29943,55 @@ function secretNamesReadBy(logicalId, record, resources, judge = () => ({
|
|
|
29490
29943
|
const bags = judge(otherId);
|
|
29491
29944
|
const needles = secretNameNeedlesOf(otherId, other, bags.secrets, { embedded: bags.embedded });
|
|
29492
29945
|
if (needles === void 0) continue;
|
|
29493
|
-
for (const needle of needles) if (leaves
|
|
29946
|
+
for (const needle of needles) if (leavesHoldNeedle(leaves, needle)) read.add(needle);
|
|
29494
29947
|
}
|
|
29495
29948
|
return read;
|
|
29496
29949
|
}
|
|
29950
|
+
function leavesHoldNeedle(leaves, needle) {
|
|
29951
|
+
return leaves.some((leaf) => leaf === needle || needle.length >= 4 && leaf.includes(needle));
|
|
29952
|
+
}
|
|
29497
29953
|
function stateSecretNameNeedles(resources, secrets) {
|
|
29498
29954
|
return (logicalId) => secretNameNeedlesOf(logicalId, Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0, secrets, { embedded: void 0 });
|
|
29499
29955
|
}
|
|
29956
|
+
function storedRecordNameNeedles(logicalId, record, secrets) {
|
|
29957
|
+
const needles = secretNameNeedlesOf(logicalId, record, secrets, { embedded: void 0 });
|
|
29958
|
+
if (needles === void 0) return void 0;
|
|
29959
|
+
const bag = secrets !== void 0 && hasMaskableValues(secrets) ? secrets : void 0;
|
|
29960
|
+
const mask = (text) => bag === void 0 ? text : maskSecretsInText(text, bag);
|
|
29961
|
+
const folded = /* @__PURE__ */ new Map();
|
|
29962
|
+
if (bag !== void 0) for (const needle of printingCorpusOf(bag).keys()) recordLogOnlyValue(folded, needle.toLowerCase());
|
|
29963
|
+
const maskFolded = (text) => hasMaskableValues(folded) ? maskSecretsInText(text.toLowerCase(), folded) : text.toLowerCase();
|
|
29964
|
+
const publicLeaves = [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "" && !leaf.includes("{{resolve:") && leaf !== "***" && !isSecretDerivedValue(leaf.toLowerCase(), maskFolded) && !isSecretDerivedValue(leaf, mask));
|
|
29965
|
+
for (const needle of [...needles]) if (leavesHoldNeedle(publicLeaves, needle)) needles.delete(needle);
|
|
29966
|
+
return needles.size > 0 ? needles : void 0;
|
|
29967
|
+
}
|
|
29968
|
+
function storedSecretNameNeedles(resources, secrets, bag = /* @__PURE__ */ new Map(), outputs) {
|
|
29969
|
+
const named = [];
|
|
29970
|
+
for (const [logicalId, record] of Object.entries(resources)) {
|
|
29971
|
+
const needles = storedRecordNameNeedles(logicalId, record, secrets);
|
|
29972
|
+
if (needles !== void 0) named.push([logicalId, needles]);
|
|
29973
|
+
}
|
|
29974
|
+
if (named.length === 0) return bag;
|
|
29975
|
+
const readers = Object.entries(resources).map(([readerId, record]) => [readerId, [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "")]);
|
|
29976
|
+
readers.push([void 0, [...wholeStringLeavesOf(outputs)].filter((leaf) => leaf !== "")]);
|
|
29977
|
+
for (const [readerId, leaves] of readers) {
|
|
29978
|
+
if (leaves.length === 0) continue;
|
|
29979
|
+
for (const [namedId, needles] of named) {
|
|
29980
|
+
if (namedId === readerId) continue;
|
|
29981
|
+
for (const needle of needles) if (leavesHoldNeedle(leaves, needle)) recordLogOnlyValue(bag, needle);
|
|
29982
|
+
}
|
|
29983
|
+
}
|
|
29984
|
+
return bag;
|
|
29985
|
+
}
|
|
29986
|
+
function secretNamesStoredIn(record, needles) {
|
|
29987
|
+
const leaves = [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "");
|
|
29988
|
+
if (leaves.length === 0) return [];
|
|
29989
|
+
return [...needles].filter((needle) => leavesHoldNeedle(leaves, needle));
|
|
29990
|
+
}
|
|
29991
|
+
function secretNamedRecordNeedles(resources, secrets, bag = /* @__PURE__ */ new Map()) {
|
|
29992
|
+
for (const [logicalId, record] of Object.entries(resources)) for (const needle of storedRecordNameNeedles(logicalId, record, secrets) ?? []) recordLogOnlyValue(bag, needle);
|
|
29993
|
+
return bag;
|
|
29994
|
+
}
|
|
29500
29995
|
function secretNamePrintingBag(logicalId, resources) {
|
|
29501
29996
|
const bag = /* @__PURE__ */ new Map();
|
|
29502
29997
|
const record = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
|
|
@@ -30707,7 +31202,7 @@ function renderNestedStackTypeChangeRefusal(typeChanges, stackName) {
|
|
|
30707
31202
|
const rows = typeChanges.map((tc) => {
|
|
30708
31203
|
return `${` - ${tc.logicalId}: Type changes from ${tc.currentType} to ${tc.desiredType} (the existing ${tc.currentType} is ${tc.physicalId}).`}\n${tc.direction === "into-nested-stack" ? ` Replacing a single resource BY a nested stack is not supported: the create half of the replacement would deploy a whole child stack "${stackName}~${tc.logicalId}" as one row, while ${tc.physicalId} is still recorded under this logical id.` : ` Replacing a nested stack BY a single resource is not supported: a replacement deletes its old half as a best-effort cleanup step whose failure is only a warning, so the child stack "${stackName}~${tc.logicalId}" and every resource it owns could be left behind, untracked, under a deploy that reports success.`}`;
|
|
30709
31204
|
});
|
|
30710
|
-
return `Refusing to deploy ${stackName}: ` + (typeChanges.length === 1 ? `a resource changes its Type ` : `${typeChanges.length} resources change their Type `) + `into or out of ${NESTED_STACK_RESOURCE_TYPE}, which cdkd does not replace in place
|
|
31205
|
+
return `Refusing to deploy ${stackName}: ` + (typeChanges.length === 1 ? `a resource changes its Type ` : `${typeChanges.length} resources change their Type `) + `into or out of ${NESTED_STACK_RESOURCE_TYPE}, which cdkd does not replace in place.\n${rows.join("\n")}\n Deploy this as two changes instead: give the new resource a DIFFERENT logical id (in CDK, rename the construct) so the existing row is deleted through its own type's provider and the new one is created under its own — or remove the resource in one deploy and add its replacement in the next. There is no flag that overrides this refusal.`;
|
|
30711
31206
|
}
|
|
30712
31207
|
|
|
30713
31208
|
//#endregion
|
|
@@ -34169,7 +34664,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
|
|
|
34169
34664
|
resource
|
|
34170
34665
|
});
|
|
34171
34666
|
}
|
|
34172
|
-
if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused
|
|
34667
|
+
if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
|
|
34173
34668
|
if (candidates.length === 0 && masked.length === 0) return;
|
|
34174
34669
|
const allSiblings = {};
|
|
34175
34670
|
for (const [lid, res] of Object.entries(stateResources)) allSiblings[lid] = {
|
|
@@ -34202,7 +34697,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
|
|
|
34202
34697
|
if (masked.length > 0) try {
|
|
34203
34698
|
producerRegions = producerRegionsFromState(crossStackReads);
|
|
34204
34699
|
} catch {
|
|
34205
|
-
this.logger.debug(safeMsg`Masked observed baseline re-capture skipped for ${masked.length} resource(s): the record's cross-stack reads could not be read
|
|
34700
|
+
this.logger.debug(safeMsg`Masked observed baseline re-capture skipped for ${masked.length} resource(s): the record's cross-stack reads could not be read.`);
|
|
34206
34701
|
masked.length = 0;
|
|
34207
34702
|
}
|
|
34208
34703
|
for (const { logicalId, resource } of masked) {
|
|
@@ -34229,7 +34724,7 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
|
|
|
34229
34724
|
const task = (async () => {
|
|
34230
34725
|
const secrets = await resolveRecordSecrets(properties, (token, own) => this.resolver.resolveDynamicReferences(token, persistedTokenResolverContext(own, producerRegions)));
|
|
34231
34726
|
if (secrets === void 0 || secrets.size === 0) {
|
|
34232
|
-
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: its recorded references did not all resolve to distinct values
|
|
34727
|
+
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: its recorded references did not all resolve to distinct values.`);
|
|
34233
34728
|
return;
|
|
34234
34729
|
}
|
|
34235
34730
|
const readback = await withCurrentResourceSecrets(secrets, () => readCurrentState(resource.physicalId, logicalId, resource.resourceType, properties, context));
|
|
@@ -34241,14 +34736,14 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
|
|
|
34241
34736
|
secrets
|
|
34242
34737
|
});
|
|
34243
34738
|
if (recaptured === void 0) {
|
|
34244
|
-
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: no masked position could be certified, or the resource no longer reads back as its baseline records
|
|
34739
|
+
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: no masked position could be certified, or the resource no longer reads back as its baseline records.`);
|
|
34245
34740
|
return;
|
|
34246
34741
|
}
|
|
34247
34742
|
this.recapturedBaselines.set(recaptured, previous);
|
|
34248
|
-
this.logger.debug(safeMsg`Re-captured the masked observed baseline of ${logicalId}
|
|
34743
|
+
this.logger.debug(safeMsg`Re-captured the masked observed baseline of ${logicalId}.`);
|
|
34249
34744
|
return recaptured;
|
|
34250
34745
|
})().catch(() => {
|
|
34251
|
-
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: the re-capture failed
|
|
34746
|
+
this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: the re-capture failed.`);
|
|
34252
34747
|
});
|
|
34253
34748
|
this.observedCaptureTasks.set(logicalId, task);
|
|
34254
34749
|
}
|
|
@@ -34310,17 +34805,27 @@ function deepEqualValue(a, b) {
|
|
|
34310
34805
|
|
|
34311
34806
|
//#endregion
|
|
34312
34807
|
//#region src/deployment/deploy-engine/masking.ts
|
|
34313
|
-
function diffLogMasker(diffSecrets, template, parameterValues) {
|
|
34808
|
+
function diffLogMasker(diffSecrets, template, parameterValues, resources) {
|
|
34314
34809
|
const inherited = this.options.inheritedSecrets;
|
|
34315
34810
|
const noEchoValues = /* @__PURE__ */ new Map();
|
|
34316
34811
|
const noEchoNames = new Set(Object.entries(template.Parameters ?? {}).filter(([, definition]) => definition?.NoEcho === true).map(([name]) => name));
|
|
34317
34812
|
const splitDelimiters = literalSplitDelimitersOf(template, noEchoNames);
|
|
34318
34813
|
for (const [name, definition] of Object.entries(template.Parameters ?? {})) if (definition?.NoEcho === true && Object.hasOwn(parameterValues, name)) recordLogOnlyParameterValue(noEchoValues, parameterValues[name], splitDelimiters);
|
|
34319
|
-
|
|
34814
|
+
const stateNames = /* @__PURE__ */ new Map();
|
|
34815
|
+
const union = createUnionSecretMasker([
|
|
34320
34816
|
diffSecrets,
|
|
34321
34817
|
noEchoValues,
|
|
34818
|
+
stateNames,
|
|
34322
34819
|
inherited
|
|
34323
34820
|
]);
|
|
34821
|
+
let judged = false;
|
|
34822
|
+
return (text) => {
|
|
34823
|
+
if (!judged) {
|
|
34824
|
+
judged = true;
|
|
34825
|
+
storedSecretNameNeedles(resources, this.fingerprintNoEchoValues, stateNames);
|
|
34826
|
+
}
|
|
34827
|
+
return union(text);
|
|
34828
|
+
};
|
|
34324
34829
|
}
|
|
34325
34830
|
function freshNoEchoParameters(parameterValues) {
|
|
34326
34831
|
const inherited = this.options.inheritedSecrets;
|
|
@@ -34402,7 +34907,7 @@ function refuseRedactedAttributeReads(logicalId, resourceType, context) {
|
|
|
34402
34907
|
const producers = [...new Set(reads.map((read) => read.logicalId).filter((id) => !!id))];
|
|
34403
34908
|
throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: ${producers.map((id) => displayIdent(id)).join(", ")} declared ${reads.length === 1 ? "that attribute" : "those attributes"} NoEcho, so cdkd's recorded state holds only the redaction mask for ${reads.length === 1 ? "it" : "them"}, and cdkd does not re-run a producer to recover a value. Remedy: deploy a change to the producer in the SAME run as ${logicalId} (for a custom resource, change one of its properties, e.g. a nonce / version property, so its handler runs again and supplies the value), or stop declaring the value NoEcho.`, resourceType, logicalId);
|
|
34404
34909
|
}
|
|
34405
|
-
throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource was adopted by 'cdkd import' through the Cloud Control fallback, which records only the
|
|
34910
|
+
throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource was adopted by 'cdkd import' through the Cloud Control fallback, which records only the type's Fn::GetAtt attributes (its read-only properties plus the writable ones CloudFormation also accepts in Fn::GetAtt) and masks the rest. Either the attribute named above is not one of them — CloudFormation would reject an Fn::GetAtt naming it too, so stop reading it — or cdkd could not read that schema and masked the whole model, which the import warned about when it happened. If that warning named a missing cloudformation:DescribeType permission, grant it first. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
|
|
34406
34911
|
}
|
|
34407
34912
|
function allRecordedSecrets() {
|
|
34408
34913
|
const all = /* @__PURE__ */ new Map();
|
|
@@ -34787,7 +35292,7 @@ function createReadOnlyAttributeHealerFactory(options) {
|
|
|
34787
35292
|
region
|
|
34788
35293
|
})))().then((outcome) => {
|
|
34789
35294
|
if (outcome.kind === "read") try {
|
|
34790
|
-
logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS for this preview — its state record lacked one a Fn::GetAtt asked for
|
|
35295
|
+
logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS for this preview — its state record lacked one a Fn::GetAtt asked for; nothing is written: ${Object.keys(outcome.attributes).length} attribute(s) read`);
|
|
34791
35296
|
} catch {}
|
|
34792
35297
|
return outcome;
|
|
34793
35298
|
}).catch((error) => ({
|
|
@@ -34839,7 +35344,7 @@ async function readStaleAttributes(logicalId, resource, stackName) {
|
|
|
34839
35344
|
resourceType: resource.resourceType,
|
|
34840
35345
|
attributes
|
|
34841
35346
|
});
|
|
34842
|
-
this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for
|
|
35347
|
+
this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
|
|
34843
35348
|
return outcome;
|
|
34844
35349
|
}
|
|
34845
35350
|
function withHealedAttributes(logicalId, record) {
|
|
@@ -35188,9 +35693,9 @@ async function refuseUnlicensedGeneratedName(input) {
|
|
|
35188
35693
|
}], recoveryCommandFlags(this.options.refusalRecovery).flags).command}\``;
|
|
35189
35694
|
if (verdict.ownIntent !== void 0) {
|
|
35190
35695
|
const why = verdict.ownIntent === "abandoned" ? "a deploy of this stack that was killed or force-unlocked" : "a create of this stack that came back failed (a timeout or a server error)";
|
|
35191
|
-
return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds. This stack's create-token ledger records that ${why} sent this name, but this type reports no creation time, so cdkd cannot tell that resource is the one it made rather than another deployment's created since. Since ${adoptsText}, creating it would take that resource over. ${displaySafe(logicalId)} was not created. The likely cause: the resource is this stack's own, from that deploy. If it is, ${importLine} and re-run; if it is not, this stack is also deployed under another state backend
|
|
35696
|
+
return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds. This stack's create-token ledger records that ${why} sent this name, but this type reports no creation time, so cdkd cannot tell that resource is the one it made rather than another deployment's created since. Since ${adoptsText}, creating it would take that resource over. ${displaySafe(logicalId)} was not created. The likely cause: the resource is this stack's own, from that deploy. If it is, ${importLine} and re-run; if it is not, this stack is also deployed under another state backend.`);
|
|
35192
35697
|
}
|
|
35193
|
-
return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds, and nothing this stack records names that resource: not its state, its rollback journal or create-token ledger, nor what a destroy of it under this state prefix kept. Since ${adoptsText}, creating it would take that resource over, as CloudFormation refuses with "already exists". ${displaySafe(logicalId)} was not created. The likely cause: this stack is also deployed under another state backend (another --state-prefix, --state-bucket or account), where cdkd generates the same names. One stack name per account and region is supported
|
|
35698
|
+
return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds, and nothing this stack records names that resource: not its state, its rollback journal or create-token ledger, nor what a destroy of it under this state prefix kept. Since ${adoptsText}, creating it would take that resource over, as CloudFormation refuses with "already exists". ${displaySafe(logicalId)} was not created. The likely cause: this stack is also deployed under another state backend (another --state-prefix, --state-bucket or account), where cdkd generates the same names. One stack name per account and region is supported: deploy it under one backend only, or give this stack another name. If the resource is this stack's own, ${importLine} and re-run.`);
|
|
35194
35699
|
}
|
|
35195
35700
|
}
|
|
35196
35701
|
}
|
|
@@ -36194,7 +36699,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
36194
36699
|
const droppedOverrides = [];
|
|
36195
36700
|
if (oldReplicaOverrides.OnDemandThroughputOverride && !replicaOverrides.OnDemandThroughputOverride) droppedOverrides.push("ReadOnDemandThroughputSettings");
|
|
36196
36701
|
if (oldReplicaOverrides.ProvisionedThroughputOverride && !replicaOverrides.ProvisionedThroughputOverride) droppedOverrides.push("ReadProvisionedThroughputSettings");
|
|
36197
|
-
if (droppedOverrides.length > 0) warn(`Cross-region replica ${region} of ${physicalId}: the template no longer declares ${droppedOverrides.map((o) => maskSecrets(o)).join(" / ")}, but DynamoDB offers no way to CLEAR a replica-level throughput override — a -1 sentinel is stored literally, and an empty override block wedges the table in UPDATING
|
|
36702
|
+
if (droppedOverrides.length > 0) warn(`Cross-region replica ${region} of ${physicalId}: the template no longer declares ${droppedOverrides.map((o) => maskSecrets(o)).join(" / ")}, but DynamoDB offers no way to CLEAR a replica-level throughput override — a -1 sentinel is stored literally, and an empty override block wedges the table in UPDATING. The previous override is STILL IN EFFECT on AWS. Set an explicit value, or remove and re-add the replica, to change it.`);
|
|
36198
36703
|
}
|
|
36199
36704
|
if (replica["TableClassOverride"]) updateAction.TableClassOverride = replica["TableClassOverride"];
|
|
36200
36705
|
if (!(updateAction.KMSMasterKeyId !== void 0 || updateAction.GlobalSecondaryIndexes !== void 0 || updateAction.TableClassOverride !== void 0 || updateAction.ProvisionedThroughputOverride !== void 0 || updateAction.OnDemandThroughputOverride !== void 0)) {
|
|
@@ -36697,7 +37202,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
36697
37202
|
}
|
|
36698
37203
|
try {
|
|
36699
37204
|
if (hasTransitionalIndex(preDeleteIndexes)) {
|
|
36700
|
-
this.logger.debug(`Waiting for indexes on ${physicalId} to settle before DeleteTable
|
|
37205
|
+
this.logger.debug(`Waiting for indexes on ${physicalId} to settle before DeleteTable`);
|
|
36701
37206
|
await this.waitForIndexesActive(physicalId, logicalId, {
|
|
36702
37207
|
proceedNote: DELETE_INDEX_WAIT_PROCEED_NOTE,
|
|
36703
37208
|
budget
|
|
@@ -38628,14 +39133,14 @@ const REMEDY = "To move a custom resource to a different handler, give it a new
|
|
|
38628
39133
|
const UNJUDGEABLE_REMEDY = `Where the recorded ServiceToken is unreadable and the handler did not change, put the ARN of the handler that created this resource (the one it was last deployed with, not the one the template names now) back as ServiceToken in state.json (a ServiceToken fed by a NoEcho parameter is recorded only as '${"***"}': feed it from a plain value) and re-deploy.`;
|
|
38629
39134
|
function renderServiceTokenRefusal(refusals, stackName, mask = (text) => text) {
|
|
38630
39135
|
const rows = refusals.map((refusal) => ` - ${rowText(refusal, mask)}`);
|
|
38631
|
-
return `Refusing to deploy ${stackName}: ` + (refusals.length === 1 ? `a custom resource's ServiceToken changes` : `${refusals.length} custom resources' ServiceTokens change`) + `, which CloudFormation does not allow ("Modifying service token is not allowed")
|
|
39136
|
+
return `Refusing to deploy ${stackName}: ` + (refusals.length === 1 ? `a custom resource's ServiceToken changes` : `${refusals.length} custom resources' ServiceTokens change`) + `, which CloudFormation does not allow ("Modifying service token is not allowed"). Nothing was sent to either handler.
|
|
38632
39137
|
${rows.join("\n")}\n ${REMEDY}` + (refusals.some((refusal) => refusal.kind === "unjudgeable") ? `\n ${UNJUDGEABLE_REMEDY}` : "");
|
|
38633
39138
|
}
|
|
38634
39139
|
function serviceTokenBlockingReason(refusal, mask) {
|
|
38635
|
-
return `${rowText(refusal, mask)} cdkd deploy refuses a changed custom-resource ServiceToken, as CloudFormation does
|
|
39140
|
+
return `${rowText(refusal, mask)} cdkd deploy refuses a changed custom-resource ServiceToken, as CloudFormation does; give the custom resource a new logical id to move it to another handler.`;
|
|
38636
39141
|
}
|
|
38637
39142
|
function deferredServiceTokenWarning(row) {
|
|
38638
|
-
return `${displayIdent(row.logicalId)}: its ServiceToken reads a resource this deploy replaces, creates or updates, or a value this preview cannot resolve. If it resolves to a different ARN than the one recorded, cdkd deploy refuses the update before invoking any handler and rolls back
|
|
39143
|
+
return `${displayIdent(row.logicalId)}: its ServiceToken reads a resource this deploy replaces, creates or updates, or a value this preview cannot resolve. If it resolves to a different ARN than the one recorded, cdkd deploy refuses the update before invoking any handler and rolls back. A replaced backing function is already deleted by then and the rollback re-creates it; if that fails, the record names a function that no longer exists.`;
|
|
38639
39144
|
}
|
|
38640
39145
|
|
|
38641
39146
|
//#endregion
|
|
@@ -39903,6 +40408,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
39903
40408
|
|
|
39904
40409
|
//#endregion
|
|
39905
40410
|
//#region src/deployment/deploy-engine/provision.ts
|
|
40411
|
+
const NESTED_STACK_ROW_TYPE = "AWS::CloudFormation::Stack";
|
|
39906
40412
|
async function provisionResource(logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress) {
|
|
39907
40413
|
const resourceType = change.resourceType;
|
|
39908
40414
|
const renderer = getLiveRenderer();
|
|
@@ -39938,7 +40444,13 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
|
|
|
39938
40444
|
const physicalIdBeforeUpdate = stateResources[logicalId]?.physicalId;
|
|
39939
40445
|
const provisionedByBeforeUpdate = stateResources[logicalId]?.provisionedBy;
|
|
39940
40446
|
this.noteSecretNamedRecord(logicalId, stateResources[logicalId]);
|
|
40447
|
+
const readsRegistry = this.secretNameBagFor(logicalId);
|
|
40448
|
+
for (const needle of secretNamesStoredIn(stateResources[logicalId], printingCorpusOf(this.preDeploySecretNamedRecords ?? /* @__PURE__ */ new Map()).keys())) recordLogOnlyValue(readsRegistry, needle);
|
|
39941
40449
|
if (change.changeType === "DELETE") this.noteSecretNamedReads(logicalId, stateResources[logicalId], stateResources);
|
|
40450
|
+
if (resourceType === NESTED_STACK_ROW_TYPE) {
|
|
40451
|
+
const registry = this.secretNameBagFor(logicalId);
|
|
40452
|
+
for (const needle of printingCorpusOf(this.preDeploySecretNamedRecords ?? /* @__PURE__ */ new Map()).keys()) recordLogOnlyValue(registry, needle);
|
|
40453
|
+
}
|
|
39942
40454
|
const printingRegistry = this.secretNameBagFor(logicalId);
|
|
39943
40455
|
let nestedChildUnaddressed;
|
|
39944
40456
|
const deleteGuards = [];
|
|
@@ -40245,16 +40757,29 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
40245
40757
|
this.logger.info(`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
|
|
40246
40758
|
const createUpdateExecutor = new DagExecutor();
|
|
40247
40759
|
const provisionable = new Set(createUpdateIds);
|
|
40760
|
+
const createUpdateDeps = /* @__PURE__ */ new Map();
|
|
40248
40761
|
for (const id of createUpdateIds) {
|
|
40249
40762
|
const allDeps = this.dagBuilder.getDirectDependencies(dag, id);
|
|
40250
|
-
|
|
40251
|
-
createUpdateExecutor.add({
|
|
40252
|
-
id,
|
|
40253
|
-
dependencies: deps,
|
|
40254
|
-
state: "pending",
|
|
40255
|
-
data: changes.get(id)
|
|
40256
|
-
});
|
|
40763
|
+
createUpdateDeps.set(id, new Set(allDeps.filter((d) => provisionable.has(d))));
|
|
40257
40764
|
}
|
|
40765
|
+
const levelOf = /* @__PURE__ */ new Map();
|
|
40766
|
+
executionLevels.forEach((level, at) => {
|
|
40767
|
+
for (const id of level) levelOf.set(id, at);
|
|
40768
|
+
});
|
|
40769
|
+
for (const { before, after } of orderInlinePolicyWriters({
|
|
40770
|
+
writes: createUpdateIds,
|
|
40771
|
+
changes,
|
|
40772
|
+
templateResources: template.Resources ?? {},
|
|
40773
|
+
stateResources: currentState.resources,
|
|
40774
|
+
dependencies: createUpdateDeps,
|
|
40775
|
+
rank: (id) => levelOf.get(id) ?? Number.MAX_SAFE_INTEGER
|
|
40776
|
+
})) this.logger.debug(safeMsg`${after} waits for ${before}: both write an inline policy name on the same IAM principal`);
|
|
40777
|
+
for (const id of createUpdateIds) createUpdateExecutor.add({
|
|
40778
|
+
id,
|
|
40779
|
+
dependencies: createUpdateDeps.get(id),
|
|
40780
|
+
state: "pending",
|
|
40781
|
+
data: changes.get(id)
|
|
40782
|
+
});
|
|
40258
40783
|
const enqueueLostChildren = (executor) => {
|
|
40259
40784
|
const lostIds = noChangeChildrenOfRecreatedParents({
|
|
40260
40785
|
changes,
|
|
@@ -42014,6 +42539,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
42014
42539
|
this.seedPersistedNoEchoAttributes(currentState.resources);
|
|
42015
42540
|
const orphanCountBeforeAdoption = (currentState.orphans ?? []).length;
|
|
42016
42541
|
const orphanPlan = await this.adoptRollbackOrphans(currentState, effectiveTemplate);
|
|
42542
|
+
this.preDeploySecretNamedRecords = secretNamedRecordNeedles(currentState.resources, this.fingerprintNoEchoValues);
|
|
42017
42543
|
if (Object.keys(orphanPlan.adopted).length > 0) {
|
|
42018
42544
|
this.stampReasonlessParameterRefusals(currentState.resources, template);
|
|
42019
42545
|
if (backfillMaskedPropertyFingerprints(currentState.resources, template, backfillNoEchoValues) > 0) maskedFingerprintsBackfilled = true;
|
|
@@ -42048,7 +42574,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
42048
42574
|
sources: maskedInputSourcesForDiff,
|
|
42049
42575
|
rebaselined: /* @__PURE__ */ new Map()
|
|
42050
42576
|
};
|
|
42051
|
-
const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName));
|
|
42577
|
+
const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName));
|
|
42052
42578
|
createOnlyPrefetch.cancel();
|
|
42053
42579
|
for (const [logicalId, fingerprints] of maskedInputs?.rebaselined ?? []) {
|
|
42054
42580
|
const record = currentState.resources[logicalId];
|
|
@@ -42067,7 +42593,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
42067
42593
|
recreateTargetIds: recreateTargetIdsFor(this.options.recreateTargets, stackName)
|
|
42068
42594
|
}).refused;
|
|
42069
42595
|
if (serviceTokenRefusals.length > 0) {
|
|
42070
|
-
const mask = this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues);
|
|
42596
|
+
const mask = this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources);
|
|
42071
42597
|
throw markNonRetryable(new CdkdError(renderServiceTokenRefusal(serviceTokenRefusals, stackName, mask), SERVICE_TOKEN_CHANGE_REFUSED));
|
|
42072
42598
|
}
|
|
42073
42599
|
const recreatePromotion = promoteRecreateTargets(changes, this.options.recreateTargets, stackName);
|
|
@@ -42117,7 +42643,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
42117
42643
|
const persistExportSet = new Set(exportNamesToPersist ?? []);
|
|
42118
42644
|
const exportSetChanged = exportNamesToPersist !== void 0 && (currentEffectiveExports.size !== persistExportSet.size || [...persistExportSet].some((k) => !currentEffectiveExports.has(k)));
|
|
42119
42645
|
if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} A downstream Fn::ImportValue may fail until the next deploy.`);
|
|
42120
|
-
else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path
|
|
42646
|
+
else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path)`);
|
|
42121
42647
|
const skippedOutputsChanged = !skippedOutputsEqual(currentState.skippedOutputs, this.skippedOutputs);
|
|
42122
42648
|
const healedAttributesPending = this.hasUnpersistedHeals(currentState.resources);
|
|
42123
42649
|
const conditionVerdictsChanged = !conditionVerdictRecordsEqual(readRecordedConditionVerdicts(currentState), conditionVerdicts);
|
|
@@ -42146,14 +42672,14 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
42146
42672
|
if (outputsChanged || exportSetChanged) {
|
|
42147
42673
|
persistedOutputs = refreshedState.outputs;
|
|
42148
42674
|
if (outputsChanged) this.logger.info("Persisted Outputs-only change (no resource diff).");
|
|
42149
|
-
else this.logger.debug("Persisted export-set change (no outputs-value diff, no-change path
|
|
42675
|
+
else this.logger.debug("Persisted export-set change (no outputs-value diff, no-change path)");
|
|
42150
42676
|
if (this.exportIndexStore) await this.exportIndexStore.updateForStack(stackName, this.stackRegion, importableOutputs({
|
|
42151
42677
|
...refreshedState,
|
|
42152
42678
|
outputs: this.redactOutputs(refreshedState.outputs)
|
|
42153
42679
|
}));
|
|
42154
42680
|
} else if (observedRefresh) this.logger.debug("Persisted refreshed observedProperties (no-change path)");
|
|
42155
|
-
else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path
|
|
42156
|
-
else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path
|
|
42681
|
+
else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path)");
|
|
42682
|
+
else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path)");
|
|
42157
42683
|
} catch (saveError) {
|
|
42158
42684
|
this.logger.warn(`Failed to persist no-change state update: ${saveError instanceof Error ? saveError.message : String(saveError)} — drift baseline / outputs will be re-resolved on next deploy.`);
|
|
42159
42685
|
}
|
|
@@ -42545,6 +43071,7 @@ var DeployEngine = class {
|
|
|
42545
43071
|
perResourceTemplateProps = /* @__PURE__ */ new Map();
|
|
42546
43072
|
perResourceResolvedType = /* @__PURE__ */ new Map();
|
|
42547
43073
|
fingerprintNoEchoValues = void 0;
|
|
43074
|
+
preDeploySecretNamedRecords = void 0;
|
|
42548
43075
|
fingerprintParameters = void 0;
|
|
42549
43076
|
fingerprintChildTemplates = void 0;
|
|
42550
43077
|
perResourceInputFingerprints = /* @__PURE__ */ new Map();
|
|
@@ -42611,6 +43138,7 @@ var DeployEngine = class {
|
|
|
42611
43138
|
this.constructPathTemplate = void 0;
|
|
42612
43139
|
this.perResourceResolvedType = /* @__PURE__ */ new Map();
|
|
42613
43140
|
this.fingerprintNoEchoValues = void 0;
|
|
43141
|
+
this.preDeploySecretNamedRecords = void 0;
|
|
42614
43142
|
this.fingerprintParameters = void 0;
|
|
42615
43143
|
this.fingerprintChildTemplates = void 0;
|
|
42616
43144
|
this.perResourceInputFingerprints = /* @__PURE__ */ new Map();
|
|
@@ -42699,7 +43227,7 @@ var DeployEngine = class {
|
|
|
42699
43227
|
};
|
|
42700
43228
|
}
|
|
42701
43229
|
inlinePolicyClaimedFor(resourceType, logicalId, stateResources) {
|
|
42702
|
-
if (resourceType !== "AWS::IAM::Policy") return
|
|
43230
|
+
if (resourceType !== "AWS::IAM::Policy" && !isInlinePolicyPrincipalType(resourceType)) return;
|
|
42703
43231
|
const args = {
|
|
42704
43232
|
selfLogicalId: logicalId,
|
|
42705
43233
|
writers: this.inlinePolicyWriters,
|
|
@@ -42846,5 +43374,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
|
|
|
42846
43374
|
DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
|
|
42847
43375
|
|
|
42848
43376
|
//#endregion
|
|
42849
|
-
export { getPriorAttempts as $, configBooleanRefusal as $a, hasOwnKey as $c, previewableOrphanRecords as $i, acquireIdempotencyToken as $n, recoverMaskedOutput as $o, s3BucketArn as $r, validateAssetBucketName as $s, orphanDeleteNeedsIdentity as $t, noEchoExactEchoLeavesOf as A, unpreviewableOrphanRecords as Aa, resolveCaptureObservedState as Ac, hasReadableOutputs as Ai, maskEventTextWithBoundBags as An, carryLogOnlyValues as Ao, ec2InstanceProtectionSite as Ar, hasUnverifiableParameterRefusal as As, isHandledOrphan as At, beginDeleteWait as B, findReplacedReadersOfRecreateTargets as Ba, MIGRATE_TMP_PREFIX as Bc, malformedOrphanRecordsRefusalMessage as Bi, effectiveDeletionPolicy as Bn, errorCauseChain as Bo, producerRegionsFromState as Br, WorkGraph as Bs, withStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedState as Ca, Synthesizer as Cc, STATE_RESOURCES_MALFORMED as Ci, collectPublishedOutputNames as Cn, noEchoLeavesOf as Co, deleteIndeterminateGuards as Cr, isNotImplemented as Cs, revertedNestedRowIds as Ct, withResourceDeadline as D, repairMalformedResourceEntriesForReadOnly as Da, loadCdkJson as Dc, deployRefusesOrphanRowsReason as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, readsNoEchoSource as Do, isWaitAbandonedError as Dr, exportNamesCarriedFrom as Ds, withNestedStackContext as Dt, serviceTokenBlockingReason as E, repairMalformedOutputsForReadOnly as Ea, getLegacyStateBucketName as Ec, accountArgs as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, readbackPathFor as Eo, withIndeterminateGuard as Er, describeRegionValueKind as Es, getCurrentNestedStackContext as Et, isProtectionValueActive as F, findSilentDropProperties as Fa, stateBucketExistenceConfirmed as Fc, malformedExportNamesWarning as Fi, ATOMIC_FINAL_SNAPSHOT_TYPES as Fn, printingCorpusOf as Fo, DiffCalculator as Fr, orphansCarriedFrom as Fs, replayFailedOperations as Ft, DELETE_INDEX_WAIT_PROCEED_NOTE as G, renderStatefulReason as Ga, expectedOwnerParam as Gc, malformedOutputsRefusalMessage as Gi, constructPathOf as Gn, scrubResourceRecord as Go, explicitRoleArnOrThrow as Gr, AssetModeResolver as Gs, isReplacementOrphan as Gt, deleteBudgetKey as H, MULTI_REGION_RECREATE_BLOCKED_TYPES as Ha, uploadCfnTemplate as Hc, malformedOrphanRowsKeptWarning as Hi, refusesFinalSnapshot as Hn, maskSecretsInText as Ho, applyRoleArnIfSet as Hr, createAssetRedirectResolver as Hs, recordAfterRollbackUpdate as Ht, perType as I, unwrittenCreateOnlyReplacement as Ia, warnDeprecatedNoPrefixCliFlag as Ic, malformedExportSourceWarning as Ii, PRE_DELETE_SNAPSHOT_TYPES as In, recordLogOnlyParameterValue as Io, INTRINSIC_KEYS as Ir, shouldRetainResource as Is, replayRollback as It, waitForIndexesSettled as J, isWarmThroughputDecrease as Ja, derivePartitionAndUrlSuffix as Jc, malformedResourceEntriesWarning as Ji, RollbackInlinePolicyWriters as Jn, isUncertifiedBaselineMaskPosition as Jo, AWS_CREDENTIAL_ENV_KEYS as Jr, ensureAssetStorage as Js, recheckFailedPlan as Jt, INDEX_SETTLE_POLL_INTERVAL_MS as K, WARM_THROUGHPUT_MEMBERS as Ka, PARTITION_TABLE as Kc, malformedOutputsWarning as Ki, findDestructiveChanges as Kn, DYNAMIC_REFERENCE_TOKEN_SCAN as Ko, isIamRoleArn as Kr, BOOTSTRAP_MARKER_PREFIX as Ks, planFailedOps as Kt, readProtection as L, withoutSilentDropProperties as La, ssmResolvedValueType as Lc, malformedLocalOutputsWarning as Li, buildFinalSnapshotIdentifier as Ln, recordLogOnlyValue as Lo, IntrinsicFunctionResolver as Lr, AssetPublisher as Ls, awaitInFlightSibling as Lt, recordedProtectionEvidence as M, unreadableResourceEntries as Ma, resolveStateBucketWithDefault as Mc, isReadableOrphanRecord as Mi, secretNamePrintingBag as Mn, hasMaskableValues as Mo, observeThenDisableInstanceApiTermination as Mr, importableOutputs as Ms, loadJournaledOrphans as Mt, recordedProtectionNote as N, withheldAccountClause as Na, resolveStateBucketWithDefaultAndSource as Nc, isReadableResourceEntry as Ni, stateSecretNameNeedles as Nn, literalSplitDelimitersOf as No, reDisableInstanceApiTermination as Nr, isReadableBag as Ns, makeForeignHolderScan as Nt, noEchoAttributeNamesOf as O, repairMalformedResourcePropertiesForReadOnly as Oa, resolveApp as Oc, displayLogicalId as Oi, completedReplayEntries as On, valueAtCoordinate as Oo, markWaitAbandoned as Or, hasReadableExportSet as Os, deleteJournaledOrphans as Ot, PROTECTION_PROPERTY_BY_TYPE as P, findActionableSilentDrops as Pa, resolveUseCdkBootstrapAssets as Pc, malformedDriftResourcePropertiesWarning as Pi, extractDeploymentEventError as Pn, logOnlyValueCount as Po, reEnableInstanceApiTermination as Pr, orphansAfterRollback as Ps, sameJournaledOrphans as Pt, isTruthyCfnBoolean as Q, coerceCfnInteger as Qa, defineOwnKey as Qc, malformedStateRefusalMessage as Qi, withCreateTokenLedger as Qn, recordNestedStackParameterExpressions as Qo, isSettledInstanceState as Qr, readBootstrapMarkerBody as Qs, seedsDeleteFirstGuard as Qt, DynamoDBGlobalTableProvider as R, NO_CC_HANDLERS_REASON as Ra, CFN_TEMPLATE_BODY_LIMIT as Rc, malformedLocalResourceEntriesWarning as Ri, ccRoutedFinalSnapshotError as Rn, shareLogOnlyValues as Ro, poisonRenderedSpellingsCollidingIn as Rr, isSensitiveAttributeName as Rs, destroyStackRecordsView as Rt, keptForReadoption as S, refuseMalformedResourcesForExport as Sa, getDockerImageBySourceHash as Sc, STATE_REGION_DIVERGED as Si, collectDeclaredOutputNames as Sn, noEchoCoordinatesOf as So, UNSPECIFIED_SKIP_REASON as Sr, isAccessDenied as Ss, revertNestedChildFromJournal as St, findServiceTokenRefusals as T, repairMalformedOrphansForReadOnly as Ta, getDefaultStateBucketName as Tc, UNREADABLE_RESOURCES_MAP_ROW as Ti, bindingSkippedOutputs as Tn, passedNoEchoParametersOf as To, deleteSkipReason as Tr, acceptedCreateOnlyDropsOf as Ts, collectNestedChildUnaddressed as Tt, resolveDynamoDbDeleteBudgetClock as U, isStatefulRecreateTargetForReplace as Ua, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Uc, malformedOrphansRefusalMessage as Ui, unsupportedFinalSnapshotError as Un, markSameGenerationBag as Uo, assertFlagRoleArn as Ur, loadPublishableAssetManifest as Us, demoteSupersededOrphans as Ut, compensateRemovedDeletionProtection as V, shownType as Va, findLargeInlineResources as Vc, malformedOrphanRecordsWarning as Vi, isFinalSnapshotError as Vn, maskSecretsInError as Vo, regionLessSecretName as Vr, buildAssetRedirectMap as Vs, removeProtectionTypeList as Vt, resolveDynamoDbDeleteBudgetMs as W, isStatefulRecreateTargetSync as Wa, decodeListingKey as Wc, malformedOrphansWarning as Wi, maskingRetryLogger as Wn, redactSecretsForState as Wo, assertSendableRoleArn as Wr, rewriteTemplateAssetReferences as Ws, isJournaledOrphan as Wt, S3_AUTO_DELETE_OBJECTS_TAG as X, toFiniteNumber as Xa, StageLoadError as Xc, malformedResourcesWarning as Xi, ledgerForStack as Xn, identityKeyFor as Xo, callerEnvCredentials as Xr, isCrossRegionRedirect as Xs, replacementNeverSwapped as Xt, ECR_AUTO_DELETE_IMAGES_TAG as Y, toCfnInteger as Ya, AssemblyReader as Yc, malformedResourcePropertiesWarning as Yi, earliestDefined as Yn, pathCrossesDottedKey as Yo, applyCallerIdentityCredentials as Yr, getBootstrapMarkerKey as Ys, recordUnderIdIsNotOwn as Yt, hasCdkAutoDeleteTag as Z, coerceCfnBoolean as Za, processStackMessages as Zc, malformedScrubResourceEntriesRefusalMessage as Zi, reserveStackCreateToken as Zn, inheritNestedStackParameterAssociations as Zo, envCredentialsAreAssumedRole as Zr, parseBootstrapMarker as Zs, resolveReplacementOldType as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedResourcePropertiesForDrift as _a, runDockerStreaming as _c, parseWebACLArn as _i, carriedExportAliasExposure as _n, isMarkedCoordinate as _o, getCurrentResourceSecrets as _r, rebuildClientForBucketRegion as _s, displacedPhysicalIdShown as _t, findNestedTemplateTreeDefect as a, refuseMalformedOrphansForDestroy as aa, describeDockerExecFailure as ac, isUnboundTemplateParameter as ai, displayAssemblyPath as al, redactedDeleteAddressFields as an, requireConfigObject as ao, tagMapAsList as ar, recordNoEchoParameterFreshValue as as, gray as at, lookupEachName as b, refuseMalformedResourcesForDeploy as ba, stripControlChars as bc, passedParameterClassesOf as bi, isWholeDynamicReferenceValue as bn, maskWholeValue as bo, slowCcOperationTimeoutMs as br, applyCrossPrefixScan as bs, nestedChildStackName as bt, renderNestedTemplateTreeDefect as c, refuseMalformedOutputsForDestroy as ca, finchSecretArgvRefusal as cc, isImpossibleEmptyStoredAttribute as ci, clearBucketRegionCache as cl, updatePartialReason as cn, templateResourceTypes as co, stringifyIfAssigned as cr, STATE_SOURCED_BASELINE_RULES as cs, yellow as ct, conditionInputsFrom as d, refuseMalformedResourceEntriesForDeploy as da, isDockerClientEnvKey as dc, isNamelessDynamicReferenceError as di, WITHHELD_NAME_DISPLAY as dn, canonicalLambdaFunctionName as do, ccBrokenReason as dr, TEMPLATE_SOURCED_RULES as ds, reachableDivergentParameters as dt, refuseDivergentRecordRegionForDestroy as ea, validateContainerRepoName as ec, s3BucketDomainName as ei, hasPlainPrototype$1 as el, findNestedStackTypeChanges as en, configIntegerRefusal as eo, DBPROXY_TAGS_WHAT as er, carriesSecretMask as es, markRefusedBeforeApplying as et, parentSuppliedValues as f, refuseMalformedResourceEntriesForDestroy as fa, isMalformedEnvKey as fc, keepsSecretReferenceToken as fi, displayTextOrWithheld as fn, lambdaFunctionNameForMask as fo, isCustomResource as fr, WHOLE_DYNAMIC_REFERENCE_PATTERN as fs, resourcesNamingDeclaredParameter as ft, mergeNoChangeOutputs as g, refuseMalformedResourcePropertiesForDestroy as ga, runDockerForeground as gc, refStateLookupFromResource as gi, secretSafeKeyDisplay as gn, canonicalCoordinates as go, isCustomResourceType as gr, S3StateBackend as gs, displacedOpClause as gt, keptWholeReasonText as h, refuseMalformedResourceEntriesForOrphan as ha, redactedDockerCause as hc, isStalePlaceholderArnAttribute as hi, secretBearingStateKeyWarning as hn, TemplateParser as ho, readsNoEchoDeleteValues as hr, isLockInfoExpired as hs, NESTED_PENDING_PARENT_REASON as ht, childTemplateLoader as i, refuseMalformedOrphans as ia, describeDockerCapturedOutput as ic, coerceParameterTypedValue as ii, describeFileReadFailure as il, isRedactedRecordedValue as in, requireConfigArray as io, refuseMalformedDesiredTags as ir, recordNoEchoAttributeValues as is, cyan as it, noEchoParameterNamesOf as j, unreadableOrphanRecords as ja, resolveSkipPrefix as jc, hasReadableResources as ji, orphanRecordsPrintingBag as jn, createUnionSecretMasker as jo, isTerminationProtectionPropagationError as jr, importableOutputKeys as js, journaledOrphanLines as jt, noEchoComparisonForTemplate as k, repairMalformedResourcesForReadOnly as ka, resolveAutoAssetStorage as kc, hasReadableOrphans as ki, journaledOrphanPrintingBag as kn, liveMatchesUnresolvedTokenFrame as ko, disableInstanceApiTermination as kr, hasReasonlessBaselineRefusal as ks, dropFailedHint as kt, templateIdentity as l, refuseMalformedResourceAttributesForOrphan as la, formatDockerLoginError as lc, carriesDynamicReference as li, resolveBucketRegion as ll, DeploymentEventsReader as ln, describeTypeWithThrottleRetry as lo, CC_BROKEN_REASON as lr, STATE_SOURCED_CROSS_GENERATION_RULES as ls, computeParameterTaint as lt, isSecretBearingReferenceString as m, refuseMalformedResourceEntriesForImportSave as ma, redactDockerArgvValues as mc, cfnRefValueFromPhysicalId as mi, secretBearing as mn, DagBuilder as mo, TemplateNoEchoReresolver as mr, LockManager as ms, planOrphanAdoption as mt, IMPLICIT_DELETE_DEPENDENCIES as n, refuseMalformedOrphanRecords as na, buildDockerImage as nc, s3BucketRegionalDomainName as ni, ownValue as nl, inheritProducerRegions as nn, readConfigString as no, planTagDiff as nr, recordMaskOnlyValue as ns, createReadOnlyAttributeHealerFactory as nt, isAbsoluteAssetPath as o, refuseMalformedOrphansForOrphan as oa, describeDockerFailure as oc, parameterTypeMayLoseSecretIdentity as oi, renderAssemblyPathEscape as ol, redactedDeleteAddressSkip as on, requireConfigString as oo, tagPlanWarning as or, recordProvenPublicExpression as os, green as ot, readRecordedConditionVerdicts as p, refuseMalformedResourceEntriesForImport as pa, partitionSensitiveEnv as pc, AWS_NO_VALUE as pi, exportAliasCollisionScrubWarning as pn, sameLambdaFunctionAddress as po, wouldReturnToSdkProvider as pr, isSingleDynamicReferenceToken as ps, makeSiblingClaimReader as pt, deleteTableWithIndexBusyRetry as q, coerceWarmThroughput as qa, canonicalizeRegion as qc, malformedRenderedContainersWarning as qi, formatDestructiveChange as qn, dynamicReferenceTokens as qo, sendableAssumeRoleCommand as qr, assertAssetBucketRegion as qs, planRollback as qt, computeImplicitDeleteEdges as r, refuseMalformedOrphanRecordsForDestroy as ra, resolveDockerContextDirectory as rc, s3BucketWebsiteUrl as ri, absoluteAssemblyPathEscape as rl, REDACTED_DELETE_ADDRESS_SKIP_REASON as rn, replayWarn as ro, readTagList as rr, recordMaskOnlyValuesIn as rs, bold as rt, listNestedTemplateRows as s, refuseMalformedOutputs as sa, dockerSpawnEnvWithSensitive as sc, getAccountInfo as si, resolveAssemblyPath as sl, updatePartialMessage as sn, prefetchCreateOnlyPropertyPaths as so, definedAttributes as sr, wholeStringLeavesOf as ss, red as st, DeployEngine as t, refuseMalformedNestedChildOutputs as ta, buildDenyExternalAccessPolicy as tc, s3BucketDualStackDomainName as ti, nullPrototypeRecord as tl, getCurrentProducerRegions as tn, configStringRefusal as to, DBPROXY_TAG_OPTIONS as tr, provenPublicValue as ts, formatResourceLine as tt, conditionFingerprint as u, refuseMalformedResourceEntries as ua, getDockerCmd as uc, carriesFetchableDynamicReference as ui, DeploymentEventsStore as un, withRetry as uo, ProviderRegistry as ur, STATE_SOURCED_READBACK_RULES as us, namesAnyDeclaredParameter as ut, chunks as v, refuseMalformedResourcePropertiesForExport as va, warnFinchArgvExposure as vc, withSharedDrainBudget as vi, exportNameNoEchoParameters as vn, maskAtCoordinates as vo, withPrintingSecrets as vr, CrossPrefixReadError as vs, dropSettledNestedJournals as vt, deferredServiceTokenWarning as w, repairMalformedOrphanRecordsForReadOnly as wa, synthesisStatusMessage as wc, UNREADABLE_ORPHANS_CONTAINER_ROW as wi, isExportAliasCollision as wn, noEchoOutputsComparison as wo, deleteLeftInPlace as wr, splitImportedOps as ws, withNestedRevertRun as wt, withApiLimit as x, refuseMalformedResourcesForDestroy as xa, AssetManifestLoader as xc, JSON_LISTING_HOLE_VALUE as xi, noEchoParameterValueSeed as xn, maskedLeafCoordinatesOf as xo, unchangedBehindSecretReference as xr, crossPrefixDeniedWarning as xs, recordDisplacedSkips as xt, isAccessDeniedError as y, refuseMalformedResourcePropertiesForOrphan as ya, escapeRegExp$3 as yc, parameterInputsFor as yi, exportNameSecretExposure as yn, maskReadbackAtCoordinates as yo, CloudControlProvider as yr, CrossPrefixScanCache as ys, getNestedRevertRun as yt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as z, hasNoCloudControlHandlers as za, CFN_TEMPLATE_URL_LIMIT as zc, malformedLocalResourcesWarning as zi, createPreDeleteFinalSnapshot as zn, createSecretMasker as zo, classifyReplaySecretRegion as zr, stringifyValue as zs, getStackRecords as zt };
|
|
42850
|
-
//# sourceMappingURL=deploy-engine-
|
|
43377
|
+
export { getPriorAttempts as $, isWarmThroughputDecrease as $a, derivePartitionAndUrlSuffix as $c, malformedResourceEntriesWarning as $i, reserveStackCreateToken as $n, isUncertifiedBaselineMaskPosition as $o, AWS_CREDENTIAL_ENV_KEYS as $r, ensureAssetStorage as $s, orphanDeleteNeedsIdentity as $t, noEchoExactEchoLeavesOf as A, repairMalformedOrphansForReadOnly as Aa, getDefaultStateBucketName as Ac, UNREADABLE_RESOURCES_MAP_ROW as Ai, maskEventTextWithBoundBags as An, passedNoEchoParametersOf as Ao, deleteSkipReason as Ar, acceptedCreateOnlyDropsOf as As, isHandledOrphan as At, beginDeleteWait as B, findSilentDropProperties as Ba, stateBucketExistenceConfirmed as Bc, malformedExportNamesWarning as Bi, ccRoutedFinalSnapshotError as Bn, printingCorpusOf as Bo, DiffCalculator as Br, orphansCarriedFrom as Bs, withStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedResourcePropertiesForExport as Ca, warnFinchArgvExposure as Cc, withSharedDrainBudget as Ci, collectPublishedOutputNames as Cn, maskAtCoordinates as Co, customResourceResponseExpirationWarning as Cr, CrossPrefixReadError as Cs, revertedNestedRowIds as Ct, withResourceDeadline as D, refuseMalformedResourcesForExport as Da, getDockerImageBySourceHash as Dc, STATE_REGION_DIVERGED as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, noEchoCoordinatesOf as Do, UNSPECIFIED_SKIP_REASON as Dr, isAccessDenied$1 as Ds, withNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourcesForDestroy as Ea, AssetManifestLoader as Ec, JSON_LISTING_HOLE_VALUE as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, maskedLeafCoordinatesOf as Eo, unchangedBehindSecretReference as Er, crossPrefixDeniedWarning as Es, getCurrentNestedStackContext as Et, isProtectionValueActive as F, unpreviewableOrphanRecords as Fa, resolveCaptureObservedState as Fc, hasReadableOutputs as Fi, storedSecretNameNeedles as Fn, carryLogOnlyValues as Fo, ec2InstanceProtectionSite as Fr, hasUnverifiableParameterRefusal as Fs, replayFailedOperations as Ft, DELETE_INDEX_WAIT_PROCEED_NOTE as G, findReplacedReadersOfRecreateTargets as Ga, MIGRATE_TMP_PREFIX as Gc, malformedOrphanRecordsRefusalMessage as Gi, unsupportedFinalSnapshotError as Gn, errorCauseChain as Go, producerRegionsFromState as Gr, WorkGraph as Gs, isReplacementOrphan as Gt, deleteBudgetKey as H, withoutSilentDropProperties as Ha, ssmResolvedValueType as Hc, malformedLocalOutputsWarning as Hi, effectiveDeletionPolicy as Hn, recordLogOnlyValue as Ho, IntrinsicFunctionResolver as Hr, AssetPublisher as Hs, recordAfterRollbackUpdate as Ht, perType as I, unreadableOrphanRecords as Ia, resolveSkipPrefix as Ic, hasReadableResources as Ii, extractDeploymentEventError as In, createUnionSecretMasker as Io, isTerminationProtectionPropagationError as Ir, importableOutputKeys as Is, replayRollback as It, waitForIndexesSettled as J, isStatefulRecreateTargetForReplace as Ja, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Jc, malformedOrphansRefusalMessage as Ji, findDestructiveChanges as Jn, markSameGenerationBag as Jo, assertFlagRoleArn as Jr, loadPublishableAssetManifest as Js, recheckFailedPlan as Jt, INDEX_SETTLE_POLL_INTERVAL_MS as K, shownType as Ka, findLargeInlineResources as Kc, malformedOrphanRecordsWarning as Ki, maskingRetryLogger as Kn, maskSecretsInError as Ko, regionLessSecretName as Kr, buildAssetRedirectMap as Ks, planFailedOps as Kt, readProtection as L, unreadableResourceEntries as La, resolveStateBucketWithDefault as Lc, isReadableOrphanRecord as Li, ATOMIC_FINAL_SNAPSHOT_TYPES as Ln, hasMaskableValues as Lo, observeThenDisableInstanceApiTermination as Lr, importableOutputs as Ls, awaitInFlightSibling as Lt, recordedProtectionEvidence as M, repairMalformedResourceEntriesForReadOnly as Ma, loadCdkJson as Mc, deployRefusesOrphanRowsReason as Mi, secretNamePrintingBag as Mn, readsNoEchoSource as Mo, isWaitAbandonedError as Mr, exportNamesCarriedFrom as Ms, loadJournaledOrphans as Mt, recordedProtectionNote as N, repairMalformedResourcePropertiesForReadOnly as Na, resolveApp as Nc, displayLogicalId as Ni, secretNamedRecordNeedles as Nn, valueAtCoordinate as No, markWaitAbandoned as Nr, hasReadableExportSet as Ns, makeForeignHolderScan as Nt, noEchoAttributeNamesOf as O, refuseMalformedState as Oa, Synthesizer as Oc, STATE_RESOURCES_MALFORMED as Oi, completedReplayEntries as On, noEchoLeavesOf as Oo, deleteIndeterminateGuards as Or, isNotImplemented as Os, deleteJournaledOrphans as Ot, PROTECTION_PROPERTY_BY_TYPE as P, repairMalformedResourcesForReadOnly as Pa, resolveAutoAssetStorage as Pc, hasReadableOrphans as Pi, stateSecretNameNeedles as Pn, liveMatchesUnresolvedTokenFrame as Po, disableInstanceApiTermination as Pr, hasReasonlessBaselineRefusal as Ps, sameJournaledOrphans as Pt, isTruthyCfnBoolean as Q, coerceWarmThroughput as Qa, canonicalizeRegion as Qc, malformedRenderedContainersWarning as Qi, ledgerForStack as Qn, dynamicReferenceTokens as Qo, sendableAssumeRoleCommand as Qr, assertAssetBucketRegion as Qs, seedsDeleteFirstGuard as Qt, DynamoDBGlobalTableProvider as R, withheldAccountClause as Ra, resolveStateBucketWithDefaultAndSource as Rc, isReadableResourceEntry as Ri, PRE_DELETE_SNAPSHOT_TYPES as Rn, literalSplitDelimitersOf as Ro, reDisableInstanceApiTermination as Rr, isReadableBag as Rs, destroyStackRecordsView as Rt, keptForReadoption as S, refuseMalformedResourcePropertiesForDrift as Sa, runDockerStreaming as Sc, parseWebACLArn as Si, collectDeclaredOutputNames as Sn, isMarkedCoordinate as So, applyCustomResourceResponseExpiration as Sr, rebuildClientForBucketRegion as Ss, revertNestedChildFromJournal as St, findServiceTokenRefusals as T, refuseMalformedResourcesForDeploy as Ta, stripControlChars as Tc, passedParameterClassesOf as Ti, bindingSkippedOutputs as Tn, maskWholeValue as To, slowCcOperationTimeoutMs as Tr, applyCrossPrefixScan as Ts, collectNestedChildUnaddressed as Tt, resolveDynamoDbDeleteBudgetClock as U, NO_CC_HANDLERS_REASON as Ua, CFN_TEMPLATE_BODY_LIMIT as Uc, malformedLocalResourceEntriesWarning as Ui, isFinalSnapshotError as Un, shareLogOnlyValues as Uo, poisonRenderedSpellingsCollidingIn as Ur, isSensitiveAttributeName as Us, demoteSupersededOrphans as Ut, compensateRemovedDeletionProtection as V, unwrittenCreateOnlyReplacement as Va, warnDeprecatedNoPrefixCliFlag as Vc, malformedExportSourceWarning as Vi, createPreDeleteFinalSnapshot as Vn, recordLogOnlyParameterValue as Vo, INTRINSIC_KEYS as Vr, shouldRetainResource as Vs, removeProtectionTypeList as Vt, resolveDynamoDbDeleteBudgetMs as W, hasNoCloudControlHandlers as Wa, CFN_TEMPLATE_URL_LIMIT as Wc, malformedLocalResourcesWarning as Wi, refusesFinalSnapshot as Wn, createSecretMasker as Wo, classifyReplaySecretRegion as Wr, stringifyValue as Ws, isJournaledOrphan as Wt, S3_AUTO_DELETE_OBJECTS_TAG as X, renderStatefulReason as Xa, expectedOwnerParam as Xc, malformedOutputsRefusalMessage as Xi, RollbackInlinePolicyWriters as Xn, scrubResourceRecord as Xo, explicitRoleArnOrThrow as Xr, AssetModeResolver as Xs, replacementNeverSwapped as Xt, ECR_AUTO_DELETE_IMAGES_TAG as Y, isStatefulRecreateTargetSync as Ya, decodeListingKey as Yc, malformedOrphansWarning as Yi, formatDestructiveChange as Yn, redactSecretsForState as Yo, assertSendableRoleArn as Yr, rewriteTemplateAssetReferences as Ys, recordUnderIdIsNotOwn as Yt, hasCdkAutoDeleteTag as Z, WARM_THROUGHPUT_MEMBERS as Za, PARTITION_TABLE as Zc, malformedOutputsWarning as Zi, earliestDefined as Zn, DYNAMIC_REFERENCE_TOKEN_SCAN as Zo, isIamRoleArn as Zr, BOOTSTRAP_MARKER_PREFIX as Zs, resolveReplacementOldType as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedResourceEntriesForDestroy as _a, isMalformedEnvKey as _c, keepsSecretReferenceToken as _i, carriedExportAliasExposure as _n, lambdaFunctionNameForMask as _o, readsNoEchoDeleteValues as _r, WHOLE_DYNAMIC_REFERENCE_PATTERN as _s, displacedPhysicalIdShown as _t, findNestedTemplateTreeDefect as a, refuseDivergentRecordRegionForDestroy as aa, validateContainerRepoName as ac, s3BucketDomainName as ai, hasPlainPrototype$1 as al, redactedDeleteAddressFields as an, configIntegerRefusal as ao, readTagList as ar, carriesSecretMask as as, gray as at, lookupEachName as b, refuseMalformedResourceEntriesForOrphan as ba, redactedDockerCause as bc, isStalePlaceholderArnAttribute as bi, isWholeDynamicReferenceValue as bn, TemplateParser as bo, withPrintingSecrets as br, isLockInfoExpired as bs, nestedChildStackName as bt, renderNestedTemplateTreeDefect as c, refuseMalformedOrphanRecordsForDestroy as ca, resolveDockerContextDirectory as cc, s3BucketWebsiteUrl as ci, absoluteAssemblyPathEscape as cl, updatePartialReason as cn, replayWarn as co, tagPlanWarning as cr, recordMaskOnlyValuesIn as cs, yellow as ct, conditionInputsFrom as d, refuseMalformedOrphansForOrphan as da, describeDockerFailure as dc, parameterTypeMayLoseSecretIdentity as di, renderAssemblyPathEscape as dl, WITHHELD_NAME_DISPLAY as dn, requireConfigString as do, CC_BROKEN_REASON as dr, recordProvenPublicExpression as ds, reachableDivergentParameters as dt, malformedResourcePropertiesWarning as ea, getBootstrapMarkerKey as ec, applyCallerIdentityCredentials as ei, AssemblyReader as el, findNestedStackTypeChanges as en, toCfnInteger as eo, withCreateTokenLedger as er, pathCrossesDottedKey as es, markRefusedBeforeApplying as et, parentSuppliedValues as f, refuseMalformedOutputs as fa, dockerSpawnEnvWithSensitive as fc, getAccountInfo as fi, resolveAssemblyPath as fl, displayTextOrWithheld as fn, prefetchCreateOnlyPropertyPaths as fo, ProviderRegistry as fr, wholeStringLeavesOf as fs, resourcesNamingDeclaredParameter as ft, mergeNoChangeOutputs as g, refuseMalformedResourceEntriesForDeploy as ga, isDockerClientEnvKey as gc, isNamelessDynamicReferenceError as gi, secretSafeKeyDisplay as gn, canonicalLambdaFunctionName as go, TemplateNoEchoReresolver as gr, TEMPLATE_SOURCED_RULES as gs, displacedOpClause as gt, keptWholeReasonText as h, refuseMalformedResourceEntries as ha, getDockerCmd as hc, carriesFetchableDynamicReference as hi, secretBearingStateKeyWarning as hn, withRetry as ho, wouldReturnToSdkProvider as hr, STATE_SOURCED_READBACK_RULES as hs, NESTED_PENDING_PARENT_REASON as ht, childTemplateLoader as i, previewableOrphanRecords as ia, validateAssetBucketName as ic, s3BucketArn as ii, hasOwnKey as il, isRedactedRecordedValue as in, configBooleanRefusal as io, planTagDiff as ir, recoverMaskedOutput as is, cyan as it, noEchoParameterNamesOf as j, repairMalformedOutputsForReadOnly as ja, getLegacyStateBucketName as jc, accountArgs as ji, orphanRecordsPrintingBag as jn, readbackPathFor as jo, withIndeterminateGuard as jr, describeRegionValueKind as js, journaledOrphanLines as jt, noEchoComparisonForTemplate as k, repairMalformedOrphanRecordsForReadOnly as ka, synthesisStatusMessage as kc, UNREADABLE_ORPHANS_CONTAINER_ROW as ki, journaledOrphanPrintingBag as kn, noEchoOutputsComparison as ko, deleteLeftInPlace as kr, splitImportedOps as ks, dropFailedHint as kt, templateIdentity as l, refuseMalformedOrphans as la, describeDockerCapturedOutput as lc, coerceParameterTypedValue as li, describeFileReadFailure as ll, DeploymentEventsReader as ln, requireConfigArray as lo, definedAttributes as lr, recordNoEchoAttributeValues as ls, computeParameterTaint as lt, isSecretBearingReferenceString as m, refuseMalformedResourceAttributesForOrphan as ma, formatDockerLoginError as mc, carriesDynamicReference as mi, resolveBucketRegion as ml, secretBearing as mn, describeTypeWithThrottleRetry as mo, isCustomResource as mr, STATE_SOURCED_CROSS_GENERATION_RULES as ms, planOrphanAdoption as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedScrubResourceEntriesRefusalMessage as na, parseBootstrapMarker as nc, envCredentialsAreAssumedRole as ni, processStackMessages as nl, inheritProducerRegions as nn, coerceCfnBoolean as no, DBPROXY_TAGS_WHAT as nr, inheritNestedStackParameterAssociations as ns, createReadOnlyAttributeHealerFactory as nt, isAbsoluteAssetPath as o, refuseMalformedNestedChildOutputs as oa, buildDenyExternalAccessPolicy as oc, s3BucketDualStackDomainName as oi, nullPrototypeRecord as ol, redactedDeleteAddressSkip as on, configStringRefusal as oo, refuseMalformedDesiredTags as or, provenPublicValue as os, green as ot, readRecordedConditionVerdicts as p, refuseMalformedOutputsForDestroy as pa, finchSecretArgvRefusal as pc, isImpossibleEmptyStoredAttribute as pi, clearBucketRegionCache as pl, exportAliasCollisionScrubWarning as pn, templateResourceTypes as po, ccBrokenReason as pr, STATE_SOURCED_BASELINE_RULES as ps, makeSiblingClaimReader as pt, deleteTableWithIndexBusyRetry as q, MULTI_REGION_RECREATE_BLOCKED_TYPES as qa, uploadCfnTemplate as qc, malformedOrphanRowsKeptWarning as qi, constructPathOf as qn, maskSecretsInText as qo, applyRoleArnIfSet as qr, createAssetRedirectResolver as qs, planRollback as qt, computeImplicitDeleteEdges as r, malformedStateRefusalMessage as ra, readBootstrapMarkerBody as rc, isSettledInstanceState as ri, defineOwnKey as rl, REDACTED_DELETE_ADDRESS_SKIP_REASON as rn, coerceCfnInteger as ro, DBPROXY_TAG_OPTIONS as rr, recordNestedStackParameterExpressions as rs, bold as rt, listNestedTemplateRows as s, refuseMalformedOrphanRecords as sa, buildDockerImage as sc, s3BucketRegionalDomainName as si, ownValue as sl, updatePartialMessage as sn, readConfigString as so, tagMapAsList as sr, recordMaskOnlyValue as ss, red as st, DeployEngine as t, malformedResourcesWarning as ta, isCrossRegionRedirect as tc, callerEnvCredentials as ti, StageLoadError as tl, getCurrentProducerRegions as tn, toFiniteNumber as to, acquireIdempotencyToken as tr, identityKeyFor as ts, formatResourceLine as tt, conditionFingerprint as u, refuseMalformedOrphansForDestroy as ua, describeDockerExecFailure as uc, isUnboundTemplateParameter as ui, displayAssemblyPath as ul, DeploymentEventsStore as un, requireConfigObject as uo, stringifyIfAssigned as ur, recordNoEchoParameterFreshValue as us, namesAnyDeclaredParameter as ut, chunks as v, refuseMalformedResourceEntriesForImport as va, partitionSensitiveEnv as vc, AWS_NO_VALUE as vi, exportNameNoEchoParameters as vn, sameLambdaFunctionAddress as vo, isCustomResourceType as vr, isSingleDynamicReferenceToken as vs, dropSettledNestedJournals as vt, deferredServiceTokenWarning as w, refuseMalformedResourcePropertiesForOrphan as wa, escapeRegExp$3 as wc, parameterInputsFor as wi, isExportAliasCollision as wn, maskReadbackAtCoordinates as wo, CloudControlProvider as wr, CrossPrefixScanCache as ws, withNestedRevertRun as wt, withApiLimit as x, refuseMalformedResourcePropertiesForDestroy as xa, runDockerForeground as xc, refStateLookupFromResource as xi, noEchoParameterValueSeed as xn, canonicalCoordinates as xo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as xr, S3StateBackend as xs, recordDisplacedSkips as xt, isAccessDeniedError as y, refuseMalformedResourceEntriesForImportSave as ya, redactDockerArgvValues as yc, cfnRefValueFromPhysicalId as yi, exportNameSecretExposure as yn, DagBuilder as yo, getCurrentResourceSecrets as yr, LockManager as ys, getNestedRevertRun as yt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as z, findActionableSilentDrops as za, resolveUseCdkBootstrapAssets as zc, malformedDriftResourcePropertiesWarning as zi, buildFinalSnapshotIdentifier as zn, logOnlyValueCount as zo, reEnableInstanceApiTermination as zr, orphansAfterRollback as zs, getStackRecords as zt };
|
|
43378
|
+
//# sourceMappingURL=deploy-engine-dvf1UDuo.js.map
|