@go-to-k/cdkd 0.234.1 → 0.235.1

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/cli.js CHANGED
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { A as withErrorHandling, B as generateResourceName, C as StackHasActiveImportsError, F as getLiveRenderer, H as withSkipPrefix, I as PATTERN_B_NAME_OPTIONS, L as PATTERN_B_NAME_PROPERTIES, M as getLogger, P as runStackBuffered, R as PATTERN_B_RESOURCE_TYPES, S as ResourceUpdateNotSupportedError, U as withStackName, V as generateResourceNameWithFallback, _ as MissingCdkCliError, a as normalizeAwsTagsToCfn, b as ProvisioningError, f as LocalInvokeBuildError$1, i as matchesCdkPath, k as normalizeAwsError, l as CdkdError, m as LocalStartServiceError, n as isTerminationProtectionPropagationError, o as resolveExplicitPhysicalId, p as LocalMigrateError, r as CDK_PATH_TAG, s as assertRegionMatch, t as disableInstanceApiTermination, v as NestedStackChildDirectDestroyError, w as StackTerminationProtectionError, x as ResourceTimeoutError, y as PartialFailureError } from "./ec2-termination-protection-uvVnteGl.js";
3
- import { a as setAwsClients, i as resetAwsClients, r as getAwsClients, t as AwsClients } from "./aws-clients-pjPwZz1r.js";
4
- import { $ as AssetManifestLoader, A as DiffCalculator, B as buildAssetRedirectMap, C as findActionableSilentDrops, D as refStateLookupFromResource, E as cfnRefValueFromPhysicalId, F as rebuildClientForBucketRegion, G as BOOTSTRAP_MARKER_PREFIX, H as loadPublishableAssetManifest, I as shouldRetainResource, J as buildDockerImage, K as ensureAssetStorage, L as AssetPublisher, M as TemplateParser, N as LockManager, O as WAFv2WebACLProvider, P as S3StateBackend, Q as runDockerStreaming, R as stringifyValue, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as rewriteTemplateAssetReferences, V as createAssetRedirectResolver, W as AssetModeResolver, X as getDockerCmd, Y as formatDockerLoginError, Z as runDockerForeground, _ as green, _t as AssemblyReader, a as withRetry, at as resolveApp, b as IAMRoleProvider, c as computeImplicitDeleteEdges, ct as resolveStateBucketWithDefault, d as isStatefulRecreateTargetSync, dt as warnDeprecatedNoPrefixCliFlag, et as getDockerImageBySourceHash, f as renderStatefulReason, ft as CFN_TEMPLATE_BODY_LIMIT, g as gray, gt as uploadCfnTemplate, h as cyan, ht as findLargeInlineResources, i as withResourceDeadline, it as getLegacyStateBucketName, j as DagBuilder, k as applyRoleArnIfSet, l as extractDeploymentEventError, lt as resolveStateBucketWithDefaultAndSource, m as bold, mt as MIGRATE_TMP_PREFIX, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as synthesisStatusMessage, o as isRetryableTransientError, ot as resolveCaptureObservedState, p as formatResourceLine, pt as CFN_TEMPLATE_URL_LIMIT, q as parseBootstrapMarker, r as DeployEngine, rt as getDefaultStateBucketName, s as IMPLICIT_DELETE_DEPENDENCIES, st as resolveSkipPrefix, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as Synthesizer, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as resolveUseCdkBootstrapAssets, v as red, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, y as yellow, yt as resolveBucketRegion, z as WorkGraph } from "./deploy-engine-CdAkyW9k.js";
5
- import { t as ASGProvider } from "./asg-provider-Dd9Xze-T.js";
2
+ 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-BzO-joNR.js";
3
+ import { A as withErrorHandling, C as StackHasActiveImportsError, S as ResourceUpdateNotSupportedError, _ as MissingCdkCliError, a as normalizeAwsTagsToCfn, b as ProvisioningError, f as LocalInvokeBuildError$1, i as matchesCdkPath, k as normalizeAwsError, l as CdkdError, m as LocalStartServiceError, n as isTerminationProtectionPropagationError, o as resolveExplicitPhysicalId, p as LocalMigrateError, r as CDK_PATH_TAG, s as assertRegionMatch, t as disableInstanceApiTermination, v as NestedStackChildDirectDestroyError, w as StackTerminationProtectionError, x as ResourceTimeoutError, y as PartialFailureError } from "./ec2-termination-protection-q-WGWgxa.js";
4
+ import { a as setAwsClients, i as resetAwsClients, r as getAwsClients, t as AwsClients } from "./aws-clients-B15NAPbL.js";
5
+ import { $ as AssetManifestLoader, A as DiffCalculator, B as buildAssetRedirectMap, C as findActionableSilentDrops, D as refStateLookupFromResource, E as cfnRefValueFromPhysicalId, F as rebuildClientForBucketRegion, G as BOOTSTRAP_MARKER_PREFIX, H as loadPublishableAssetManifest, I as shouldRetainResource, J as buildDockerImage, K as ensureAssetStorage, L as AssetPublisher, M as TemplateParser, N as LockManager, O as WAFv2WebACLProvider, P as S3StateBackend, Q as runDockerStreaming, R as stringifyValue, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as rewriteTemplateAssetReferences, V as createAssetRedirectResolver, W as AssetModeResolver, X as getDockerCmd, Y as formatDockerLoginError, Z as runDockerForeground, _ as green, _t as uploadCfnTemplate, a as withRetry, at as resolveApp, b as IAMRoleProvider, bt as resolveBucketRegion, c as computeImplicitDeleteEdges, ct as resolveSkipPrefix, d as isStatefulRecreateTargetSync, dt as resolveUseCdkBootstrapAssets, et as getDockerImageBySourceHash, f as renderStatefulReason, ft as warnDeprecatedNoPrefixCliFlag, g as gray, gt as findLargeInlineResources, h as cyan, ht as MIGRATE_TMP_PREFIX, i as withResourceDeadline, it as getLegacyStateBucketName, j as DagBuilder, k as applyRoleArnIfSet, l as extractDeploymentEventError, lt as resolveStateBucketWithDefault, m as bold, mt as CFN_TEMPLATE_URL_LIMIT, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as synthesisStatusMessage, o as isRetryableTransientError, ot as resolveAutoAssetStorage, p as formatResourceLine, pt as CFN_TEMPLATE_BODY_LIMIT, q as parseBootstrapMarker, r as DeployEngine, rt as getDefaultStateBucketName, s as IMPLICIT_DELETE_DEPENDENCIES, st as resolveCaptureObservedState, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as Synthesizer, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as resolveStateBucketWithDefaultAndSource, v as red, vt as AssemblyReader, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, y as yellow, z as WorkGraph } from "./deploy-engine-iahWC4C1.js";
6
+ import { t as expectedOwnerParam } from "./expected-bucket-owner-BjEfUnkA.js";
7
+ import { t as ASGProvider } from "./asg-provider-Dbl1_mwT.js";
6
8
  import { AsyncLocalStorage } from "node:async_hooks";
7
9
  import { createHash, randomBytes, randomUUID } from "node:crypto";
8
10
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListBucketsCommand, ListDirectoryBucketsCommand, 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";
@@ -508,6 +510,7 @@ const deployOptions = [
508
510
  new Option("--dry-run", "Show changes without applying").default(false),
509
511
  new Option("--skip-assets", "Skip asset publishing").default(false),
510
512
  new Option("--no-rollback", "Skip rollback on deployment failure"),
513
+ new Option("--no-auto-asset-storage", "Do not auto-create cdkd-owned asset storage (asset bucket + container-asset ECR repo + marker) on the first deploy into a region not yet opted in via 'cdkd bootstrap'. Deploys into such regions stay in legacy mode (CDK bootstrap destinations). Per-app opt-out: cdk.json context.cdkd.autoAssetStorage: false."),
511
514
  new Option("--no-capture-observed-state", "Skip capturing AWS-current properties after each create/update (adds a fire-and-forget readCurrentState per resource so cdkd drift can compare against the real deploy-time AWS snapshot instead of the template). On by default. Disable when deploy speed matters more than rich drift detection — falls back to comparing against template properties (the pre-v3 behavior)."),
512
515
  new Option("--prefix-user-supplied-names", "Opt in to LEGACY behavior: prepend the stack name to physical names the user explicitly supplied in their CDK code (e.g. `new iam.Role(this, \"X\", { roleName: \"my-role\" })` → AWS resource named `MyStack-my-role` instead of `my-role`). Since v0.94.0 the default is to NOT prefix user-supplied names — this flag restores the pre-v0.94.0 behavior on Pattern B providers (IAM Role / User / Group / InstanceProfile / ELBv2 LoadBalancer / TargetGroup). Enable via this flag, CDKD_PREFIX_USER_SUPPLIED_NAMES=true, or cdk.json context.cdkd.prefixUserSuppliedNames=true. Applies to `cdkd deploy` only.").default(false),
513
516
  noWaitOption,
@@ -650,7 +653,10 @@ async function bootstrapCommand(options) {
650
653
  try {
651
654
  let bucketExists = false;
652
655
  try {
653
- await stateBucketS3.send(new HeadBucketCommand({ Bucket: bucketName }));
656
+ await stateBucketS3.send(new HeadBucketCommand({
657
+ Bucket: bucketName,
658
+ ExpectedBucketOwner: accountId
659
+ }));
654
660
  bucketExists = true;
655
661
  logger.info(`Bucket ${bucketName} already exists`);
656
662
  } catch (error) {
@@ -681,12 +687,14 @@ async function bootstrapCommand(options) {
681
687
  logger.debug("Enabling bucket versioning...");
682
688
  await stateBucketS3.send(new PutBucketVersioningCommand({
683
689
  Bucket: bucketName,
690
+ ExpectedBucketOwner: accountId,
684
691
  VersioningConfiguration: { Status: "Enabled" }
685
692
  }));
686
693
  logger.info("✓ Enabled bucket versioning");
687
694
  logger.debug("Enabling bucket encryption...");
688
695
  await stateBucketS3.send(new PutBucketEncryptionCommand({
689
696
  Bucket: bucketName,
697
+ ExpectedBucketOwner: accountId,
690
698
  ServerSideEncryptionConfiguration: { Rules: [{
691
699
  ApplyServerSideEncryptionByDefault: { SSEAlgorithm: "AES256" },
692
700
  BucketKeyEnabled: true
@@ -707,6 +715,7 @@ async function bootstrapCommand(options) {
707
715
  };
708
716
  await stateBucketS3.send(new PutBucketPolicyCommand({
709
717
  Bucket: bucketName,
718
+ ExpectedBucketOwner: accountId,
710
719
  Policy: JSON.stringify(bucketPolicy)
711
720
  }));
712
721
  logger.info("✓ Set bucket policy (deny external access)");
@@ -1463,6 +1472,28 @@ async function promptRecreateConfirm(input) {
1463
1472
  }
1464
1473
  }
1465
1474
 
1475
+ //#endregion
1476
+ //#region src/cli/commands/confirm-prompt.ts
1477
+ /**
1478
+ * Default-YES confirmation prompt (`[Y/n]`, empty input = yes). Used by the
1479
+ * issue #1007 asset-storage auto-create on interactive TTY deploys without
1480
+ * `--yes`. Kept in its own module (mirrors `recreate-confirm-prompt.ts`) so
1481
+ * the accept/decline parsing is unit-testable without importing the whole
1482
+ * deploy command.
1483
+ */
1484
+ async function promptYesNo(prompt) {
1485
+ const rl = readline.createInterface({
1486
+ input: process.stdin,
1487
+ output: process.stdout
1488
+ });
1489
+ try {
1490
+ const ans = await rl.question(`${prompt} [Y/n] `);
1491
+ return /^(y(es)?)?$/i.test(ans.trim());
1492
+ } finally {
1493
+ rl.close();
1494
+ }
1495
+ }
1496
+
1466
1497
  //#endregion
1467
1498
  //#region src/state/deployment-events-store.ts
1468
1499
  /**
@@ -1503,7 +1534,7 @@ const FLUSH_INTERVAL_MS = 2e3;
1503
1534
  const FLUSH_EVENT_THRESHOLD = 50;
1504
1535
  /** Build-time cdkd version, with a dev fallback for non-built contexts. */
1505
1536
  function getCdkdVersion() {
1506
- return "0.234.1";
1537
+ return "0.235.1";
1507
1538
  }
1508
1539
  /**
1509
1540
  * Generate a time-sortable unique run id, e.g.
@@ -2134,6 +2165,14 @@ var ExportIndexStore = class {
2134
2165
  * `config.region()` shape (e.g. a hand-rolled test double) the resolution
2135
2166
  * is skipped and the original client is used unchanged.
2136
2167
  */
2168
+ /**
2169
+ * `ExpectedBucketOwner` spread for every state-bucket S3 call (squatting
2170
+ * hardening — see src/utils/expected-bucket-owner.ts). Best-effort:
2171
+ * resolves to an empty object for non-standard clients (test doubles).
2172
+ */
2173
+ async ownerParam() {
2174
+ return expectedOwnerParam(this.s3Client);
2175
+ }
2137
2176
  async ensureClientForBucket() {
2138
2177
  if (this.clientResolved) return;
2139
2178
  if (this.resolveInFlight) return this.resolveInFlight;
@@ -2279,6 +2318,7 @@ var ExportIndexStore = class {
2279
2318
  try {
2280
2319
  const response = await this.s3Client.send(new GetObjectCommand({
2281
2320
  Bucket: this.bucket,
2321
+ ...await this.ownerParam(),
2282
2322
  Key: this.indexKey()
2283
2323
  }));
2284
2324
  return {
@@ -2295,6 +2335,7 @@ var ExportIndexStore = class {
2295
2335
  const body = JSON.stringify(next, null, 2);
2296
2336
  return (await this.s3Client.send(new PutObjectCommand({
2297
2337
  Bucket: this.bucket,
2338
+ ...await this.ownerParam(),
2298
2339
  Key: this.indexKey(),
2299
2340
  Body: body,
2300
2341
  ContentLength: Buffer.byteLength(body),
@@ -37709,9 +37750,18 @@ async function deployCommand(stacks, options) {
37709
37750
  stsClient.destroy();
37710
37751
  const assetPublisher = new AssetPublisher();
37711
37752
  const useCdkBootstrapAssets = resolveUseCdkBootstrapAssets(options.useCdkBootstrapAssets);
37753
+ const autoAssetStorage = resolveAutoAssetStorage(options.autoAssetStorage);
37754
+ const confirmAutoAssetStorage = async (assetRegion) => {
37755
+ if (options.yes || !process.stdin.isTTY) {
37756
+ logger.info(`Creating cdkd asset storage for region '${assetRegion}' (first deploy into this region; opt out with --no-auto-asset-storage).`);
37757
+ return true;
37758
+ }
37759
+ return promptYesNo(`Region '${assetRegion}' has no cdkd asset storage yet. Create it now (S3 bucket cdkd-assets-${accountId}-${assetRegion} + container-asset ECR repo, out of 'cdk gc' reach)?`);
37760
+ };
37712
37761
  const assetModeResolver = new AssetModeResolver(preflightStateBackend, accountId, {
37713
37762
  ...options.profile && { profile: options.profile },
37714
- ...useCdkBootstrapAssets && { useCdkBootstrapAssets: true }
37763
+ ...useCdkBootstrapAssets && { useCdkBootstrapAssets: true },
37764
+ ...autoAssetStorage && !options.dryRun && !options.skipAssets && { autoCreate: { confirm: confirmAutoAssetStorage } }
37715
37765
  });
37716
37766
  const stateConfig = {
37717
37767
  bucket: stateBucket,
@@ -41906,6 +41956,8 @@ async function stateMigrateCommand(options) {
41906
41956
  await newS3.send(new CopyObjectCommand({
41907
41957
  Bucket: newBucket,
41908
41958
  Key: obj.Key,
41959
+ ...await expectedOwnerParam(newS3),
41960
+ ExpectedSourceBucketOwner: accountId,
41909
41961
  CopySource: encodeURIComponent(`${legacyBucket}/${obj.Key}`)
41910
41962
  }));
41911
41963
  copied++;
@@ -41919,7 +41971,10 @@ async function stateMigrateCommand(options) {
41919
41971
  logger.info(`Emptying source bucket ${legacyBucket} (all versions + delete markers)...`);
41920
41972
  await emptyBucketAllVersions(legacyS3, legacyBucket);
41921
41973
  logger.info(`Deleting source bucket ${legacyBucket}...`);
41922
- await legacyS3.send(new DeleteBucketCommand({ Bucket: legacyBucket }));
41974
+ await legacyS3.send(new DeleteBucketCommand({
41975
+ Bucket: legacyBucket,
41976
+ ...await expectedOwnerParam(legacyS3)
41977
+ }));
41923
41978
  logger.info(`✓ Deleted source bucket: ${legacyBucket}`);
41924
41979
  } else logger.info(`Source bucket ${legacyBucket} kept. Pass --remove-legacy on a future run to delete it.`);
41925
41980
  logger.info(`✓ Migration complete: ${legacyBucket} -> ${newBucket}`);
@@ -41935,7 +41990,10 @@ async function stateMigrateCommand(options) {
41935
41990
  }
41936
41991
  async function bucketExists(s3, bucketName) {
41937
41992
  try {
41938
- await s3.send(new HeadBucketCommand({ Bucket: bucketName }));
41993
+ await s3.send(new HeadBucketCommand({
41994
+ Bucket: bucketName,
41995
+ ...await expectedOwnerParam(s3)
41996
+ }));
41939
41997
  return true;
41940
41998
  } catch (error) {
41941
41999
  const err = error;
@@ -41951,6 +42009,7 @@ async function listAllObjects(s3, bucket) {
41951
42009
  do {
41952
42010
  const resp = await s3.send(new ListObjectsV2Command({
41953
42011
  Bucket: bucket,
42012
+ ...await expectedOwnerParam(s3),
41954
42013
  ...continuationToken && { ContinuationToken: continuationToken }
41955
42014
  }));
41956
42015
  if (resp.Contents) all.push(...resp.Contents);
@@ -41993,10 +42052,12 @@ async function ensureDestinationBucket(bucketName, region, accountId, logger) {
41993
42052
  logger.info(`✓ Created destination bucket: ${bucketName}`);
41994
42053
  await s3.send(new PutBucketVersioningCommand({
41995
42054
  Bucket: bucketName,
42055
+ ...await expectedOwnerParam(s3),
41996
42056
  VersioningConfiguration: { Status: "Enabled" }
41997
42057
  }));
41998
42058
  await s3.send(new PutBucketEncryptionCommand({
41999
42059
  Bucket: bucketName,
42060
+ ...await expectedOwnerParam(s3),
42000
42061
  ServerSideEncryptionConfiguration: { Rules: [{
42001
42062
  ApplyServerSideEncryptionByDefault: { SSEAlgorithm: "AES256" },
42002
42063
  BucketKeyEnabled: true
@@ -42004,6 +42065,7 @@ async function ensureDestinationBucket(bucketName, region, accountId, logger) {
42004
42065
  }));
42005
42066
  await s3.send(new PutBucketPolicyCommand({
42006
42067
  Bucket: bucketName,
42068
+ ...await expectedOwnerParam(s3),
42007
42069
  Policy: JSON.stringify({
42008
42070
  Version: "2012-10-17",
42009
42071
  Statement: [{
@@ -42030,6 +42092,7 @@ async function emptyBucketAllVersions(s3, bucket) {
42030
42092
  do {
42031
42093
  const resp = await s3.send(new ListObjectVersionsCommand({
42032
42094
  Bucket: bucket,
42095
+ ...await expectedOwnerParam(s3),
42033
42096
  ...keyMarker && { KeyMarker: keyMarker },
42034
42097
  ...versionIdMarker && { VersionIdMarker: versionIdMarker }
42035
42098
  }));
@@ -42046,6 +42109,7 @@ async function emptyBucketAllVersions(s3, bucket) {
42046
42109
  const batch = ids.slice(i, i + 1e3);
42047
42110
  await s3.send(new DeleteObjectsCommand({
42048
42111
  Bucket: bucket,
42112
+ ...await expectedOwnerParam(s3),
42049
42113
  Delete: {
42050
42114
  Objects: batch,
42051
42115
  Quiet: true
@@ -45282,7 +45346,10 @@ function formatBucketSource(source) {
45282
45346
  */
45283
45347
  async function detectBucketRegion(awsClients, bucket) {
45284
45348
  try {
45285
- const constraint = (await awsClients.s3.send(new GetBucketLocationCommand({ Bucket: bucket }))).LocationConstraint;
45349
+ const constraint = (await awsClients.s3.send(new GetBucketLocationCommand({
45350
+ Bucket: bucket,
45351
+ ...await expectedOwnerParam(awsClients.s3)
45352
+ }))).LocationConstraint;
45286
45353
  if (!constraint) return "us-east-1";
45287
45354
  if (constraint === "EU") return "eu-west-1";
45288
45355
  return constraint;
@@ -45330,7 +45397,8 @@ async function readSchemaVersion(awsClients, bucket, keys) {
45330
45397
  try {
45331
45398
  const resp = await awsClients.s3.send(new GetObjectCommand({
45332
45399
  Bucket: bucket,
45333
- Key: keys[0]
45400
+ Key: keys[0],
45401
+ ...await expectedOwnerParam(awsClients.s3)
45334
45402
  }));
45335
45403
  if (!resp.Body) return "unknown";
45336
45404
  const body = await resp.Body.transformToString();
@@ -45365,7 +45433,8 @@ async function listAssetStorageMarkers(awsClients, bucket) {
45365
45433
  try {
45366
45434
  const marker = parseBootstrapMarker(await (await awsClients.s3.send(new GetObjectCommand({
45367
45435
  Bucket: bucket,
45368
- Key: key
45436
+ Key: key,
45437
+ ...await expectedOwnerParam(awsClients.s3)
45369
45438
  }))).Body?.transformToString() ?? "", key);
45370
45439
  entries.push({
45371
45440
  region,
@@ -56014,7 +56083,7 @@ function reorderArgs(argv) {
56014
56083
  async function main() {
56015
56084
  installPipeCloseHandler();
56016
56085
  const program = new Command();
56017
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.234.1");
56086
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.235.1");
56018
56087
  program.addCommand(createBootstrapCommand());
56019
56088
  program.addCommand(createSynthCommand());
56020
56089
  program.addCommand(createListCommand());