@go-to-k/cdkd 0.278.17 → 0.278.19

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,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as DagBuilder, A as red, At as resolveApp, B as isTerminationProtectionPropagationError, Bt as CFN_TEMPLATE_URL_LIMIT, C as isStatefulRecreateTargetSync, Ct as runDockerStreaming, D as cyan, Dt as synthesisStatusMessage, E as bold, Et as Synthesizer, F as ProviderRegistry, Ft as resolveStateBucketWithDefaultAndSource, G as normalizeAwsTagsToCfn, Gt as AssemblyReader, H as cfnRefValueFromPhysicalId, Ht as findLargeInlineResources, I as findActionableSilentDrops, It as resolveUseCdkBootstrapAssets, J as applyRoleArnIfSet, Jt as resolveBucketRegion, K as resolveExplicitPhysicalId, Kt as processStackMessages, L as CloudControlProvider, Lt as stateBucketExistenceConfirmed, M as IAMRoleProvider, Mt as resolveCaptureObservedState, N as collectInlinePolicyNamesManagedBySiblings, Nt as resolveSkipPrefix, O as gray, Ot as getDefaultStateBucketName, P as clearOnUpdateRemoval, Pt as resolveStateBucketWithDefault, Q as isRetryableTransientError, Qt as setAwsClients, R as slowCcOperationTimeoutMs, Rt as warnDeprecatedNoPrefixCliFlag, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as runDockerForeground, T as formatResourceLine, Tt as getDockerImageBySourceHash, U as refStateLookupFromResource, Ut as uploadCfnTemplate, V as IntrinsicFunctionResolver, Vt as MIGRATE_TMP_PREFIX, W as WAFv2WebACLProvider, Wt as expectedOwnerParam, X as describeTypeWithThrottleRetry, Xt as getAwsClients, Y as DiffCalculator, Yt as AwsClients, Z as withRetry, Zt as resetAwsClients, _ as createPreDeleteFinalSnapshot, _t as validateAssetBucketName, a as DeploymentEventsStore, an as LocalMigrateError, at as AssetPublisher, b as unsupportedFinalSnapshotError, bn as normalizeAwsError, bt as formatDockerLoginError, c as replayFailedOperations, cn as MissingCdkCliError, ct as buildAssetRedirectMap, d as IMPLICIT_DELETE_DEPENDENCIES, dn as ProvisioningError, dt as rewriteTemplateAssetReferences, en as CdkdError, et as TemplateParser, f as computeImplicitDeleteEdges, fn as ResourceTimeoutError, ft as AssetModeResolver, g as ccRoutedFinalSnapshotError, gt as parseBootstrapMarker, h as buildFinalSnapshotIdentifier, hn as StackTerminationProtectionError, ht as getBootstrapMarkerKey, i as DeploymentEventsReader, in as LocalInvokeBuildError$1, it as shouldRetainResource, j as yellow, jt as resolveAutoAssetStorage, k as green, kt as getLegacyStateBucketName, l as replayRollback, ln as NestedStackChildDirectDestroyError, lt as createAssetRedirectResolver, m as PRE_DELETE_SNAPSHOT_TYPES, mn as StackHasActiveImportsError, mt as ensureAssetStorage, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as S3StateBackend, o as planFailedOps, on as LocalStartServiceError, ot as stringifyValue, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as ResourceUpdateNotSupportedError, pt as BOOTSTRAP_MARKER_PREFIX, q as assertRegionMatch, r as DeployEngine, rn as DeployCancelledError, rt as rebuildClientForBucketRegion, s as planRollback, st as WorkGraph, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as LockManager, u as withResourceDeadline, un as PartialFailureError, ut as loadPublishableAssetManifest, v as isFinalSnapshotError, vt as validateContainerRepoName, w as renderStatefulReason, wt as AssetManifestLoader, x as extractDeploymentEventError, xn as withErrorHandling, xt as getDockerCmd, y as refusesFinalSnapshot, yt as buildDockerImage, z as disableInstanceApiTermination, zt as CFN_TEMPLATE_BODY_LIMIT } from "./deploy-engine-C37xsRjc.js";
2
+ import { $ as DagBuilder, A as red, At as resolveApp, B as isTerminationProtectionPropagationError, Bt as CFN_TEMPLATE_URL_LIMIT, C as isStatefulRecreateTargetSync, Ct as runDockerStreaming, D as cyan, Dt as synthesisStatusMessage, E as bold, Et as Synthesizer, F as ProviderRegistry, Ft as resolveStateBucketWithDefaultAndSource, G as normalizeAwsTagsToCfn, Gt as AssemblyReader, H as cfnRefValueFromPhysicalId, Ht as findLargeInlineResources, I as findActionableSilentDrops, It as resolveUseCdkBootstrapAssets, J as applyRoleArnIfSet, Jt as resolveBucketRegion, K as resolveExplicitPhysicalId, Kt as processStackMessages, L as CloudControlProvider, Lt as stateBucketExistenceConfirmed, M as IAMRoleProvider, Mt as resolveCaptureObservedState, N as collectInlinePolicyNamesManagedBySiblings, Nt as resolveSkipPrefix, O as gray, Ot as getDefaultStateBucketName, P as clearOnUpdateRemoval, Pt as resolveStateBucketWithDefault, Q as isRetryableTransientError, Qt as setAwsClients, R as slowCcOperationTimeoutMs, Rt as warnDeprecatedNoPrefixCliFlag, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as runDockerForeground, T as formatResourceLine, Tt as getDockerImageBySourceHash, U as refStateLookupFromResource, Ut as uploadCfnTemplate, V as IntrinsicFunctionResolver, Vt as MIGRATE_TMP_PREFIX, W as WAFv2WebACLProvider, Wt as expectedOwnerParam, X as describeTypeWithThrottleRetry, Xt as getAwsClients, Y as DiffCalculator, Yt as AwsClients, Z as withRetry, Zt as resetAwsClients, _ as createPreDeleteFinalSnapshot, _t as validateAssetBucketName, a as DeploymentEventsStore, an as LocalMigrateError, at as AssetPublisher, b as unsupportedFinalSnapshotError, bn as normalizeAwsError, bt as formatDockerLoginError, c as replayFailedOperations, cn as MissingCdkCliError, ct as buildAssetRedirectMap, d as IMPLICIT_DELETE_DEPENDENCIES, dn as ProvisioningError, dt as rewriteTemplateAssetReferences, en as CdkdError, et as TemplateParser, f as computeImplicitDeleteEdges, fn as ResourceTimeoutError, ft as AssetModeResolver, g as ccRoutedFinalSnapshotError, gt as parseBootstrapMarker, h as buildFinalSnapshotIdentifier, hn as StackTerminationProtectionError, ht as getBootstrapMarkerKey, i as DeploymentEventsReader, in as LocalInvokeBuildError$1, it as shouldRetainResource, j as yellow, jt as resolveAutoAssetStorage, k as green, kt as getLegacyStateBucketName, l as replayRollback, ln as NestedStackChildDirectDestroyError, lt as createAssetRedirectResolver, m as PRE_DELETE_SNAPSHOT_TYPES, mn as StackHasActiveImportsError, mt as ensureAssetStorage, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as S3StateBackend, o as planFailedOps, on as LocalStartServiceError, ot as stringifyValue, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as ResourceUpdateNotSupportedError, pt as BOOTSTRAP_MARKER_PREFIX, q as assertRegionMatch, r as DeployEngine, rn as DeployCancelledError, rt as rebuildClientForBucketRegion, s as planRollback, st as WorkGraph, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as LockManager, u as withResourceDeadline, un as PartialFailureError, ut as loadPublishableAssetManifest, v as isFinalSnapshotError, vt as validateContainerRepoName, w as renderStatefulReason, wt as AssetManifestLoader, x as extractDeploymentEventError, xn as withErrorHandling, xt as getDockerCmd, y as refusesFinalSnapshot, yt as buildDockerImage, z as disableInstanceApiTermination, zt as CFN_TEMPLATE_BODY_LIMIT } from "./deploy-engine-DOQs235O.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-1Aaq8WrB.js";
4
+ import { t as ASGProvider } from "./asg-provider-DaP2cw8z.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, 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, 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";
@@ -4855,8 +4855,11 @@ function mergeLegacySingular(plural, singular, onCollision) {
4855
4855
  /** Coerce a CFn boolean, which may arrive as the string `"true"` / `"false"`. */
4856
4856
  function coerceCfnBoolean(value) {
4857
4857
  if (typeof value === "boolean") return value;
4858
- if (value === "true") return true;
4859
- if (value === "false") return false;
4858
+ if (typeof value === "string") {
4859
+ const lowered = value.toLowerCase();
4860
+ if (lowered === "true") return true;
4861
+ if (lowered === "false") return false;
4862
+ }
4860
4863
  }
4861
4864
  /**
4862
4865
  * SDK Provider for AWS::S3::Bucket
@@ -5271,7 +5274,8 @@ var S3BucketProvider = class {
5271
5274
  Events: l["Event"] !== void 0 ? [l["Event"]] : l["Events"],
5272
5275
  Filter: this.cfnNotifFilterToSdk(l["Filter"])
5273
5276
  }));
5274
- if (notifConfig["EventBridgeConfiguration"] !== void 0) cfg.EventBridgeConfiguration = {};
5277
+ const eb = notifConfig["EventBridgeConfiguration"];
5278
+ if (eb !== void 0 && (!isPlainObject$1(eb) || coerceCfnBoolean(eb["EventBridgeEnabled"]) !== false)) cfg.EventBridgeConfiguration = {};
5275
5279
  }
5276
5280
  await this.s3Client.send(new PutBucketNotificationConfigurationCommand({
5277
5281
  Bucket: bucketName,
@@ -6052,7 +6056,7 @@ var S3BucketProvider = class {
6052
6056
  if (l.Filter) e["Filter"] = this.sdkNotifFilterToCfn(l.Filter);
6053
6057
  return e;
6054
6058
  });
6055
- if (resp.EventBridgeConfiguration) out["EventBridgeConfiguration"] = {};
6059
+ out["EventBridgeConfiguration"] = { EventBridgeEnabled: resp.EventBridgeConfiguration !== void 0 };
6056
6060
  return out;
6057
6061
  }
6058
6062
  sdkNotifFilterToCfn(filter) {
@@ -12531,6 +12535,7 @@ var DynamoDBGlobalTableProvider = class {
12531
12535
  }
12532
12536
  const previousSdkIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling);
12533
12537
  const gsiDiff = diffGlobalSecondaryIndexes(previousSdkIndexes, toSdkGlobalSecondaryIndexes(properties, currentRegion, newBilling));
12538
+ const rawOnDemandDeclarations = collectRawOnDemandDeclarations(properties, currentRegion);
12534
12539
  const previousSdkByName = /* @__PURE__ */ new Map();
12535
12540
  for (const prev of previousSdkIndexes) if (prev.IndexName) previousSdkByName.set(prev.IndexName, prev);
12536
12541
  for (const gsi of gsiDiff.removed) {
@@ -12560,22 +12565,27 @@ var DynamoDBGlobalTableProvider = class {
12560
12565
  await this.waitForTableActiveAfterUpdate(physicalId, logicalId);
12561
12566
  }
12562
12567
  for (const gsi of gsiDiff.modified) {
12563
- if (!gsi.IndexName) continue;
12568
+ if (typeof gsi.IndexName !== "string" || gsi.IndexName.length === 0) continue;
12564
12569
  if (gsiHandledByBillingFlip.has(gsi.IndexName)) continue;
12565
12570
  const billingFlipped = oldBilling !== newBilling;
12566
12571
  const update = { IndexName: gsi.IndexName };
12567
12572
  const previousOnDemand = previousSdkByName.get(gsi.IndexName)?.OnDemandThroughput;
12573
+ const declared = rawOnDemandDeclarations.get(gsi.IndexName);
12568
12574
  const onDemand = { ...gsi.OnDemandThroughput };
12575
+ const unresolvedMembers = [];
12569
12576
  if (!billingFlipped && previousOnDemand) {
12570
- if (previousOnDemand.MaxReadRequestUnits !== void 0 && onDemand.MaxReadRequestUnits === void 0) onDemand.MaxReadRequestUnits = ON_DEMAND_LIMIT_RESET;
12571
- if (previousOnDemand.MaxWriteRequestUnits !== void 0 && onDemand.MaxWriteRequestUnits === void 0) onDemand.MaxWriteRequestUnits = ON_DEMAND_LIMIT_RESET;
12577
+ if (previousOnDemand.MaxReadRequestUnits !== void 0 && onDemand.MaxReadRequestUnits === void 0) if (declared?.readDeclared) unresolvedMembers.push("MaxReadRequestUnits");
12578
+ else onDemand.MaxReadRequestUnits = ON_DEMAND_LIMIT_RESET;
12579
+ if (previousOnDemand.MaxWriteRequestUnits !== void 0 && onDemand.MaxWriteRequestUnits === void 0) if (declared?.writeDeclared) unresolvedMembers.push("MaxWriteRequestUnits");
12580
+ else onDemand.MaxWriteRequestUnits = ON_DEMAND_LIMIT_RESET;
12572
12581
  }
12582
+ if (unresolvedMembers.length > 0) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId}: the template declares ${unresolvedMembers.join(" / ")} but the value did not resolve to a number, so the on-demand limit was left UNCHANGED on AWS rather than applied or cleared. This is usually an unresolved intrinsic in the template; resolve it to a literal to change the ceiling, or remove the property entirely to clear it.`);
12573
12583
  if (Object.keys(onDemand).length > 0) update.OnDemandThroughput = onDemand;
12574
12584
  if (!billingFlipped && gsi.ProvisionedThroughput) update.ProvisionedThroughput = gsi.ProvisionedThroughput;
12575
12585
  const previousSdk = previousSdkByName.get(gsi.IndexName);
12576
12586
  if (gsi.WarmThroughput !== void 0 && !deepEqual$1(gsi.WarmThroughput, previousSdk?.WarmThroughput)) update.WarmThroughput = gsi.WarmThroughput;
12577
12587
  if (!update.ProvisionedThroughput && !update.OnDemandThroughput && !update.WarmThroughput) {
12578
- if (!billingFlipped) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId} changed in a way DynamoDB's UpdateTable cannot express (KeySchema / Projection are immutable on an existing index). Recreate the index under a new name to apply the change.`);
12588
+ if (!billingFlipped && unresolvedMembers.length === 0) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId} changed in a way DynamoDB's UpdateTable cannot express (KeySchema / Projection are immutable on an existing index). Recreate the index under a new name to apply the change.`);
12579
12589
  continue;
12580
12590
  }
12581
12591
  const gsiUpdate = { Update: update };
@@ -13532,6 +13542,89 @@ function toSdkGlobalSecondaryIndexes(properties, region, billingMode) {
13532
13542
  return result;
13533
13543
  }
13534
13544
  /**
13545
+ * True when a CFn sub-object is nothing but an unresolved intrinsic
13546
+ * (`{"Fn::If": […]}` / `{"Ref": …}`), i.e. the template DID declare the block
13547
+ * but its value could not be resolved to a shape with members.
13548
+ *
13549
+ * Needed because presence is otherwise tested on the MEMBER key: an
13550
+ * intrinsic-valued block IS a record, so `asRecord` succeeds while
13551
+ * `['MaxReadRequestUnits']` is undefined — reporting "not declared" and firing
13552
+ * the destructive `-1` reset on a ceiling the template was trying to SET. That
13553
+ * is issue #1440 one level up from where the member test looks.
13554
+ */
13555
+ function isUnresolvedIntrinsicBlock(value) {
13556
+ const record = asRecord(value);
13557
+ if (!record) return false;
13558
+ const keys = Object.keys(record);
13559
+ return keys.length > 0 && keys.every((k) => k === "Ref" || k.startsWith("Fn::"));
13560
+ }
13561
+ /**
13562
+ * Per-index RAW presence of the two per-GSI on-demand members, keyed by
13563
+ * `IndexName` (issue #1440).
13564
+ *
13565
+ * The per-GSI reset needs to know "did the template DROP this member", and the
13566
+ * only faithful answer is whether the CFn key is THERE — not whether its value
13567
+ * coerced. `toSdkGlobalSecondaryIndexes` runs every value through
13568
+ * {@link toFiniteNumber}, which returns `undefined` for a present-but-
13569
+ * unparseable value (an unresolved `{Ref: …}`, `''`, an object). Deciding
13570
+ * "dropped" from that collapsed view sent the `-1` reset for a member the
13571
+ * template was actively trying to SET, silently clearing the ceiling — the same
13572
+ * silent-wrong-action class the reset exists to remove, and the exact hazard
13573
+ * the table-level path was corrected for in #1434's PR.
13574
+ *
13575
+ * So this walks the same two sources as `toSdkGlobalSecondaryIndexes` — the
13576
+ * top-level GSI for the write half, the LOCAL replica's index entry (with the
13577
+ * GSI-level spelling as the documented fallback) for the read half — and
13578
+ * reports presence only. Keeping it beside that function is deliberate: the
13579
+ * two must agree on where each member lives, and a divergence between them is
13580
+ * exactly what would re-open the bug.
13581
+ *
13582
+ * A missing entry means "not declared", which lets the reset FIRE — i.e. the
13583
+ * DESTRUCTIVE direction, not a conservative one. Two DIFFERENT mechanisms keep
13584
+ * that safe, and neither is "the translation validates everything":
13585
+ * - a non-array `GlobalSecondaryIndexes` is refused LOUDLY by
13586
+ * `toSdkGlobalSecondaryIndexes` before any of this runs;
13587
+ * - a malformed per-ENTRY shape is NOT refused — it is passed through
13588
+ * untouched so AWS surfaces the real error — but such an entry carries no
13589
+ * usable `IndexName`, so the reset loop skips it before consulting this map.
13590
+ * Do not relax either behavior on the assumption that this helper degrades
13591
+ * safely on its own; it does not.
13592
+ */
13593
+ function collectRawOnDemandDeclarations(properties, region) {
13594
+ const out = /* @__PURE__ */ new Map();
13595
+ const rawIndexes = properties["GlobalSecondaryIndexes"];
13596
+ if (!Array.isArray(rawIndexes)) return out;
13597
+ const replicas = properties["Replicas"];
13598
+ const localReplicaIndexes = asRecord(Array.isArray(replicas) ? replicas.find((r) => asRecord(r)?.["Region"] === region) : void 0)?.["GlobalSecondaryIndexes"];
13599
+ const localByName = /* @__PURE__ */ new Map();
13600
+ if (Array.isArray(localReplicaIndexes)) for (const entry of localReplicaIndexes) {
13601
+ const record = asRecord(entry);
13602
+ const name = record?.["IndexName"];
13603
+ if (record && typeof name === "string") localByName.set(name, record);
13604
+ }
13605
+ for (const entry of rawIndexes) {
13606
+ const gsi = asRecord(entry);
13607
+ const name = gsi?.["IndexName"];
13608
+ if (!gsi || typeof name !== "string") continue;
13609
+ const localEntry = localByName.get(name);
13610
+ const explicitOnDemand = asRecord(gsi["OnDemandThroughput"]);
13611
+ if (explicitOnDemand) {
13612
+ out.set(name, {
13613
+ readDeclared: explicitOnDemand["MaxReadRequestUnits"] !== void 0,
13614
+ writeDeclared: explicitOnDemand["MaxWriteRequestUnits"] !== void 0
13615
+ });
13616
+ continue;
13617
+ }
13618
+ const readBlocks = [localEntry?.["ReadOnDemandThroughputSettings"], gsi["ReadOnDemandThroughputSettings"]];
13619
+ const writeBlock = gsi["WriteOnDemandThroughputSettings"];
13620
+ out.set(name, {
13621
+ readDeclared: readBlocks.some((block) => asRecord(block)?.["MaxReadRequestUnits"] !== void 0 || isUnresolvedIntrinsicBlock(block)),
13622
+ writeDeclared: asRecord(writeBlock)?.["MaxWriteRequestUnits"] !== void 0 || isUnresolvedIntrinsicBlock(writeBlock)
13623
+ });
13624
+ }
13625
+ return out;
13626
+ }
13627
+ /**
13535
13628
  * Translate a CFn `Replicas[].GlobalSecondaryIndexes[]` blob (the
13536
13629
  * `ReplicaGlobalSecondaryIndexSpecification` shape) into the SDK's
13537
13630
  * `ReplicaGlobalSecondaryIndex[]` used by `CreateReplicationGroupMemberAction`
@@ -65016,7 +65109,7 @@ function createMigrateCommand() {
65016
65109
  */
65017
65110
  function buildProgram() {
65018
65111
  const program = new Command();
65019
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.17");
65112
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.19");
65020
65113
  program.hook("preAction", (_thisCommand, actionCommand) => {
65021
65114
  const { profile } = actionCommand.optsWithGlobals();
65022
65115
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;