@go-to-k/cdkd 0.278.45 → 0.278.47
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/README.md +22 -0
- package/dist/{asg-provider-QfA3xnx8.js → asg-provider-CLULpXoZ.js} +2 -2
- package/dist/{asg-provider-QfA3xnx8.js.map → asg-provider-CLULpXoZ.js.map} +1 -1
- package/dist/cli.js +123 -21
- package/dist/cli.js.map +1 -1
- package/dist/{deploy-engine-BmTgBkZO.js → deploy-engine-B8i-yWiB.js} +8 -5
- package/dist/deploy-engine-B8i-yWiB.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-BmTgBkZO.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $ as DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-
|
|
2
|
+
import { $ as DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-B8i-yWiB.js";
|
|
3
3
|
import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
|
|
4
|
-
import { t as ASGProvider } from "./asg-provider-
|
|
4
|
+
import { t as ASGProvider } from "./asg-provider-CLULpXoZ.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";
|
|
@@ -12529,14 +12529,19 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
12529
12529
|
* with the exact `aws dynamodb delete-table --table-name <id>` recovery
|
|
12530
12530
|
* command.
|
|
12531
12531
|
*/
|
|
12532
|
-
async create(logicalId, resourceType, properties) {
|
|
12532
|
+
async create(logicalId, resourceType, properties, context) {
|
|
12533
12533
|
this.logger.debug(`Creating DynamoDB GlobalTable ${logicalId}`);
|
|
12534
12534
|
const tableName = properties["TableName"] || generateResourceName(logicalId, { maxLength: 255 });
|
|
12535
12535
|
const keySchema = properties["KeySchema"];
|
|
12536
12536
|
const attributeDefinitions = properties["AttributeDefinitions"];
|
|
12537
12537
|
if (!keySchema) throw new ProvisioningError(`KeySchema is required for DynamoDB GlobalTable ${logicalId}`, resourceType, logicalId);
|
|
12538
12538
|
if (!attributeDefinitions) throw new ProvisioningError(`AttributeDefinitions is required for DynamoDB GlobalTable ${logicalId}`, resourceType, logicalId);
|
|
12539
|
-
|
|
12539
|
+
let billingMode;
|
|
12540
|
+
try {
|
|
12541
|
+
billingMode = requireConfigString(properties["BillingMode"], "PAY_PER_REQUEST", "AWS::DynamoDB::GlobalTable BillingMode", replayWarn(this.logger, context));
|
|
12542
|
+
} catch (error) {
|
|
12543
|
+
throw new ProvisioningError(error instanceof Error ? error.message : String(error), resourceType, logicalId, void 0, error instanceof Error ? error : void 0);
|
|
12544
|
+
}
|
|
12540
12545
|
const currentRegion = await this.dynamoDBClient.config.region() ?? "";
|
|
12541
12546
|
const replicas = properties["Replicas"] ?? [];
|
|
12542
12547
|
const createParams = {
|
|
@@ -12778,7 +12783,12 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
12778
12783
|
};
|
|
12779
12784
|
if (tableArn) await this.applyTagDiff(tableArn, extractLocalTags(previousProperties), extractLocalTags(properties));
|
|
12780
12785
|
const oldBilling = previousProperties["BillingMode"] ?? "PAY_PER_REQUEST";
|
|
12781
|
-
|
|
12786
|
+
let billingUnusable = false;
|
|
12787
|
+
const requestedBilling = requireConfigString(properties["BillingMode"], "PAY_PER_REQUEST", "AWS::DynamoDB::GlobalTable BillingMode", { onUnusable: (message) => {
|
|
12788
|
+
billingUnusable = true;
|
|
12789
|
+
this.logger.warn(`${message} The table's current billing mode (${oldBilling}) is kept for this update rather than flipped to the default.`);
|
|
12790
|
+
} });
|
|
12791
|
+
const newBilling = billingUnusable ? oldBilling : requestedBilling;
|
|
12782
12792
|
const onDemandCeilingLive = oldBilling === "PAY_PER_REQUEST" && newBilling === "PAY_PER_REQUEST";
|
|
12783
12793
|
const diagnostics = [];
|
|
12784
12794
|
const desiredCeilings = collectTableOnDemandCeilings(properties, currentRegion, diagnostics);
|
|
@@ -30442,8 +30452,8 @@ var Route53Provider = class {
|
|
|
30442
30452
|
Id: physicalId,
|
|
30443
30453
|
Comment: comment
|
|
30444
30454
|
}));
|
|
30445
|
-
await this.applyHostedZoneTags(physicalId, properties, logicalId);
|
|
30446
|
-
await this.applyQueryLoggingConfig(physicalId, properties, logicalId);
|
|
30455
|
+
await this.applyHostedZoneTags(physicalId, properties, logicalId, previousProperties);
|
|
30456
|
+
await this.applyQueryLoggingConfig(physicalId, properties, logicalId, previousProperties);
|
|
30447
30457
|
await this.syncVPCAssociations(physicalId, properties, logicalId);
|
|
30448
30458
|
const prevEnabled = previousProperties["HostedZoneFeatures"]?.["AcceleratedRecoveryStatus"] === "ENABLED";
|
|
30449
30459
|
const nextEnabled = properties["HostedZoneFeatures"]?.["AcceleratedRecoveryStatus"] === "ENABLED";
|
|
@@ -30462,6 +30472,7 @@ var Route53Provider = class {
|
|
|
30462
30472
|
}
|
|
30463
30473
|
};
|
|
30464
30474
|
} catch (error) {
|
|
30475
|
+
if (error instanceof CdkdError) throw error;
|
|
30465
30476
|
const cause = error instanceof Error ? error : void 0;
|
|
30466
30477
|
throw new ProvisioningError(`Failed to update hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
30467
30478
|
}
|
|
@@ -30786,34 +30797,95 @@ var Route53Provider = class {
|
|
|
30786
30797
|
/**
|
|
30787
30798
|
* Apply tags to a hosted zone using ChangeTagsForResource.
|
|
30788
30799
|
* CFn property: HostedZoneTags (array of {Key, Value}).
|
|
30789
|
-
|
|
30790
|
-
|
|
30791
|
-
|
|
30792
|
-
|
|
30800
|
+
*
|
|
30801
|
+
* `previousProperties` is passed on the UPDATE path only, and turns this
|
|
30802
|
+
* from an add-only apply into a real DIFF (issue #1160). Without it a tag
|
|
30803
|
+
* removed from the template stayed on the zone forever — the add-only shape
|
|
30804
|
+
* has no way to express a removal, and the `length === 0` early return made
|
|
30805
|
+
* clearing ALL tags a silent no-op. `ChangeTagsForResource` takes
|
|
30806
|
+
* `RemoveTagKeys` alongside `AddTags` in ONE call, and CloudFormation does
|
|
30807
|
+
* untag a removed tag (live A/B, 2026-08-10), so the previous-minus-desired
|
|
30808
|
+
* key set is sent as removals. Create keeps passing `undefined` — there is
|
|
30809
|
+
* nothing to remove from a zone that did not exist a moment ago.
|
|
30810
|
+
*/
|
|
30811
|
+
async applyHostedZoneTags(zoneId, properties, logicalId, previousProperties) {
|
|
30812
|
+
const desiredRaw = properties["HostedZoneTags"];
|
|
30813
|
+
if (desiredRaw != null && !Array.isArray(desiredRaw)) {
|
|
30814
|
+
this.logger.warn(`AWS::Route53::HostedZone HostedZoneTags must be an array on ${logicalId}; ignoring it and leaving the live tags untouched (no tag is added or removed)`);
|
|
30815
|
+
return;
|
|
30816
|
+
}
|
|
30817
|
+
const tags = this.readHostedZoneTags(properties);
|
|
30818
|
+
if (Array.isArray(desiredRaw) && tags.length !== desiredRaw.length) {
|
|
30819
|
+
this.logger.warn(`AWS::Route53::HostedZone HostedZoneTags on ${logicalId} carries ${desiredRaw.length - tags.length} entr(y|ies) with a non-string Key or Value (check for an unresolved intrinsic); leaving the live tags untouched rather than applying a partial set or removing the tags those entries name`);
|
|
30820
|
+
return;
|
|
30821
|
+
}
|
|
30822
|
+
const previousTags = previousProperties ? this.readHostedZoneTags(previousProperties) : void 0;
|
|
30823
|
+
const desiredKeys = new Set(tags.map((t) => t.Key));
|
|
30824
|
+
const removeTagKeys = [...new Set((previousTags ?? []).map((t) => t.Key).filter((key) => key.length > 0 && !desiredKeys.has(key)))];
|
|
30825
|
+
if (tags.length === 0 && removeTagKeys.length === 0) return;
|
|
30793
30826
|
try {
|
|
30794
30827
|
await this.getClient().send(new ChangeTagsForResourceCommand({
|
|
30795
30828
|
ResourceType: "hostedzone",
|
|
30796
30829
|
ResourceId: zoneId,
|
|
30797
|
-
AddTags: tags.map((t) => ({
|
|
30830
|
+
...tags.length > 0 && { AddTags: tags.map((t) => ({
|
|
30798
30831
|
Key: t.Key,
|
|
30799
30832
|
Value: t.Value
|
|
30800
|
-
}))
|
|
30833
|
+
})) },
|
|
30834
|
+
...removeTagKeys.length > 0 && { RemoveTagKeys: removeTagKeys }
|
|
30801
30835
|
}));
|
|
30802
|
-
this.logger.debug(`Applied ${tags.length} tag(s)
|
|
30836
|
+
this.logger.debug(`Applied ${tags.length} tag(s) and removed ${removeTagKeys.length} tag(s) on hosted zone ${logicalId}`);
|
|
30803
30837
|
} catch (error) {
|
|
30804
|
-
|
|
30838
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
30839
|
+
if (removeTagKeys.length > 0) throw new ProvisioningError(`Failed to remove tag(s) ${removeTagKeys.join(", ")} from hosted zone ${logicalId}: ${detail}. The removal will NOT be retried on the next deploy (state no longer records the tag), so it is reported instead of ignored.`, "AWS::Route53::HostedZone", logicalId, zoneId, error instanceof Error ? error : void 0);
|
|
30840
|
+
this.logger.warn(`Failed to apply tags to hosted zone ${logicalId}: ${detail}`);
|
|
30805
30841
|
}
|
|
30806
30842
|
}
|
|
30807
30843
|
/**
|
|
30844
|
+
* Read `HostedZoneTags` off a property bag, dropping entries whose shape an
|
|
30845
|
+
* unresolved intrinsic or a hand-authored L1 made unusable. Returns a
|
|
30846
|
+
* possibly-SHORTER list rather than throwing — the caller compares the length
|
|
30847
|
+
* against the raw input to decide whether the read was lossy, and only the
|
|
30848
|
+
* DESIRED side treats a lossy read as a refusal. The previous (state-borne)
|
|
30849
|
+
* side stays permissive: a record an older binary wrote must not block an
|
|
30850
|
+
* ordinary update, which a rollback replay could not then edit its way out of.
|
|
30851
|
+
*
|
|
30852
|
+
* `Value` is validated as well as `Key`. Route 53 rejects a tag whose value
|
|
30853
|
+
* is absent or non-string, and because Add and Remove ride the SAME
|
|
30854
|
+
* `ChangeTagsForResource` call, one bad value would fail the whole request —
|
|
30855
|
+
* silently taking the REMOVALS down with it.
|
|
30856
|
+
*/
|
|
30857
|
+
readHostedZoneTags(properties) {
|
|
30858
|
+
const tags = properties["HostedZoneTags"];
|
|
30859
|
+
if (!Array.isArray(tags)) return [];
|
|
30860
|
+
return tags.filter((t) => {
|
|
30861
|
+
if (typeof t !== "object" || t === null) return false;
|
|
30862
|
+
const entry = t;
|
|
30863
|
+
return typeof entry.Key === "string" && typeof entry.Value === "string";
|
|
30864
|
+
});
|
|
30865
|
+
}
|
|
30866
|
+
/**
|
|
30808
30867
|
* Apply QueryLoggingConfig to a hosted zone.
|
|
30809
30868
|
* CFn property: QueryLoggingConfig ({ CloudWatchLogsLogGroupArn }).
|
|
30810
30869
|
* Only one query logging config per hosted zone is allowed.
|
|
30811
30870
|
*/
|
|
30812
|
-
async applyQueryLoggingConfig(zoneId, properties, logicalId) {
|
|
30813
|
-
const
|
|
30814
|
-
|
|
30815
|
-
const
|
|
30816
|
-
|
|
30871
|
+
async applyQueryLoggingConfig(zoneId, properties, logicalId, previousProperties) {
|
|
30872
|
+
const cloudWatchLogsLogGroupArn = this.readQueryLogGroupArn(properties);
|
|
30873
|
+
const desiredBlock = properties["QueryLoggingConfig"];
|
|
30874
|
+
const desiredBlockIsObject = typeof desiredBlock === "object" && desiredBlock !== null && !Array.isArray(desiredBlock);
|
|
30875
|
+
const desiredArnPresent = desiredBlockIsObject && desiredBlock["CloudWatchLogsLogGroupArn"] !== void 0;
|
|
30876
|
+
if (cloudWatchLogsLogGroupArn === void 0 && desiredBlock != null && (!desiredBlockIsObject || desiredArnPresent)) {
|
|
30877
|
+
this.logger.warn(`AWS::Route53::HostedZone QueryLoggingConfig on ${logicalId} carries no usable CloudWatchLogsLogGroupArn; leaving the live query logging config untouched (omit the block entirely to delete it)`);
|
|
30878
|
+
return;
|
|
30879
|
+
}
|
|
30880
|
+
if (cloudWatchLogsLogGroupArn === void 0) {
|
|
30881
|
+
if (previousProperties !== void 0 && this.readQueryLogGroupArn(previousProperties)) {
|
|
30882
|
+
this.logger.debug(`QueryLoggingConfig removed from template for hosted zone ${logicalId}; deleting the live config`);
|
|
30883
|
+
await this.deleteQueryLoggingConfigForZone(zoneId, logicalId);
|
|
30884
|
+
const remaining = await this.listQueryLoggingConfigIds(zoneId);
|
|
30885
|
+
if (remaining.length > 0) throw new ProvisioningError(`QueryLoggingConfig was removed from the template for hosted zone ${logicalId} but the live config (${remaining.join(", ")}) is still present. The removal will NOT be retried on the next deploy (state no longer records the property), so it is reported instead of ignored.`, "AWS::Route53::HostedZone", logicalId, zoneId);
|
|
30886
|
+
}
|
|
30887
|
+
return;
|
|
30888
|
+
}
|
|
30817
30889
|
try {
|
|
30818
30890
|
await this.deleteQueryLoggingConfigForZone(zoneId, logicalId);
|
|
30819
30891
|
await this.getClient().send(new CreateQueryLoggingConfigCommand({
|
|
@@ -30830,6 +30902,36 @@ var Route53Provider = class {
|
|
|
30830
30902
|
}
|
|
30831
30903
|
}
|
|
30832
30904
|
/**
|
|
30905
|
+
* Read `QueryLoggingConfig.CloudWatchLogsLogGroupArn` off a property bag,
|
|
30906
|
+
* returning `undefined` for an absent block, a malformed container, or a
|
|
30907
|
+
* blank / non-string ARN. One helper so the DESIRED and PREVIOUS sides
|
|
30908
|
+
* cannot classify the same shape differently — an asymmetry there would
|
|
30909
|
+
* make a removal fire (or not) depending on which side was malformed.
|
|
30910
|
+
*/
|
|
30911
|
+
readQueryLogGroupArn(properties) {
|
|
30912
|
+
const config = properties["QueryLoggingConfig"];
|
|
30913
|
+
if (typeof config !== "object" || config === null || Array.isArray(config)) return void 0;
|
|
30914
|
+
const arn = config["CloudWatchLogsLogGroupArn"];
|
|
30915
|
+
return typeof arn === "string" && arn.length > 0 ? arn : void 0;
|
|
30916
|
+
}
|
|
30917
|
+
/**
|
|
30918
|
+
* List the live query-logging config ids for a hosted zone.
|
|
30919
|
+
*
|
|
30920
|
+
* Used by the REMOVAL path to VERIFY the delete landed, because
|
|
30921
|
+
* `deleteQueryLoggingConfigForZone` deliberately swallows its failures and a
|
|
30922
|
+
* swallowed removal is permanent (see the call site). A zone that has gone
|
|
30923
|
+
* away counts as "no config", so the NotFound shapes resolve to `[]` rather
|
|
30924
|
+
* than failing the deploy on a resource that is already absent.
|
|
30925
|
+
*/
|
|
30926
|
+
async listQueryLoggingConfigIds(zoneId) {
|
|
30927
|
+
try {
|
|
30928
|
+
return ((await this.getClient().send(new ListQueryLoggingConfigsCommand({ HostedZoneId: zoneId }))).QueryLoggingConfigs ?? []).map((config) => config.Id).filter((id) => typeof id === "string");
|
|
30929
|
+
} catch (error) {
|
|
30930
|
+
if (error instanceof Error && (error.name === "NoSuchHostedZone" || error.name === "NoSuchQueryLoggingConfig")) return [];
|
|
30931
|
+
throw error;
|
|
30932
|
+
}
|
|
30933
|
+
}
|
|
30934
|
+
/**
|
|
30833
30935
|
* Delete query logging config(s) for a hosted zone.
|
|
30834
30936
|
*/
|
|
30835
30937
|
async deleteQueryLoggingConfigForZone(zoneId, logicalId) {
|
|
@@ -67462,7 +67564,7 @@ function createMigrateCommand() {
|
|
|
67462
67564
|
*/
|
|
67463
67565
|
function buildProgram() {
|
|
67464
67566
|
const program = new Command();
|
|
67465
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.
|
|
67567
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.47");
|
|
67466
67568
|
program.hook("preAction", (_thisCommand, actionCommand) => {
|
|
67467
67569
|
const { profile } = actionCommand.optsWithGlobals();
|
|
67468
67570
|
if (profile !== void 0) process.env["AWS_PROFILE"] = profile;
|