@go-to-k/cdkd 0.275.4 → 0.275.6
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 +15 -0
- package/dist/{asg-provider-BxpwCQGo.js → asg-provider-zDD6EIRo.js} +2 -2
- package/dist/{asg-provider-BxpwCQGo.js.map → asg-provider-zDD6EIRo.js.map} +1 -1
- package/dist/cli.js +115 -36
- package/dist/cli.js.map +1 -1
- package/dist/{deploy-engine-CHL0hb1m.js → deploy-engine-D5j6_ZH6.js} +200 -10
- package/dist/deploy-engine-D5j6_ZH6.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-CHL0hb1m.js.map +0 -1
|
@@ -7,7 +7,7 @@ import { SQSClient } from "@aws-sdk/client-sqs";
|
|
|
7
7
|
import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
|
|
8
8
|
import { GetFunctionCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
|
|
9
9
|
import { AssumeRoleCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
|
|
10
|
-
import { DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSubnetsCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
|
|
10
|
+
import { CreateSnapshotCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
|
|
11
11
|
import { DescribeTableCommand, DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
12
12
|
import { CloudFormationClient, CreateChangeSetCommand, DeleteStackCommand, DescribeChangeSetCommand, DescribeTypeCommand, GetTemplateCommand, waitUntilChangeSetCreateComplete } from "@aws-sdk/client-cloudformation";
|
|
13
13
|
import { APIGatewayClient, GetRestApiCommand } from "@aws-sdk/client-api-gateway";
|
|
@@ -12038,9 +12038,10 @@ var CloudControlProvider = class {
|
|
|
12038
12038
|
*/
|
|
12039
12039
|
async delete(logicalId, physicalId, resourceType, _properties, context) {
|
|
12040
12040
|
this.logger.debug(`Deleting resource ${logicalId} (${resourceType}), physical ID: ${physicalId}`);
|
|
12041
|
+
if (context?.finalSnapshotIdentifier !== void 0) throw new ProvisioningError(`${logicalId} (${resourceType}) requires a final snapshot (DeletionPolicy: Snapshot), but the Cloud Control API delete route has no final-snapshot parameter. Re-run with --skip-final-snapshot after snapshotting manually, or retain the resource.`, resourceType, logicalId, physicalId);
|
|
12041
12042
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
12042
12043
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
12043
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
12044
|
+
const { ASGProvider } = await import("./asg-provider-zDD6EIRo.js").then((n) => n.n);
|
|
12044
12045
|
await new ASGProvider().delete(logicalId, physicalId, resourceType, _properties, context);
|
|
12045
12046
|
return;
|
|
12046
12047
|
}
|
|
@@ -15101,7 +15102,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
15101
15102
|
["DBClusterParameterGroupName", "not yet implemented by cdkd"],
|
|
15102
15103
|
["DBInstanceParameterGroupName", "not yet implemented by cdkd"],
|
|
15103
15104
|
["DBSystemId", "not yet implemented by cdkd"],
|
|
15104
|
-
["DeleteAutomatedBackups", "
|
|
15105
|
+
["DeleteAutomatedBackups", "delete-time lifecycle flag not threaded through cdkd destroy; final snapshots are governed by DeletionPolicy: Snapshot (issue #1352), which this flag does not control"],
|
|
15105
15106
|
["Domain", "not yet implemented by cdkd"],
|
|
15106
15107
|
["DomainIAMRoleName", "not yet implemented by cdkd"],
|
|
15107
15108
|
["EnableCloudwatchLogsExports", "not yet implemented by cdkd"],
|
|
@@ -15180,7 +15181,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
15180
15181
|
["DBSnapshotIdentifier", "not yet implemented by cdkd"],
|
|
15181
15182
|
["DBSystemId", "not yet implemented by cdkd"],
|
|
15182
15183
|
["DedicatedLogVolume", "not yet implemented by cdkd"],
|
|
15183
|
-
["DeleteAutomatedBackups", "
|
|
15184
|
+
["DeleteAutomatedBackups", "delete-time lifecycle flag not threaded through cdkd destroy; final snapshots are governed by DeletionPolicy: Snapshot (issue #1352), which this flag does not control"],
|
|
15184
15185
|
["Domain", "not yet implemented by cdkd"],
|
|
15185
15186
|
["DomainAuthSecretArn", "not yet implemented by cdkd"],
|
|
15186
15187
|
["DomainDnsIps", "not yet implemented by cdkd"],
|
|
@@ -17030,6 +17031,182 @@ function extractDeploymentEventError(err) {
|
|
|
17030
17031
|
return result;
|
|
17031
17032
|
}
|
|
17032
17033
|
|
|
17034
|
+
//#endregion
|
|
17035
|
+
//#region src/provisioning/final-snapshot.ts
|
|
17036
|
+
/**
|
|
17037
|
+
* `DeletionPolicy: Snapshot` support (issue #1352).
|
|
17038
|
+
*
|
|
17039
|
+
* CloudFormation creates a final snapshot BEFORE deleting a resource whose
|
|
17040
|
+
* `DeletionPolicy` is `Snapshot`. cdkd historically treated the policy as
|
|
17041
|
+
* `Delete` (no snapshot — silent data loss vs CFn, live-A/B-confirmed on
|
|
17042
|
+
* `AWS::EC2::Volume`). The destroy paths now honor the policy through the
|
|
17043
|
+
* two mechanisms below; a Snapshot-tagged type supported by NEITHER is
|
|
17044
|
+
* refused with an actionable error unless `--skip-final-snapshot` opts into
|
|
17045
|
+
* the data loss.
|
|
17046
|
+
*
|
|
17047
|
+
* The full CFn-documented Snapshot-capable type list (CFn refuses the
|
|
17048
|
+
* attribute on anything else): AWS::EC2::Volume, AWS::ElastiCache::CacheCluster,
|
|
17049
|
+
* AWS::ElastiCache::ReplicationGroup, AWS::Neptune::DBCluster,
|
|
17050
|
+
* AWS::RDS::DBCluster, AWS::RDS::DBInstance, AWS::Redshift::Cluster,
|
|
17051
|
+
* AWS::DocDB::DBCluster.
|
|
17052
|
+
*/
|
|
17053
|
+
/**
|
|
17054
|
+
* Types whose delete API takes an atomic final-snapshot parameter. The
|
|
17055
|
+
* destroy paths generate a snapshot identifier and pass it via
|
|
17056
|
+
* `DeleteContext.finalSnapshotIdentifier`; the type's SDK provider flips its
|
|
17057
|
+
* delete call from `SkipFinalSnapshot: true` to the final-snapshot form.
|
|
17058
|
+
*/
|
|
17059
|
+
const ATOMIC_FINAL_SNAPSHOT_TYPES = /* @__PURE__ */ new Set([
|
|
17060
|
+
"AWS::RDS::DBInstance",
|
|
17061
|
+
"AWS::RDS::DBCluster",
|
|
17062
|
+
"AWS::Neptune::DBCluster",
|
|
17063
|
+
"AWS::DocDB::DBCluster",
|
|
17064
|
+
"AWS::ElastiCache::CacheCluster"
|
|
17065
|
+
]);
|
|
17066
|
+
/**
|
|
17067
|
+
* Types with no atomic delete parameter, where cdkd snapshots explicitly
|
|
17068
|
+
* BEFORE the (routing-layer-agnostic) delete. `AWS::EC2::Volume` is
|
|
17069
|
+
* CC-API-routed, so the pre-delete snapshot lives at the destroy call sites,
|
|
17070
|
+
* not in a provider.
|
|
17071
|
+
*/
|
|
17072
|
+
const PRE_DELETE_SNAPSHOT_TYPES = /* @__PURE__ */ new Set(["AWS::EC2::Volume"]);
|
|
17073
|
+
/**
|
|
17074
|
+
* CFn-documented Snapshot-capable types cdkd cannot snapshot yet (issue
|
|
17075
|
+
* #1353): named in the refusal error so users know the policy is valid,
|
|
17076
|
+
* just unimplemented — as opposed to a template mistake.
|
|
17077
|
+
*/
|
|
17078
|
+
const UNSUPPORTED_FINAL_SNAPSHOT_TYPES = /* @__PURE__ */ new Set(["AWS::Redshift::Cluster", "AWS::ElastiCache::ReplicationGroup"]);
|
|
17079
|
+
/**
|
|
17080
|
+
* Build the final-snapshot identifier for an atomic-parameter delete.
|
|
17081
|
+
*
|
|
17082
|
+
* Constraints are the intersection of the RDS / Neptune / DocDB snapshot
|
|
17083
|
+
* identifier rules and the ElastiCache snapshot name rules: start with a
|
|
17084
|
+
* letter, letters/digits/hyphens only, no consecutive or trailing hyphen.
|
|
17085
|
+
* The physical id already satisfies the source API's naming rules; it is
|
|
17086
|
+
* lowercased (RDS canonicalizes to lowercase anyway) and defensively
|
|
17087
|
+
* re-sanitized. A UTC timestamp suffix keeps repeated destroys of a
|
|
17088
|
+
* re-created same-name resource from colliding; within ONE destroy run the
|
|
17089
|
+
* identifier is generated once per resource, so delete retries reuse it.
|
|
17090
|
+
*/
|
|
17091
|
+
function buildFinalSnapshotIdentifier(physicalId, resourceType, now = /* @__PURE__ */ new Date()) {
|
|
17092
|
+
const ts = now.toISOString().replace(/[-:]/g, "").replace(/\..*$/, "").replace("T", "-").toLowerCase();
|
|
17093
|
+
let base = physicalId.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-{2,}/g, "-").replace(/^-+|-+$/g, "");
|
|
17094
|
+
if (!/^[a-z]/.test(base)) base = `r${base}`;
|
|
17095
|
+
const maxLength = resourceType === "AWS::ElastiCache::CacheCluster" ? 50 : 255;
|
|
17096
|
+
const suffix = `-final-${ts}`;
|
|
17097
|
+
base = base.slice(0, maxLength - suffix.length).replace(/-+$/, "");
|
|
17098
|
+
return `${base}${suffix}`;
|
|
17099
|
+
}
|
|
17100
|
+
/** Tag key marking a cdkd-created final snapshot of an EBS volume. */
|
|
17101
|
+
const EBS_FINAL_SNAPSHOT_TAG_KEY = "cdkd:final-snapshot-of";
|
|
17102
|
+
/** Test seam (matches the `describe-type.ts` / macro-expander pattern). */
|
|
17103
|
+
const finalSnapshotDelays = { sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)) };
|
|
17104
|
+
const EBS_SNAPSHOT_POLL_INTERVAL_MS = 5e3;
|
|
17105
|
+
const EBS_SNAPSHOT_TIMEOUT_MS = 3600 * 1e3;
|
|
17106
|
+
function errMsg(error) {
|
|
17107
|
+
return error instanceof Error ? error.message : String(error);
|
|
17108
|
+
}
|
|
17109
|
+
function isVolumeNotFound(error) {
|
|
17110
|
+
return (error instanceof Error ? error.name : "") === "InvalidVolume.NotFound" || errMsg(error).includes("InvalidVolume.NotFound");
|
|
17111
|
+
}
|
|
17112
|
+
/**
|
|
17113
|
+
* Create (or resume waiting on) the final EBS snapshot of a volume and wait
|
|
17114
|
+
* until it completes, mirroring CloudFormation's observable behavior — CFn
|
|
17115
|
+
* deletes the volume only after the final snapshot is done.
|
|
17116
|
+
*
|
|
17117
|
+
* Idempotent across destroy re-runs: an existing pending/completed snapshot
|
|
17118
|
+
* carrying the `cdkd:final-snapshot-of: <volumeId>` tag is reused instead of
|
|
17119
|
+
* creating a second one.
|
|
17120
|
+
*
|
|
17121
|
+
* @returns the snapshot id, or `null` when the volume no longer exists
|
|
17122
|
+
* (nothing to snapshot; the subsequent delete is idempotent too).
|
|
17123
|
+
*/
|
|
17124
|
+
async function createEbsFinalSnapshot(client, volumeId, logicalId, logger) {
|
|
17125
|
+
let snapshotId;
|
|
17126
|
+
try {
|
|
17127
|
+
snapshotId = (await client.send(new DescribeSnapshotsCommand({
|
|
17128
|
+
OwnerIds: ["self"],
|
|
17129
|
+
Filters: [{
|
|
17130
|
+
Name: `tag:${EBS_FINAL_SNAPSHOT_TAG_KEY}`,
|
|
17131
|
+
Values: [volumeId]
|
|
17132
|
+
}, {
|
|
17133
|
+
Name: "status",
|
|
17134
|
+
Values: ["pending", "completed"]
|
|
17135
|
+
}]
|
|
17136
|
+
}))).Snapshots?.[0]?.SnapshotId;
|
|
17137
|
+
if (snapshotId) logger.debug(`Reusing existing final snapshot ${snapshotId} for ${logicalId} (${volumeId}) from a previous destroy attempt`);
|
|
17138
|
+
} catch (probeError) {
|
|
17139
|
+
logger.debug(`Final-snapshot reuse probe failed for ${volumeId}: ${errMsg(probeError)}`);
|
|
17140
|
+
}
|
|
17141
|
+
if (!snapshotId) try {
|
|
17142
|
+
snapshotId = (await client.send(new CreateSnapshotCommand({
|
|
17143
|
+
VolumeId: volumeId,
|
|
17144
|
+
Description: `cdkd final snapshot for ${volumeId} (DeletionPolicy: Snapshot)`,
|
|
17145
|
+
TagSpecifications: [{
|
|
17146
|
+
ResourceType: "snapshot",
|
|
17147
|
+
Tags: [{
|
|
17148
|
+
Key: EBS_FINAL_SNAPSHOT_TAG_KEY,
|
|
17149
|
+
Value: volumeId
|
|
17150
|
+
}]
|
|
17151
|
+
}]
|
|
17152
|
+
}))).SnapshotId;
|
|
17153
|
+
} catch (createError) {
|
|
17154
|
+
if (isVolumeNotFound(createError)) {
|
|
17155
|
+
logger.debug(`Volume ${volumeId} no longer exists — skipping final snapshot for ${logicalId}`);
|
|
17156
|
+
return null;
|
|
17157
|
+
}
|
|
17158
|
+
throw new CdkdError(`Failed to create the final snapshot for ${logicalId} (${volumeId}) required by DeletionPolicy: Snapshot: ${errMsg(createError)}. The volume was NOT deleted.`, "FINAL_SNAPSHOT_FAILED");
|
|
17159
|
+
}
|
|
17160
|
+
if (!snapshotId) throw new CdkdError(`CreateSnapshot for ${logicalId} (${volumeId}) returned no snapshot id. The volume was NOT deleted.`, "FINAL_SNAPSHOT_FAILED");
|
|
17161
|
+
logger.info(`Creating final snapshot ${snapshotId} for ${logicalId} (${volumeId}) — DeletionPolicy: Snapshot`);
|
|
17162
|
+
const deadline = Date.now() + EBS_SNAPSHOT_TIMEOUT_MS;
|
|
17163
|
+
let notFoundPolls = 0;
|
|
17164
|
+
for (;;) {
|
|
17165
|
+
let state;
|
|
17166
|
+
try {
|
|
17167
|
+
state = (await client.send(new DescribeSnapshotsCommand({ SnapshotIds: [snapshotId] }))).Snapshots?.[0]?.State;
|
|
17168
|
+
notFoundPolls = 0;
|
|
17169
|
+
} catch (pollError) {
|
|
17170
|
+
if (((pollError instanceof Error ? pollError.name : "") === "InvalidSnapshot.NotFound" || errMsg(pollError).includes("InvalidSnapshot.NotFound")) && ++notFoundPolls <= 24) state = void 0;
|
|
17171
|
+
else throw new CdkdError(`Failed while waiting for final snapshot ${snapshotId} of ${logicalId} (${volumeId}): ${errMsg(pollError)}. The volume was NOT deleted; re-run the destroy (the snapshot is reused, not duplicated).`, "FINAL_SNAPSHOT_FAILED", pollError instanceof Error ? pollError : void 0);
|
|
17172
|
+
}
|
|
17173
|
+
if (state === "completed") {
|
|
17174
|
+
logger.info(`Final snapshot ${snapshotId} completed for ${logicalId} (${volumeId})`);
|
|
17175
|
+
return snapshotId;
|
|
17176
|
+
}
|
|
17177
|
+
if (state === "error") throw new CdkdError(`Final snapshot ${snapshotId} for ${logicalId} (${volumeId}) entered 'error' state. The volume was NOT deleted.`, "FINAL_SNAPSHOT_FAILED");
|
|
17178
|
+
if (Date.now() >= deadline) throw new CdkdError(`Timed out waiting for final snapshot ${snapshotId} of ${logicalId} (${volumeId}) to complete. The volume was NOT deleted; the snapshot continues in AWS — re-run the destroy once it completes (the existing snapshot is reused, not duplicated).`, "FINAL_SNAPSHOT_TIMEOUT");
|
|
17179
|
+
await finalSnapshotDelays.sleep(EBS_SNAPSHOT_POLL_INTERVAL_MS);
|
|
17180
|
+
}
|
|
17181
|
+
}
|
|
17182
|
+
/**
|
|
17183
|
+
* Is this one of the typed final-snapshot failures the destroy call sites
|
|
17184
|
+
* must RETHROW before applying their "not found = already deleted"
|
|
17185
|
+
* idempotency heuristics? (Those heuristics match message substrings; a raw
|
|
17186
|
+
* snapshot-poll NotFound would otherwise be read as "resource already
|
|
17187
|
+
* deleted" and strand a live, un-snapshotted volume outside state.)
|
|
17188
|
+
*/
|
|
17189
|
+
function isFinalSnapshotError(error) {
|
|
17190
|
+
return error instanceof CdkdError && (error.code === "FINAL_SNAPSHOT_FAILED" || error.code === "FINAL_SNAPSHOT_TIMEOUT" || error.code === "FINAL_SNAPSHOT_UNSUPPORTED");
|
|
17191
|
+
}
|
|
17192
|
+
/**
|
|
17193
|
+
* Refusal for an atomic-final-snapshot type whose state records
|
|
17194
|
+
* `provisionedBy: 'cc-api'` (#614 silent-drop routing / `--recreate-via-cc-api`).
|
|
17195
|
+
* Cloud Control `DeleteResource` has no final-snapshot parameter and
|
|
17196
|
+
* `CloudControlProvider` cannot honor `finalSnapshotIdentifier`, so deleting
|
|
17197
|
+
* via that route would silently drop the promised snapshot — refuse instead.
|
|
17198
|
+
*/
|
|
17199
|
+
function ccRoutedFinalSnapshotError(logicalId, resourceType, skipFlagHint) {
|
|
17200
|
+
return new CdkdError(`${logicalId} (${resourceType}) has DeletionPolicy: Snapshot, but the resource is managed via the Cloud Control API route (provisionedBy: cc-api), which has no final-snapshot delete parameter — deleting it now would destroy its data WITHOUT the final snapshot the policy promises. Create a snapshot manually (e.g. aws rds create-db-snapshot / aws elasticache create-snapshot), then re-run with ${skipFlagHint} to delete WITHOUT cdkd's final snapshot (DATA LOSS otherwise), or retain the resource (DeletionPolicy: Retain) and delete it manually.`, "FINAL_SNAPSHOT_UNSUPPORTED");
|
|
17201
|
+
}
|
|
17202
|
+
/**
|
|
17203
|
+
* Build the refusal error for a Snapshot-tagged type cdkd cannot snapshot.
|
|
17204
|
+
* Thrown by the destroy call sites BEFORE any delete is issued.
|
|
17205
|
+
*/
|
|
17206
|
+
function unsupportedFinalSnapshotError(logicalId, resourceType, skipFlagHint) {
|
|
17207
|
+
return new CdkdError(`${logicalId} (${resourceType}) has DeletionPolicy: Snapshot, but${UNSUPPORTED_FINAL_SNAPSHOT_TYPES.has(resourceType) ? " cdkd does not implement final snapshots for this type yet (issue #1353)." : ` cdkd does not implement final snapshots for this type (CloudFormation itself only supports Snapshot on: EC2 Volume, ElastiCache CacheCluster / ReplicationGroup, Neptune / RDS / DocDB clusters, RDS instances, Redshift clusters).`} Deleting it now would destroy its data WITHOUT the final snapshot the policy promises. Re-run with ${skipFlagHint} to delete WITHOUT a final snapshot (DATA LOSS), or retain the resource (DeletionPolicy: Retain) and delete it manually after snapshotting.`, "FINAL_SNAPSHOT_UNSUPPORTED");
|
|
17208
|
+
}
|
|
17209
|
+
|
|
17033
17210
|
//#endregion
|
|
17034
17211
|
//#region src/analyzer/implicit-delete-deps.ts
|
|
17035
17212
|
/**
|
|
@@ -17817,7 +17994,7 @@ const FLUSH_INTERVAL_MS = 2e3;
|
|
|
17817
17994
|
const FLUSH_EVENT_THRESHOLD = 50;
|
|
17818
17995
|
/** Build-time cdkd version, with a dev fallback for non-built contexts. */
|
|
17819
17996
|
function getCdkdVersion() {
|
|
17820
|
-
return "0.275.
|
|
17997
|
+
return "0.275.6";
|
|
17821
17998
|
}
|
|
17822
17999
|
/**
|
|
17823
18000
|
* Generate a time-sortable unique run id, e.g.
|
|
@@ -18667,9 +18844,7 @@ var DeployEngine = class {
|
|
|
18667
18844
|
const startTime = Date.now();
|
|
18668
18845
|
this.logger.debug(`Starting deployment for stack: ${stackName}`);
|
|
18669
18846
|
for (const type of new Set(Object.values(template.Resources).map((r) => r.Type).filter((type) => !hasNoRegistrySchema(type)))) getCreateOnlyPropertyPaths(type).catch(() => {});
|
|
18670
|
-
await this.lockManager.acquireLockWithRetry(stackName, this.stackRegion, void 0, "deploy");
|
|
18671
18847
|
const renderer = getLiveRenderer();
|
|
18672
|
-
renderer.start();
|
|
18673
18848
|
this.interrupted = false;
|
|
18674
18849
|
this.interruptCause = null;
|
|
18675
18850
|
const sigintHandler = () => {
|
|
@@ -18680,6 +18855,13 @@ var DeployEngine = class {
|
|
|
18680
18855
|
this.interruptCause ??= "user";
|
|
18681
18856
|
};
|
|
18682
18857
|
process.on("SIGINT", sigintHandler);
|
|
18858
|
+
try {
|
|
18859
|
+
await this.lockManager.acquireLockWithRetry(stackName, this.stackRegion, void 0, "deploy");
|
|
18860
|
+
} catch (error) {
|
|
18861
|
+
process.removeListener("SIGINT", sigintHandler);
|
|
18862
|
+
throw error;
|
|
18863
|
+
}
|
|
18864
|
+
renderer.start();
|
|
18683
18865
|
try {
|
|
18684
18866
|
const currentStateData = await this.stateBackend.getState(stackName, this.stackRegion);
|
|
18685
18867
|
const currentState = currentStateData?.state ?? {
|
|
@@ -19636,13 +19818,21 @@ var DeployEngine = class {
|
|
|
19636
19818
|
delete stateResources[logicalId];
|
|
19637
19819
|
break;
|
|
19638
19820
|
}
|
|
19821
|
+
let finalSnapshotIdentifier;
|
|
19822
|
+
if (deletionPolicy === "Snapshot" && this.options.skipFinalSnapshot !== true) if (ATOMIC_FINAL_SNAPSHOT_TYPES.has(resourceType) && currentResource.provisionedBy !== "cc-api") finalSnapshotIdentifier = buildFinalSnapshotIdentifier(currentResource.physicalId, resourceType);
|
|
19823
|
+
else if (ATOMIC_FINAL_SNAPSHOT_TYPES.has(resourceType)) throw ccRoutedFinalSnapshotError(logicalId, resourceType, "--skip-final-snapshot");
|
|
19824
|
+
else if (PRE_DELETE_SNAPSHOT_TYPES.has(resourceType)) await createEbsFinalSnapshot(this.options.finalSnapshotEc2 ?? getAwsClients().ec2, currentResource.physicalId, logicalId, this.logger);
|
|
19825
|
+
else throw unsupportedFinalSnapshotError(logicalId, resourceType, "--skip-final-snapshot");
|
|
19639
19826
|
const deleteProvider = this.providerRegistry.getProviderFor({
|
|
19640
19827
|
resourceType,
|
|
19641
19828
|
provisionedBy: currentResource.provisionedBy
|
|
19642
19829
|
}).provider;
|
|
19643
19830
|
this.logger.debug(`Deleting ${logicalId} (${resourceType})`);
|
|
19644
19831
|
try {
|
|
19645
|
-
await this.withRetry(() => deleteProvider.delete(logicalId, currentResource.physicalId, resourceType, currentResource.properties, {
|
|
19832
|
+
await this.withRetry(() => deleteProvider.delete(logicalId, currentResource.physicalId, resourceType, currentResource.properties, {
|
|
19833
|
+
expectedRegion: this.stackRegion,
|
|
19834
|
+
...finalSnapshotIdentifier !== void 0 && { finalSnapshotIdentifier }
|
|
19835
|
+
}), logicalId, 3, 5e3, deleteProvider);
|
|
19646
19836
|
} catch (deleteError) {
|
|
19647
19837
|
const msg = deleteError instanceof Error ? deleteError.message : String(deleteError);
|
|
19648
19838
|
if (msg.includes("does not exist") || msg.includes("was not found") || msg.includes("not found") || msg.includes("No policy found") || msg.includes("NoSuchEntity") || msg.includes("NotFoundException") || msg.includes("ResourceNotFoundException")) this.logger.debug(`Resource ${logicalId} already deleted (${msg}), removing from state`);
|
|
@@ -19874,5 +20064,5 @@ var DeployEngine = class {
|
|
|
19874
20064
|
};
|
|
19875
20065
|
|
|
19876
20066
|
//#endregion
|
|
19877
|
-
export {
|
|
19878
|
-
//# sourceMappingURL=deploy-engine-
|
|
20067
|
+
export { TemplateParser as $, CdkdError as $t, yellow as A, resolveAutoAssetStorage as At, IntrinsicFunctionResolver as B, MIGRATE_TMP_PREFIX as Bt, renderStatefulReason as C, AssetManifestLoader as Ct, gray as D, getDefaultStateBucketName as Dt, cyan as E, synthesisStatusMessage as Et, findActionableSilentDrops as F, resolveUseCdkBootstrapAssets as Ft, resolveExplicitPhysicalId as G, processStackMessages as Gt, refStateLookupFromResource as H, uploadCfnTemplate as Ht, CloudControlProvider as I, stateBucketExistenceConfirmed as It, DiffCalculator as J, AwsClients as Jt, assertRegionMatch as K, clearBucketRegionCache as Kt, slowCcOperationTimeoutMs as L, warnDeprecatedNoPrefixCliFlag as Lt, collectInlinePolicyNamesManagedBySiblings as M, resolveSkipPrefix as Mt, clearOnUpdateRemoval as N, resolveStateBucketWithDefault as Nt, green as O, getLegacyStateBucketName as Ot, ProviderRegistry as P, resolveStateBucketWithDefaultAndSource as Pt, DagBuilder as Q, AssetError as Qt, disableInstanceApiTermination as R, CFN_TEMPLATE_BODY_LIMIT as Rt, isStatefulRecreateTargetSync as S, runDockerStreaming as St, bold as T, Synthesizer as Tt, WAFv2WebACLProvider as U, expectedOwnerParam as Ut, cfnRefValueFromPhysicalId as V, findLargeInlineResources as Vt, normalizeAwsTagsToCfn as W, AssemblyReader as Wt, withRetry as X, resetAwsClients as Xt, describeTypeWithThrottleRetry as Y, getAwsClients as Yt, isRetryableTransientError as Z, setAwsClients as Zt, createEbsFinalSnapshot as _, formatError as _n, validateContainerRepoName as _t, DeploymentEventsStore as a, LocalStartServiceError as an, stringifyValue as at, extractDeploymentEventError as b, withErrorHandling as bn, getDockerCmd as bt, replayFailedOperations as c, NestedStackChildDirectDestroyError as cn, createAssetRedirectResolver as ct, IMPLICIT_DELETE_DEPENDENCIES as d, ResourceTimeoutError as dn, AssetModeResolver as dt, ConfigError as en, LockManager as et, computeImplicitDeleteEdges as f, ResourceUpdateNotSupportedError as fn, BOOTSTRAP_MARKER_PREFIX as ft, ccRoutedFinalSnapshotError as g, SynthesisError as gn, validateAssetBucketName as gt, buildFinalSnapshotIdentifier as h, StateError as hn, parseBootstrapMarker as ht, DeploymentEventsReader as i, LocalMigrateError as in, AssetPublisher as it, IAMRoleProvider as j, resolveCaptureObservedState as jt, red as k, resolveApp as kt, replayRollback as l, PartialFailureError as ln, loadPublishableAssetManifest as lt, PRE_DELETE_SNAPSHOT_TYPES as m, StackTerminationProtectionError as mn, getBootstrapMarkerKey as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, DeployCancelledError as nn, rebuildClientForBucketRegion as nt, planFailedOps as o, LockError as on, WorkGraph as ot, ATOMIC_FINAL_SNAPSHOT_TYPES as p, StackHasActiveImportsError as pn, ensureAssetStorage as pt, applyRoleArnIfSet as q, resolveBucketRegion as qt, DeployEngine as r, LocalInvokeBuildError as rn, shouldRetainResource as rt, planRollback as s, MissingCdkCliError as sn, buildAssetRedirectMap as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, DependencyError as tn, S3StateBackend as tt, withResourceDeadline as u, ProvisioningError as un, rewriteTemplateAssetReferences as ut, isFinalSnapshotError as v, isCdkdError as vn, buildDockerImage as vt, formatResourceLine as w, getDockerImageBySourceHash as wt, MULTI_REGION_RECREATE_BLOCKED_TYPES as x, __exportAll as xn, runDockerForeground as xt, unsupportedFinalSnapshotError as y, normalizeAwsError as yn, formatDockerLoginError as yt, isTerminationProtectionPropagationError as z, CFN_TEMPLATE_URL_LIMIT as zt };
|
|
20068
|
+
//# sourceMappingURL=deploy-engine-D5j6_ZH6.js.map
|