@go-to-k/cdkd 0.284.11 → 0.284.13
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-C9OlqHee.js → asg-provider-H-Dl8qng.js} +2 -2
- package/dist/{asg-provider-C9OlqHee.js.map → asg-provider-H-Dl8qng.js.map} +1 -1
- package/dist/cli.js +231 -45
- package/dist/cli.js.map +1 -1
- package/dist/{deploy-engine-K5kHzsB-.js → deploy-engine-4Eh5Qqlm.js} +328 -35
- package/dist/deploy-engine-4Eh5Qqlm.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-K5kHzsB-.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $ as
|
|
2
|
+
import { $ as isTerminationProtectionPropagationError, $n as ResourceUpdateNotSupportedError, $t as validateAssetBucketName, A as renderStatefulReason, An as derivePartitionAndUrlSuffix, At as INTRINSIC_KEYS, B as exportAliasCollisionScrubWarning, Bn as CdkdError, Bt as stringifyValue, C as isFinalSnapshotError, Cn as CFN_TEMPLATE_URL_LIMIT, Ct as s3BucketArn, D as extractDeploymentEventError, Dn as expectedOwnerParam, Dt as s3BucketWebsiteUrl, E as makeCanonicalizePropertiesFn, En as uploadCfnTemplate, Et as s3BucketRegionalDomainName, F as green, Fn as AwsClients, Ft as LockManager, G as collectInlinePolicyNamesManagedBySiblings, Gn as LocalMigrateError, Gt as rewriteTemplateAssetReferences, H as secretBearingStateKeyWarning, Ht as buildAssetRedirectMap, I as red, In as getAwsClients, It as S3StateBackend, J as findActionableSilentDrops, Jn as MissingCdkCliError, Jt as AssetModeResolver, K as clearOnUpdateRemoval, Kn as LocalStartServiceError, Kt as escapeRegExp, L as yellow, Ln as resetAwsClients, Lt as rebuildClientForBucketRegion, M as bold, Mn as processStackMessages, Mt as withRetry, N as cyan, Nt as DagBuilder, O as MULTI_REGION_RECREATE_BLOCKED_TYPES, On as PARTITION_TABLE, Ot as applyRoleArnIfSet, P as gray, Pn as resolveBucketRegion, Pt as TemplateParser, Q as disableInstanceApiTermination, Qn as ResourceTimeoutError, Qt as parseBootstrapMarker, R as collectDeclaredOutputNames, Rn as setAwsClients, Rt as shouldRetainResource, S as createPreDeleteFinalSnapshot, Sn as CFN_TEMPLATE_BODY_LIMIT, St as scrubResourceRecord, T as unsupportedFinalSnapshotError, Tn as findLargeInlineResources, Tt as s3BucketDualStackDomainName, U as stateKeySecretExposure, Un as DeployCancelledError, Ut as createAssetRedirectResolver, V as isExportAliasCollision, Vt as WorkGraph, W as IAMRoleProvider, Wn as LocalInvokeBuildError$1, Wt as loadPublishableAssetManifest, X as CloudControlProvider, Xn as PartialFailureError, Xt as ensureAssetStorage, Y as findSilentDropProperties, Yn as NestedStackChildDirectDestroyError, Yt as BOOTSTRAP_MARKER_PREFIX, Z as slowCcOperationTimeoutMs, Zn as ProvisioningError, Zt as getBootstrapMarkerKey, _ as computeImplicitDeleteEdges, _n as resolveStateBucketWithDefault, _t as STATE_SOURCED_READBACK_RULES, a as DeploymentEventsStore, an as runDockerForeground, at as normalizeAwsTagsToCfn, b as buildFinalSnapshotIdentifier, bn as stateBucketExistenceConfirmed, bt as maskSecretsInText, c as replayFailedOperations, cn as getDockerImageBySourceHash, cr as isMarkedNonRetryable, ct as coerceCfnBoolean, d as updatePartialReason, dn as getDefaultStateBucketName, dr as markNonRetryable, dt as readConfigString, en as validateContainerRepoName, er as StackHasActiveImportsError, et as IntrinsicFunctionResolver, f as UNSPECIFIED_SKIP_REASON, fn as getLegacyStateBucketName, ft as replayWarn, g as IMPLICIT_DELETE_DEPENDENCIES, gn as resolveSkipPrefix, gt as STATE_SOURCED_CROSS_GENERATION_RULES, h as maskingRetryLogger, hn as resolveCaptureObservedState, ht as requireConfigString, i as DeploymentEventsReader, in as getDockerCmd, it as WAFv2WebACLProvider, j as formatResourceLine, jn as AssemblyReader, jt as describeTypeWithThrottleRetry, k as isStatefulRecreateTargetSync, kn as canonicalizeRegion, kt as DiffCalculator, l as replayRollback, ln as Synthesizer, lr as isRetryableTransientError, lt as configBooleanRefusal, m as withResourceDeadline, mn as resolveAutoAssetStorage, mt as requireConfigObject, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as buildDockerImage, nt as getAccountInfo, o as planFailedOps, on as runDockerStreaming, or as normalizeAwsError, ot as resolveExplicitPhysicalId, p as deleteSkipReason, pn as resolveApp, pt as requireConfigArray, q as ProviderRegistry, qt as stripControlChars, r as DeployEngine, rn as formatDockerLoginError, rt as refStateLookupFromResource, s as planRollback, sn as AssetManifestLoader, sr as withErrorHandling, st as assertRegionMatch, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as buildDenyExternalAccessPolicy, tr as StackTerminationProtectionError, tt as cfnRefValueFromPhysicalId, u as updatePartialMessage, un as synthesisStatusMessage, ur as isThrottlingError, ut as configStringRefusal, v as ATOMIC_FINAL_SNAPSHOT_TYPES, vn as resolveStateBucketWithDefaultAndSource, vt as TEMPLATE_SOURCED_RULES, w as refusesFinalSnapshot, wn as MIGRATE_TMP_PREFIX, wt as s3BucketDomainName, x as ccRoutedFinalSnapshotError, xn as warnDeprecatedNoPrefixCliFlag, xt as redactSecretsForState, y as PRE_DELETE_SNAPSHOT_TYPES, yn as resolveUseCdkBootstrapAssets, yt as createSecretMasker, z as collectPublishedOutputNames, zt as AssetPublisher } from "./deploy-engine-4Eh5Qqlm.js";
|
|
3
3
|
import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, h as withStackName, i as runStackBuffered, m as withSkipPrefix, n as getLogger, o as PATTERN_B_NAME_OPTIONS, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-zRrlbaQt.js";
|
|
4
|
-
import { t as ASGProvider } from "./asg-provider-
|
|
4
|
+
import { t as ASGProvider } from "./asg-provider-H-Dl8qng.js";
|
|
5
5
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
6
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
7
7
|
import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -33995,6 +33995,44 @@ var ECSProvider = class {
|
|
|
33995
33995
|
}
|
|
33996
33996
|
};
|
|
33997
33997
|
|
|
33998
|
+
//#endregion
|
|
33999
|
+
//#region src/provisioning/masked-retry-logger.ts
|
|
34000
|
+
/**
|
|
34001
|
+
* The masker a caller supplied, or the identity function when it supplied
|
|
34002
|
+
* none.
|
|
34003
|
+
*
|
|
34004
|
+
* ABSENT MEANS UNMASKED, and that is the back-compatible default the contract
|
|
34005
|
+
* mandates — `create()` / `update()` are also reached from the import path,
|
|
34006
|
+
* from `cdkd drift --revert`, and from tests, and a provider must not care
|
|
34007
|
+
* which caller it got. Centralised here so no call site re-spells the `??`
|
|
34008
|
+
* and accidentally makes the capability required.
|
|
34009
|
+
*/
|
|
34010
|
+
function maskerOrIdentity(maskSecrets) {
|
|
34011
|
+
return maskSecrets ?? ((text) => text);
|
|
34012
|
+
}
|
|
34013
|
+
/**
|
|
34014
|
+
* A {@link RetryLogger} whose every line is routed through `maskSecrets`.
|
|
34015
|
+
*
|
|
34016
|
+
* `warn` is ALWAYS provided, never omitted. It is optional on `RetryLogger`,
|
|
34017
|
+
* and dropping it would silence the give-up summary on the calling path only —
|
|
34018
|
+
* trading a disclosure for the reporting hole issue #2018 closed. It goes
|
|
34019
|
+
* through the SAME mask as `debug` precisely because it is the line that
|
|
34020
|
+
* survives a run without `--verbose`; forwarding it unmasked would defeat the
|
|
34021
|
+
* fence at a HIGHER log level than the one the fence was written for.
|
|
34022
|
+
*
|
|
34023
|
+
* `logger` is typed structurally rather than as the concrete `Logger` so this
|
|
34024
|
+
* module stays a leaf and a test can pass two spies. That matches the
|
|
34025
|
+
* precedent already in the tree (`buildMfaConfigRequest` in
|
|
34026
|
+
* `cognito-provider.ts` takes an injected `logger?: { warn }`).
|
|
34027
|
+
*/
|
|
34028
|
+
function createMaskedRetryLogger(logger, maskSecrets) {
|
|
34029
|
+
const mask = maskerOrIdentity(maskSecrets);
|
|
34030
|
+
return {
|
|
34031
|
+
debug: (message) => logger.debug(mask(message)),
|
|
34032
|
+
warn: (message) => logger.warn(mask(message))
|
|
34033
|
+
};
|
|
34034
|
+
}
|
|
34035
|
+
|
|
33998
34036
|
//#endregion
|
|
33999
34037
|
//#region src/provisioning/providers/elbv2-provider.ts
|
|
34000
34038
|
/**
|
|
@@ -34004,6 +34042,41 @@ var ECSProvider = class {
|
|
|
34004
34042
|
*/
|
|
34005
34043
|
const capacityReservationDelays = { sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)) };
|
|
34006
34044
|
/**
|
|
34045
|
+
* Depth cap for {@link maskDeep}. Bounds a self-referential bag rather than
|
|
34046
|
+
* hanging; `JSON.stringify` would throw on one anyway, and a throw is the
|
|
34047
|
+
* better failure of the two.
|
|
34048
|
+
*/
|
|
34049
|
+
const MASK_WALK_MAX_DEPTH$1 = 8;
|
|
34050
|
+
/**
|
|
34051
|
+
* Mask every string LEAF and KEY of an arbitrary value, returning a structure
|
|
34052
|
+
* safe to `JSON.stringify` into a log line (issue #2050).
|
|
34053
|
+
*
|
|
34054
|
+
* The ordering is the whole point. `maskSecretsInText` matches by literal
|
|
34055
|
+
* occurrence, and `JSON.stringify` escapes `"`, `\` and newlines — so a Secrets
|
|
34056
|
+
* Manager JSON document (the commonest real secret shape) does not occur in the
|
|
34057
|
+
* stringified text and survives a mask applied afterwards. Masking the leaves
|
|
34058
|
+
* first also hands the masker each RAW value, which reaches
|
|
34059
|
+
* `maskSecretsInText`'s whole-value arm at any length instead of only the
|
|
34060
|
+
* substring arm's 4-character floor. See the "three gaps" note in
|
|
34061
|
+
* `src/deployment/secret-redaction.ts`.
|
|
34062
|
+
*
|
|
34063
|
+
* Keys are masked as well as values: `JSON.stringify` renders them into the
|
|
34064
|
+
* same line, so a resolved secret used as a map key would otherwise escape.
|
|
34065
|
+
*
|
|
34066
|
+
* `cognito-provider.ts` carries an equivalent private walk for its own
|
|
34067
|
+
* stringified warnings. Two copies is the current cost of keeping this a leaf;
|
|
34068
|
+
* a THIRD site is the point at which this should move into
|
|
34069
|
+
* `../masked-retry-logger.ts` (already the shared provider-side masking module)
|
|
34070
|
+
* and all three converge on it.
|
|
34071
|
+
*/
|
|
34072
|
+
function maskDeep(value, mask, depth = 0) {
|
|
34073
|
+
if (typeof value === "string") return mask(value);
|
|
34074
|
+
if (depth >= MASK_WALK_MAX_DEPTH$1) return value;
|
|
34075
|
+
if (Array.isArray(value)) return value.map((entry) => maskDeep(entry, mask, depth + 1));
|
|
34076
|
+
if (value !== null && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([k, v]) => [mask(k), maskDeep(v, mask, depth + 1)]));
|
|
34077
|
+
return value;
|
|
34078
|
+
}
|
|
34079
|
+
/**
|
|
34007
34080
|
* Documented AWS defaults for TargetGroup attributes, used to reset a
|
|
34008
34081
|
* removed `TargetGroupAttributes` entry. Unlike ModifyLoadBalancerAttributes
|
|
34009
34082
|
* / ModifyListenerAttributes, ModifyTargetGroupAttributes REJECTS an empty
|
|
@@ -34177,28 +34250,86 @@ var ELBv2Provider = class {
|
|
|
34177
34250
|
if (!this.elbv2Client) this.elbv2Client = new ElasticLoadBalancingV2Client(this.providerRegion ? { region: this.providerRegion } : {});
|
|
34178
34251
|
return this.elbv2Client;
|
|
34179
34252
|
}
|
|
34180
|
-
|
|
34253
|
+
/**
|
|
34254
|
+
* A {@link RetryLogger} for this provider's `withRetry` calls, bound to the
|
|
34255
|
+
* caller's secret masker (issue #2050).
|
|
34256
|
+
*
|
|
34257
|
+
* Thin wrapper over the shared {@link createMaskedRetryLogger} so the two
|
|
34258
|
+
* providers that need it cannot drift apart — see that module for why the
|
|
34259
|
+
* factory is shared rather than hand-rolled per file, and for the full
|
|
34260
|
+
* rationale on why `warn` is threaded rather than omitted.
|
|
34261
|
+
*
|
|
34262
|
+
* WHY NOT A `maskSecrets` OPTION ON `withRetry` (issue #2050 acceptance
|
|
34263
|
+
* item 3): `RetryLogger` is a structural type any caller can already satisfy
|
|
34264
|
+
* with a masking object — `drift.ts`'s revert has done exactly that since
|
|
34265
|
+
* issue #1914 — so the option would be a SECOND spelling of one intent
|
|
34266
|
+
* across ~50 existing call sites, and two spellings is how a later author
|
|
34267
|
+
* reaches for the unmasked one.
|
|
34268
|
+
*/
|
|
34269
|
+
maskedRetryLogger(maskSecrets) {
|
|
34270
|
+
return createMaskedRetryLogger(this.logger, maskSecrets);
|
|
34271
|
+
}
|
|
34272
|
+
/**
|
|
34273
|
+
* Mask a caught AWS error's message before it is interpolated into the
|
|
34274
|
+
* `ProvisioningError` this provider throws (issue #2050, review round 2).
|
|
34275
|
+
*
|
|
34276
|
+
* NOT a duplicate of {@link maskedRetryLogger}, and strictly WIDER than it.
|
|
34277
|
+
* `withRetry` rethrows the RAW error, and `deploy-engine.ts` prints the
|
|
34278
|
+
* resulting message at ERROR — i.e. at DEFAULT verbosity — so a masked
|
|
34279
|
+
* give-up `warn` was being followed one line later by the identical text
|
|
34280
|
+
* unmasked. It is also the ONLY disclosure surface for a NON-RETRYABLE
|
|
34281
|
+
* rejection, where `withRetry` emits nothing at all: its give-up summary is
|
|
34282
|
+
* gated on `propagationRetries > 0 || serverErrorRetries > 0`, and a
|
|
34283
|
+
* validation error that fails on attempt 0 satisfies neither.
|
|
34284
|
+
*
|
|
34285
|
+
* Masks `error.message` rather than the assembled sentence ON PURPOSE. The
|
|
34286
|
+
* two are NOT equivalent: handing the masker the raw message can reach
|
|
34287
|
+
* `maskSecretsInText`'s WHOLE-VALUE arm, which matches at ANY length, while
|
|
34288
|
+
* a longer assembled sentence can only ever reach the SUBSTRING arm, which
|
|
34289
|
+
* ignores needles below 4 characters. See `SecretMaskingContext` in
|
|
34290
|
+
* `src/types/resource.ts`.
|
|
34291
|
+
*
|
|
34292
|
+
* The `cause` chain is deliberately left UNMASKED and unwrapped by every
|
|
34293
|
+
* caller of this helper: `isRetryableTransientError` walks `cause` for
|
|
34294
|
+
* `$metadata.httpStatusCode`, and rewriting or dropping it would silently
|
|
34295
|
+
* change retry classification. Only the human-readable message is rewritten.
|
|
34296
|
+
*/
|
|
34297
|
+
maskErrorMessage(error, maskSecrets) {
|
|
34298
|
+
return maskerOrIdentity(maskSecrets)(error instanceof Error ? error.message : String(error));
|
|
34299
|
+
}
|
|
34300
|
+
/**
|
|
34301
|
+
* `context` is read for ONE thing today: `maskSecrets` (issue #2050). The
|
|
34302
|
+
* Listener create path runs a post-create `ModifyListenerAttributes` through
|
|
34303
|
+
* `withRetry`, whose per-attempt `debug` line and give-up `warn` summary
|
|
34304
|
+
* interpolate the AWS message verbatim — and that payload is built from
|
|
34305
|
+
* RESOLVED template properties. See {@link maskedRetryLogger}.
|
|
34306
|
+
*/
|
|
34307
|
+
async create(logicalId, resourceType, properties, context) {
|
|
34181
34308
|
switch (resourceType) {
|
|
34182
34309
|
case "AWS::ElasticLoadBalancingV2::LoadBalancer": return this.createLoadBalancer(logicalId, resourceType, properties);
|
|
34183
|
-
case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.createTargetGroup(logicalId, resourceType, properties);
|
|
34184
|
-
case "AWS::ElasticLoadBalancingV2::Listener": return this.createListener(logicalId, resourceType, properties);
|
|
34310
|
+
case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.createTargetGroup(logicalId, resourceType, properties, context?.maskSecrets);
|
|
34311
|
+
case "AWS::ElasticLoadBalancingV2::Listener": return this.createListener(logicalId, resourceType, properties, context?.maskSecrets);
|
|
34185
34312
|
default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
|
|
34186
34313
|
}
|
|
34187
34314
|
}
|
|
34188
|
-
|
|
34315
|
+
/**
|
|
34316
|
+
* `context` is read for ONE thing today: `maskSecrets` (issue #2050) — the
|
|
34317
|
+
* update-path twin of the `create()` note above.
|
|
34318
|
+
*/
|
|
34319
|
+
async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
34189
34320
|
try {
|
|
34190
|
-
return await this.applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
34321
|
+
return await this.applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties, context);
|
|
34191
34322
|
} catch (error) {
|
|
34192
34323
|
if (error instanceof CdkdError) throw error;
|
|
34193
34324
|
const cause = error instanceof Error ? error : void 0;
|
|
34194
34325
|
throw new ProvisioningError(`Failed to update ELBv2 resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
34195
34326
|
}
|
|
34196
34327
|
}
|
|
34197
|
-
async applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
34328
|
+
async applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
34198
34329
|
switch (resourceType) {
|
|
34199
34330
|
case "AWS::ElasticLoadBalancingV2::LoadBalancer": return this.updateLoadBalancer(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
34200
|
-
case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
34201
|
-
case "AWS::ElasticLoadBalancingV2::Listener": return this.updateListener(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
34331
|
+
case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
|
|
34332
|
+
case "AWS::ElasticLoadBalancingV2::Listener": return this.updateListener(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
|
|
34202
34333
|
default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId, physicalId);
|
|
34203
34334
|
}
|
|
34204
34335
|
}
|
|
@@ -34443,7 +34574,7 @@ var ELBv2Provider = class {
|
|
|
34443
34574
|
throw new ProvisioningError(`Failed to delete LoadBalancer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
34444
34575
|
}
|
|
34445
34576
|
}
|
|
34446
|
-
async createTargetGroup(logicalId, resourceType, properties) {
|
|
34577
|
+
async createTargetGroup(logicalId, resourceType, properties, maskSecrets) {
|
|
34447
34578
|
this.logger.debug(`Creating TargetGroup ${logicalId}`);
|
|
34448
34579
|
try {
|
|
34449
34580
|
const tags = this.extractTags(properties);
|
|
@@ -34481,7 +34612,7 @@ var ELBv2Provider = class {
|
|
|
34481
34612
|
}));
|
|
34482
34613
|
this.logger.debug(`Applied ${tgAttributes.length} TargetGroup attribute(s) for ${logicalId}`);
|
|
34483
34614
|
}
|
|
34484
|
-
const targets = this.convertTargets(properties["Targets"]);
|
|
34615
|
+
const targets = this.convertTargets(properties["Targets"], void 0, maskSecrets);
|
|
34485
34616
|
if (targets.length > 0) {
|
|
34486
34617
|
await this.getClient().send(new RegisterTargetsCommand({
|
|
34487
34618
|
TargetGroupArn: tgArn,
|
|
@@ -34494,7 +34625,7 @@ var ELBv2Provider = class {
|
|
|
34494
34625
|
await this.getClient().send(new DeleteTargetGroupCommand({ TargetGroupArn: tgArn }));
|
|
34495
34626
|
this.logger.debug(`Cleaned up partially-created TargetGroup ${logicalId} (${tgArn}) after wiring failure`);
|
|
34496
34627
|
} catch (cleanupError) {
|
|
34497
|
-
this.logger.warn(`Failed to clean up partially-created TargetGroup ${logicalId} (${tgArn}): ${
|
|
34628
|
+
this.logger.warn(`Failed to clean up partially-created TargetGroup ${logicalId} (${tgArn}): ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws elbv2 delete-target-group --target-group-arn ${tgArn}`);
|
|
34498
34629
|
}
|
|
34499
34630
|
throw innerError;
|
|
34500
34631
|
}
|
|
@@ -34508,10 +34639,10 @@ var ELBv2Provider = class {
|
|
|
34508
34639
|
};
|
|
34509
34640
|
} catch (error) {
|
|
34510
34641
|
const cause = error instanceof Error ? error : void 0;
|
|
34511
|
-
throw new ProvisioningError(`Failed to create TargetGroup ${logicalId}: ${
|
|
34642
|
+
throw new ProvisioningError(`Failed to create TargetGroup ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
|
|
34512
34643
|
}
|
|
34513
34644
|
}
|
|
34514
|
-
async updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
34645
|
+
async updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
|
|
34515
34646
|
this.logger.debug(`Updating TargetGroup ${logicalId}: ${physicalId}`);
|
|
34516
34647
|
const immutableChanged = (key, coerce) => {
|
|
34517
34648
|
const next = properties[key];
|
|
@@ -34539,7 +34670,7 @@ var ELBv2Provider = class {
|
|
|
34539
34670
|
const tgAttrDiff = this.diffAttributes(this.normalizeAttributes(properties["TargetGroupAttributes"]), this.normalizeAttributes(previousProperties["TargetGroupAttributes"]), (key, currentValue) => {
|
|
34540
34671
|
const fallback = Object.hasOwn(TARGET_GROUP_ATTRIBUTE_DEFAULTS, key) ? TARGET_GROUP_ATTRIBUTE_DEFAULTS[key] : void 0;
|
|
34541
34672
|
if (fallback === void 0) {
|
|
34542
|
-
this.logger.warn(`TargetGroup attribute ${key} was removed from the template but has no documented default cdkd can reset it to — the live value is retained. Set the attribute explicitly to change it.`);
|
|
34673
|
+
this.logger.warn(`TargetGroup attribute ${maskerOrIdentity(maskSecrets)(key)} was removed from the template but has no documented default cdkd can reset it to — the live value is retained. Set the attribute explicitly to change it.`);
|
|
34543
34674
|
return;
|
|
34544
34675
|
}
|
|
34545
34676
|
return currentValue === fallback ? void 0 : fallback;
|
|
@@ -34551,8 +34682,8 @@ var ELBv2Provider = class {
|
|
|
34551
34682
|
}));
|
|
34552
34683
|
this.logger.debug(`Applied ${tgAttrDiff.length} TargetGroupAttributes change(s) for ${logicalId}`);
|
|
34553
34684
|
}
|
|
34554
|
-
const newTargets = this.convertTargets(properties["Targets"], properties["Port"]);
|
|
34555
|
-
const oldTargets = this.convertTargets(previousProperties["Targets"], properties["Port"]);
|
|
34685
|
+
const newTargets = this.convertTargets(properties["Targets"], properties["Port"], maskSecrets);
|
|
34686
|
+
const oldTargets = this.convertTargets(previousProperties["Targets"], properties["Port"], maskSecrets);
|
|
34556
34687
|
const targetKey = (t) => JSON.stringify([
|
|
34557
34688
|
t.Id,
|
|
34558
34689
|
t.Port ?? null,
|
|
@@ -34590,7 +34721,7 @@ var ELBv2Provider = class {
|
|
|
34590
34721
|
};
|
|
34591
34722
|
} catch (error) {
|
|
34592
34723
|
const cause = error instanceof Error ? error : void 0;
|
|
34593
|
-
throw new ProvisioningError(`Failed to update TargetGroup ${logicalId}: ${
|
|
34724
|
+
throw new ProvisioningError(`Failed to update TargetGroup ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
|
|
34594
34725
|
}
|
|
34595
34726
|
}
|
|
34596
34727
|
async deleteTargetGroup(logicalId, physicalId, resourceType, context) {
|
|
@@ -34608,7 +34739,7 @@ var ELBv2Provider = class {
|
|
|
34608
34739
|
throw new ProvisioningError(`Failed to delete TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
34609
34740
|
}
|
|
34610
34741
|
}
|
|
34611
|
-
async createListener(logicalId, resourceType, properties) {
|
|
34742
|
+
async createListener(logicalId, resourceType, properties, maskSecrets) {
|
|
34612
34743
|
this.logger.debug(`Creating Listener ${logicalId}`);
|
|
34613
34744
|
try {
|
|
34614
34745
|
const tags = this.extractTags(properties);
|
|
@@ -34636,7 +34767,7 @@ var ELBv2Provider = class {
|
|
|
34636
34767
|
await withRetry(() => this.getClient().send(new ModifyListenerAttributesCommand({
|
|
34637
34768
|
ListenerArn: listenerArn,
|
|
34638
34769
|
Attributes: listenerAttributes
|
|
34639
|
-
})), logicalId, { logger: this.
|
|
34770
|
+
})), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
|
|
34640
34771
|
this.logger.debug(`Applied ${listenerAttributes.length} ListenerAttribute(s) for ${logicalId}`);
|
|
34641
34772
|
}
|
|
34642
34773
|
} catch (innerError) {
|
|
@@ -34644,7 +34775,7 @@ var ELBv2Provider = class {
|
|
|
34644
34775
|
await this.getClient().send(new DeleteListenerCommand({ ListenerArn: listenerArn }));
|
|
34645
34776
|
this.logger.debug(`Cleaned up partially-created Listener ${logicalId} (${listenerArn}) after attributes-wiring failure`);
|
|
34646
34777
|
} catch (cleanupError) {
|
|
34647
|
-
this.logger.warn(`Failed to clean up partially-created Listener ${logicalId} (${listenerArn}): ${
|
|
34778
|
+
this.logger.warn(`Failed to clean up partially-created Listener ${logicalId} (${listenerArn}): ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws elbv2 delete-listener --listener-arn ${listenerArn}`);
|
|
34648
34779
|
}
|
|
34649
34780
|
throw innerError;
|
|
34650
34781
|
}
|
|
@@ -34654,10 +34785,10 @@ var ELBv2Provider = class {
|
|
|
34654
34785
|
};
|
|
34655
34786
|
} catch (error) {
|
|
34656
34787
|
const cause = error instanceof Error ? error : void 0;
|
|
34657
|
-
throw new ProvisioningError(`Failed to create Listener ${logicalId}: ${
|
|
34788
|
+
throw new ProvisioningError(`Failed to create Listener ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
|
|
34658
34789
|
}
|
|
34659
34790
|
}
|
|
34660
|
-
async updateListener(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
34791
|
+
async updateListener(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
|
|
34661
34792
|
this.logger.debug(`Updating Listener ${logicalId}: ${physicalId}`);
|
|
34662
34793
|
try {
|
|
34663
34794
|
const defaultActions = this.convertActions(properties["DefaultActions"]);
|
|
@@ -34679,7 +34810,7 @@ var ELBv2Provider = class {
|
|
|
34679
34810
|
await withRetry(() => this.getClient().send(new ModifyListenerAttributesCommand({
|
|
34680
34811
|
ListenerArn: physicalId,
|
|
34681
34812
|
Attributes: submittedAttrs
|
|
34682
|
-
})), logicalId, { logger: this.
|
|
34813
|
+
})), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
|
|
34683
34814
|
this.logger.debug(`Applied ${submittedAttrs.length} ListenerAttributes change(s) for ${logicalId}`);
|
|
34684
34815
|
}
|
|
34685
34816
|
await this.applyTagDiff(physicalId, previousProperties["Tags"], properties["Tags"]);
|
|
@@ -34691,7 +34822,7 @@ var ELBv2Provider = class {
|
|
|
34691
34822
|
};
|
|
34692
34823
|
} catch (error) {
|
|
34693
34824
|
const cause = error instanceof Error ? error : void 0;
|
|
34694
|
-
throw new ProvisioningError(`Failed to update Listener ${logicalId}: ${
|
|
34825
|
+
throw new ProvisioningError(`Failed to update Listener ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
|
|
34695
34826
|
}
|
|
34696
34827
|
}
|
|
34697
34828
|
async deleteListener(logicalId, physicalId, resourceType, context) {
|
|
@@ -34844,13 +34975,29 @@ var ELBv2Provider = class {
|
|
|
34844
34975
|
* Absent for a `lambda` target group (no port), where both sides stay
|
|
34845
34976
|
* undefined and therefore still key identically.
|
|
34846
34977
|
*/
|
|
34847
|
-
|
|
34978
|
+
/**
|
|
34979
|
+
* `maskSecrets` (issue #2050) exists for the drop-warning below, which
|
|
34980
|
+
* stringifies a whole REJECTED `Targets` element at DEFAULT verbosity. That
|
|
34981
|
+
* element came out of the resolved `properties` bag, so a
|
|
34982
|
+
* `{{resolve:secretsmanager:...}}` scalar anywhere inside it — an `Id` built
|
|
34983
|
+
* by `Fn::Sub` from a secret, say — is already plaintext by the time this
|
|
34984
|
+
* runs.
|
|
34985
|
+
*
|
|
34986
|
+
* OPTIONAL, but all three call sites supply it today (`createTargetGroup` and
|
|
34987
|
+
* both `updateTargetGroup` sides). It stays optional because that is the
|
|
34988
|
+
* `SecretMaskingContext` contract — absent means unmasked — not because some
|
|
34989
|
+
* caller is known to omit it. An earlier revision of this comment claimed it
|
|
34990
|
+
* protected "the `readCurrentState` / diff callers that have no masker";
|
|
34991
|
+
* there are no such callers, and describing a defence by a consumer that does
|
|
34992
|
+
* not exist is how the next author concludes the parameter is dead.
|
|
34993
|
+
*/
|
|
34994
|
+
convertTargets(raw, groupPort, maskSecrets) {
|
|
34848
34995
|
const defaultPort = groupPort === void 0 || groupPort === null || Number.isNaN(Number(groupPort)) ? void 0 : Number(groupPort);
|
|
34849
34996
|
if (!Array.isArray(raw)) return [];
|
|
34850
34997
|
const out = [];
|
|
34851
34998
|
for (const entry of raw) {
|
|
34852
34999
|
if (entry === null || typeof entry !== "object" || typeof entry.Id !== "string" || entry.Id.length === 0) {
|
|
34853
|
-
this.logger.warn(`Dropping malformed TargetGroup Targets entry (missing string Id): ${JSON.stringify(entry)}`);
|
|
35000
|
+
this.logger.warn(`Dropping malformed TargetGroup Targets entry (missing string Id): ${JSON.stringify(maskDeep(entry, maskerOrIdentity(maskSecrets)))}`);
|
|
34854
35001
|
continue;
|
|
34855
35002
|
}
|
|
34856
35003
|
const e = entry;
|
|
@@ -41238,21 +41385,63 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41238
41385
|
if (!this.stsClient) this.stsClient = new STSClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
41239
41386
|
return this.stsClient;
|
|
41240
41387
|
}
|
|
41241
|
-
|
|
41388
|
+
/**
|
|
41389
|
+
* A {@link RetryLogger} for this provider's `withRetry` calls, bound to the
|
|
41390
|
+
* caller's secret masker (issue #2050).
|
|
41391
|
+
*
|
|
41392
|
+
* Thin wrapper over the shared {@link createMaskedRetryLogger} — see that
|
|
41393
|
+
* module for why the factory is shared with `elbv2-provider.ts` rather than
|
|
41394
|
+
* hand-rolled per file, and for why `warn` is threaded rather than omitted.
|
|
41395
|
+
*
|
|
41396
|
+
* NOT applied to `deleteNamespace`'s retry: that one sends a
|
|
41397
|
+
* `DeleteNamespaceCommand` carrying a physical id only, and `delete()` has no
|
|
41398
|
+
* `maskSecrets` to thread anyway (`DeleteContext` deliberately carries none).
|
|
41399
|
+
*/
|
|
41400
|
+
maskedRetryLogger(maskSecrets) {
|
|
41401
|
+
return createMaskedRetryLogger(this.logger, maskSecrets);
|
|
41402
|
+
}
|
|
41403
|
+
/**
|
|
41404
|
+
* Mask a caught AWS error's message before it is interpolated into the
|
|
41405
|
+
* `ProvisioningError` this provider throws (issue #2050, review round 2).
|
|
41406
|
+
*
|
|
41407
|
+
* The twin of `ELBv2Provider.maskErrorMessage` — see that method for the full
|
|
41408
|
+
* rationale. In short: `withRetry` rethrows the RAW error and the deploy
|
|
41409
|
+
* engine prints the resulting message at ERROR (DEFAULT verbosity), so this
|
|
41410
|
+
* is a wider disclosure surface than the retry logger, and the ONLY one for a
|
|
41411
|
+
* NON-RETRYABLE rejection, where `withRetry` emits nothing at all.
|
|
41412
|
+
*
|
|
41413
|
+
* Masks `error.message` rather than the assembled sentence so the masker can
|
|
41414
|
+
* reach `maskSecretsInText`'s WHOLE-VALUE arm (any length) instead of only
|
|
41415
|
+
* the SUBSTRING arm (needles of 4+ characters). The `cause` chain is left
|
|
41416
|
+
* untouched so `isRetryableTransientError`'s `$metadata` walk is unaffected.
|
|
41417
|
+
*/
|
|
41418
|
+
maskErrorMessage(error, maskSecrets) {
|
|
41419
|
+
return maskerOrIdentity(maskSecrets)(error instanceof Error ? error.message : String(error));
|
|
41420
|
+
}
|
|
41421
|
+
/**
|
|
41422
|
+
* `context` is read for ONE thing today: `maskSecrets` (issue #2050). The
|
|
41423
|
+
* Service create path runs a post-create `UpdateServiceAttributes` through
|
|
41424
|
+
* `withRetry` — see {@link maskedRetryLogger}.
|
|
41425
|
+
*/
|
|
41426
|
+
async create(logicalId, resourceType, properties, context) {
|
|
41242
41427
|
switch (resourceType) {
|
|
41243
41428
|
case "AWS::ServiceDiscovery::PrivateDnsNamespace": return this.createNamespace(logicalId, resourceType, properties);
|
|
41244
41429
|
case "AWS::ServiceDiscovery::HttpNamespace": return this.createHttpNamespace(logicalId, resourceType, properties);
|
|
41245
41430
|
case "AWS::ServiceDiscovery::PublicDnsNamespace": return this.createPublicDnsNamespace(logicalId, resourceType, properties);
|
|
41246
|
-
case "AWS::ServiceDiscovery::Service": return this.createService(logicalId, resourceType, properties);
|
|
41431
|
+
case "AWS::ServiceDiscovery::Service": return this.createService(logicalId, resourceType, properties, context?.maskSecrets);
|
|
41247
41432
|
default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
|
|
41248
41433
|
}
|
|
41249
41434
|
}
|
|
41250
|
-
|
|
41435
|
+
/**
|
|
41436
|
+
* `context` is read for ONE thing today: `maskSecrets` (issue #2050) — the
|
|
41437
|
+
* update-path twin of the `create()` note above.
|
|
41438
|
+
*/
|
|
41439
|
+
update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
41251
41440
|
switch (resourceType) {
|
|
41252
41441
|
case "AWS::ServiceDiscovery::PrivateDnsNamespace": return this.updateNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
41253
41442
|
case "AWS::ServiceDiscovery::HttpNamespace": return this.updateHttpNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
41254
41443
|
case "AWS::ServiceDiscovery::PublicDnsNamespace": return this.updatePublicDnsNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
41255
|
-
case "AWS::ServiceDiscovery::Service": return this.updateService(logicalId, physicalId, resourceType, properties, previousProperties);
|
|
41444
|
+
case "AWS::ServiceDiscovery::Service": return this.updateService(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
|
|
41256
41445
|
default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId, physicalId);
|
|
41257
41446
|
}
|
|
41258
41447
|
}
|
|
@@ -41540,7 +41729,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41540
41729
|
throw new ProvisioningError(`Failed to update public DNS namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
41541
41730
|
}
|
|
41542
41731
|
}
|
|
41543
|
-
async createService(logicalId, resourceType, properties) {
|
|
41732
|
+
async createService(logicalId, resourceType, properties, maskSecrets) {
|
|
41544
41733
|
this.logger.debug(`Creating service discovery service ${logicalId}`);
|
|
41545
41734
|
const client = this.getClient();
|
|
41546
41735
|
const name = properties["Name"];
|
|
@@ -41572,7 +41761,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41572
41761
|
await withRetry(() => client.send(new UpdateServiceAttributesCommand({
|
|
41573
41762
|
ServiceId: serviceId,
|
|
41574
41763
|
Attributes: attrs
|
|
41575
|
-
})), logicalId, { logger: this.
|
|
41764
|
+
})), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
|
|
41576
41765
|
this.logger.debug(`Applied ${Object.keys(attrs).length} ServiceAttribute(s) for ${logicalId}`);
|
|
41577
41766
|
}
|
|
41578
41767
|
} catch (innerError) {
|
|
@@ -41580,7 +41769,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41580
41769
|
await client.send(new DeleteServiceCommand$1({ Id: serviceId }));
|
|
41581
41770
|
this.logger.debug(`Cleaned up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure`);
|
|
41582
41771
|
} catch (cleanupError) {
|
|
41583
|
-
this.logger.warn(`Failed to clean up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure: ${
|
|
41772
|
+
this.logger.warn(`Failed to clean up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure: ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws servicediscovery delete-service --id ${serviceId}`);
|
|
41584
41773
|
}
|
|
41585
41774
|
throw innerError;
|
|
41586
41775
|
}
|
|
@@ -41594,7 +41783,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41594
41783
|
};
|
|
41595
41784
|
} catch (error) {
|
|
41596
41785
|
const cause = error instanceof Error ? error : void 0;
|
|
41597
|
-
throw new ProvisioningError(`Failed to create service discovery service ${logicalId}: ${
|
|
41786
|
+
throw new ProvisioningError(`Failed to create service discovery service ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
|
|
41598
41787
|
}
|
|
41599
41788
|
}
|
|
41600
41789
|
/**
|
|
@@ -41614,7 +41803,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41614
41803
|
* full AWS-current snapshot as `properties`, so the round-trip is
|
|
41615
41804
|
* value-preserving.
|
|
41616
41805
|
*/
|
|
41617
|
-
async updateService(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
41806
|
+
async updateService(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
|
|
41618
41807
|
this.logger.debug(`Updating service discovery service ${logicalId}: ${physicalId}`);
|
|
41619
41808
|
const client = this.getClient();
|
|
41620
41809
|
const serviceChange = {};
|
|
@@ -41649,14 +41838,14 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41649
41838
|
await withRetry(() => client.send(new UpdateServiceAttributesCommand({
|
|
41650
41839
|
ServiceId: physicalId,
|
|
41651
41840
|
Attributes: upsertAttrs
|
|
41652
|
-
})), logicalId, { logger: this.
|
|
41841
|
+
})), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
|
|
41653
41842
|
this.logger.debug(`Applied ${Object.keys(upsertAttrs).length} ServiceAttribute change(s) for ${logicalId}`);
|
|
41654
41843
|
}
|
|
41655
41844
|
if (hasAttrRemove) {
|
|
41656
41845
|
await withRetry(() => client.send(new DeleteServiceAttributesCommand({
|
|
41657
41846
|
ServiceId: physicalId,
|
|
41658
41847
|
Attributes: removedAttrKeys
|
|
41659
|
-
})), logicalId, { logger: this.
|
|
41848
|
+
})), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
|
|
41660
41849
|
this.logger.debug(`Removed ${removedAttrKeys.length} ServiceAttribute(s) for ${logicalId}`);
|
|
41661
41850
|
}
|
|
41662
41851
|
this.logger.debug(`Successfully updated service discovery service ${logicalId}`);
|
|
@@ -41667,7 +41856,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
41667
41856
|
} catch (error) {
|
|
41668
41857
|
if (error instanceof ProvisioningError) throw error;
|
|
41669
41858
|
const cause = error instanceof Error ? error : void 0;
|
|
41670
|
-
throw new ProvisioningError(`Failed to update service discovery service ${logicalId}: ${
|
|
41859
|
+
throw new ProvisioningError(`Failed to update service discovery service ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
|
|
41671
41860
|
}
|
|
41672
41861
|
}
|
|
41673
41862
|
async deleteService(logicalId, physicalId, resourceType, context) {
|
|
@@ -63483,10 +63672,7 @@ async function runRevert(reports, providerRegistry, stateBackend, stateConfig, a
|
|
|
63483
63672
|
const updateResult = await withRetry(() => provider.update(outcome.logicalId, stateResource.physicalId, outcome.resourceType, newProperties, outcome.awsProperties, {
|
|
63484
63673
|
desiredFromAwsReadback: true,
|
|
63485
63674
|
maskSecrets: createSecretMasker(secrets)
|
|
63486
|
-
}), outcome.logicalId, { logger:
|
|
63487
|
-
debug: (msg) => logger.debug(maskSecretsInText(msg, secrets)),
|
|
63488
|
-
warn: (msg) => logger.warn(maskSecretsInText(msg, secrets))
|
|
63489
|
-
} });
|
|
63675
|
+
}), outcome.logicalId, { logger: maskingRetryLogger(logger, secrets) });
|
|
63490
63676
|
totalSucceeded++;
|
|
63491
63677
|
const revertPartial = updatePartialReason(updateResult);
|
|
63492
63678
|
if (revertPartial !== void 0) logger.warn(` ✓ ${report.stackName}/${outcome.logicalId} (${outcome.resourceType}): reverted, ${maskSecretsInText(updatePartialMessage(revertPartial), secrets)}`);
|
|
@@ -82712,7 +82898,7 @@ function createMigrateCommand() {
|
|
|
82712
82898
|
*/
|
|
82713
82899
|
function buildProgram() {
|
|
82714
82900
|
const program = new Command();
|
|
82715
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.
|
|
82901
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.13");
|
|
82716
82902
|
program.hook("preAction", (_thisCommand, actionCommand) => {
|
|
82717
82903
|
const { profile } = actionCommand.optsWithGlobals();
|
|
82718
82904
|
if (profile !== void 0) process.env["AWS_PROFILE"] = profile;
|