cdk-local 0.149.8 → 0.149.9
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 +2 -0
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +71 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -2
- package/dist/{local-studio-D-j3TZWX.d.ts → local-studio-C9L3lxW_.d.ts} +3 -1
- package/dist/local-studio-C9L3lxW_.d.ts.map +1 -0
- package/dist/{local-studio-DGJn7XtJ.js → local-studio-CcK2y5Gs.js} +544 -56
- package/dist/local-studio-CcK2y5Gs.js.map +1 -0
- package/package.json +1 -1
- package/dist/local-studio-D-j3TZWX.d.ts.map +0 -1
- package/dist/local-studio-DGJn7XtJ.js.map +0 -1
|
@@ -14,13 +14,14 @@ import { Agent as Agent$2 } from "agent-base";
|
|
|
14
14
|
import { HttpProxyAgent } from "http-proxy-agent";
|
|
15
15
|
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
16
16
|
import { getProxyForUrl } from "proxy-from-env";
|
|
17
|
+
import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
|
|
18
|
+
import { GetParameterCommand, GetParametersCommand, SSMClient } from "@aws-sdk/client-ssm";
|
|
17
19
|
import { unzipSync } from "fflate";
|
|
18
20
|
import { MultiSelectPrompt } from "@clack/core";
|
|
19
21
|
import { S_BAR, S_BAR_END, S_BAR_START, S_CHECKBOX_ACTIVE, S_CHECKBOX_INACTIVE, S_CHECKBOX_SELECTED, confirm, isCancel, multiselect, select, text } from "@clack/prompts";
|
|
20
22
|
import { CloudFormationClient, DescribeStacksCommand, ListExportsCommand, ListStackResourcesCommand } from "@aws-sdk/client-cloudformation";
|
|
21
23
|
import { GetFunctionConfigurationCommand, LambdaClient } from "@aws-sdk/client-lambda";
|
|
22
24
|
import { BedrockAgentCoreControlClient, GetAgentRuntimeCommand } from "@aws-sdk/client-bedrock-agentcore-control";
|
|
23
|
-
import { GetParameterCommand, GetParametersCommand, SSMClient } from "@aws-sdk/client-ssm";
|
|
24
25
|
import { execFile, spawn } from "node:child_process";
|
|
25
26
|
import { connect, createServer as createServer$2 } from "node:net";
|
|
26
27
|
import { promisify } from "node:util";
|
|
@@ -38,7 +39,6 @@ import * as chokidar from "chokidar";
|
|
|
38
39
|
import { Sha256 } from "@aws-crypto/sha256-js";
|
|
39
40
|
import { SignatureV4 } from "@smithy/signature-v4";
|
|
40
41
|
import graphlib from "graphlib";
|
|
41
|
-
import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
|
|
42
42
|
import * as nodeBuffer from "node:buffer";
|
|
43
43
|
import * as nodeQuerystring from "node:querystring";
|
|
44
44
|
import * as vm from "node:vm";
|
|
@@ -506,6 +506,355 @@ function effectiveAssumeRoleArn(logicalId, opt) {
|
|
|
506
506
|
return opt.perLambda?.[logicalId] ?? opt.globalArn;
|
|
507
507
|
}
|
|
508
508
|
|
|
509
|
+
//#endregion
|
|
510
|
+
//#region src/utils/own-keys.ts
|
|
511
|
+
function defineOwnKey(target, key, value) {
|
|
512
|
+
Object.defineProperty(target, key, {
|
|
513
|
+
value,
|
|
514
|
+
writable: true,
|
|
515
|
+
enumerable: true,
|
|
516
|
+
configurable: true
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
//#endregion
|
|
521
|
+
//#region src/local/dynamic-reference-resolver.ts
|
|
522
|
+
var DynamicReferenceResolutionError = class DynamicReferenceResolutionError extends Error {
|
|
523
|
+
constructor(message) {
|
|
524
|
+
super(message);
|
|
525
|
+
this.name = "DynamicReferenceResolutionError";
|
|
526
|
+
Object.setPrototypeOf(this, DynamicReferenceResolutionError.prototype);
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
var DeferredFailure = class extends Error {
|
|
530
|
+
build;
|
|
531
|
+
constructor(build) {
|
|
532
|
+
super("deferred dynamic-reference failure");
|
|
533
|
+
this.build = build;
|
|
534
|
+
}
|
|
535
|
+
render(opts) {
|
|
536
|
+
return new DynamicReferenceResolutionError(this.build(opts.consumer, opts.overridable !== false));
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
function deferred(build) {
|
|
540
|
+
return new DeferredFailure(build);
|
|
541
|
+
}
|
|
542
|
+
const DYNAMIC_REFERENCE_SOURCE = String.raw`\{\{resolve:[^}]*\}\}`;
|
|
543
|
+
const DYNAMIC_REFERENCE_DETECT = new RegExp(DYNAMIC_REFERENCE_SOURCE);
|
|
544
|
+
function dynamicReferenceMatcher() {
|
|
545
|
+
return new RegExp(DYNAMIC_REFERENCE_SOURCE, "g");
|
|
546
|
+
}
|
|
547
|
+
function firstUsableRegion(...candidates) {
|
|
548
|
+
return candidates.find((r) => r !== void 0 && r !== "" && r !== "unknown-region");
|
|
549
|
+
}
|
|
550
|
+
function keysOverriddenBy(templateEnv, applyOverrides) {
|
|
551
|
+
const out = /* @__PURE__ */ new Set();
|
|
552
|
+
if (!templateEnv) return out;
|
|
553
|
+
const sentinel = {};
|
|
554
|
+
for (const k of Object.keys(templateEnv)) defineOwnKey(sentinel, k, `\u0000cdkl-sentinel:${k}`);
|
|
555
|
+
const applied = applyOverrides(sentinel);
|
|
556
|
+
for (const k of Object.keys(templateEnv)) if (!Object.hasOwn(applied, k) || applied[k] !== sentinel[k]) out.add(k);
|
|
557
|
+
return out;
|
|
558
|
+
}
|
|
559
|
+
function withoutKeys(env, keys) {
|
|
560
|
+
const out = {};
|
|
561
|
+
for (const k of Object.keys(env)) if (!keys.has(k)) defineOwnKey(out, k, env[k]);
|
|
562
|
+
return out;
|
|
563
|
+
}
|
|
564
|
+
function deployedFillMayBeSecret(templateValue, template) {
|
|
565
|
+
const resources = template?.Resources ?? {};
|
|
566
|
+
const secretAttribute = (logicalId, attribute) => {
|
|
567
|
+
const res = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
|
|
568
|
+
const type = res && typeof res === "object" ? res["Type"] : void 0;
|
|
569
|
+
if (typeof type !== "string") return false;
|
|
570
|
+
if (type.startsWith("Custom::") || type === "AWS::CloudFormation::CustomResource") return true;
|
|
571
|
+
if (type === "AWS::CloudFormation::Stack") return attribute.startsWith("Outputs.");
|
|
572
|
+
return type === "AWS::IAM::AccessKey" && attribute === "SecretAccessKey" || type === "AWS::AppSync::ApiKey" && attribute === "ApiKey" || type === "AWS::Cognito::UserPoolClient" && attribute === "ClientSecret";
|
|
573
|
+
};
|
|
574
|
+
const getAttTarget = (arg) => {
|
|
575
|
+
if (Array.isArray(arg) && typeof arg[0] === "string" && typeof arg[1] === "string") return [arg[0], arg[1]];
|
|
576
|
+
if (typeof arg === "string" && arg.includes(".")) {
|
|
577
|
+
const i = arg.indexOf(".");
|
|
578
|
+
return [arg.slice(0, i), arg.slice(i + 1)];
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
const noEcho = /* @__PURE__ */ new Set();
|
|
582
|
+
for (const [name, decl] of Object.entries(template?.Parameters ?? {})) if (decl && typeof decl === "object") {
|
|
583
|
+
const flag = decl["NoEcho"];
|
|
584
|
+
if (String(flag).toLowerCase() === "true") noEcho.add(name);
|
|
585
|
+
}
|
|
586
|
+
const subNamesNoEcho = (body, bound) => {
|
|
587
|
+
for (const m of body.matchAll(/\$\{([^}!][^}]*)\}/g)) {
|
|
588
|
+
const name = m[1].trim();
|
|
589
|
+
if (bound.has(name)) continue;
|
|
590
|
+
if (noEcho.has(name)) return true;
|
|
591
|
+
const dot = name.indexOf(".");
|
|
592
|
+
if (dot > 0 && secretAttribute(name.slice(0, dot), name.slice(dot + 1))) return true;
|
|
593
|
+
}
|
|
594
|
+
return false;
|
|
595
|
+
};
|
|
596
|
+
const walk = (v) => {
|
|
597
|
+
if (typeof v === "string") return v.includes("{{resolve:");
|
|
598
|
+
if (Array.isArray(v)) return v.some(walk);
|
|
599
|
+
if (v === null || typeof v !== "object") return false;
|
|
600
|
+
const obj = v;
|
|
601
|
+
if (Object.hasOwn(obj, "Fn::ImportValue") || Object.hasOwn(obj, "Fn::GetStackOutput")) return true;
|
|
602
|
+
if (Object.hasOwn(obj, "Fn::GetAtt")) {
|
|
603
|
+
const target = getAttTarget(obj["Fn::GetAtt"]);
|
|
604
|
+
if (target && secretAttribute(target[0], target[1])) return true;
|
|
605
|
+
}
|
|
606
|
+
if (Object.hasOwn(obj, "Ref")) {
|
|
607
|
+
const target = obj["Ref"];
|
|
608
|
+
if (typeof target === "string" && noEcho.has(target)) return true;
|
|
609
|
+
}
|
|
610
|
+
if (Object.hasOwn(obj, "Fn::Sub")) {
|
|
611
|
+
const sub = obj["Fn::Sub"];
|
|
612
|
+
if (typeof sub === "string" && subNamesNoEcho(sub, /* @__PURE__ */ new Set())) return true;
|
|
613
|
+
if (Array.isArray(sub) && typeof sub[0] === "string") {
|
|
614
|
+
const bindings = sub[1] && typeof sub[1] === "object" ? sub[1] : {};
|
|
615
|
+
if (subNamesNoEcho(sub[0], new Set(Object.keys(bindings)))) return true;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
return Object.values(obj).some(walk);
|
|
619
|
+
};
|
|
620
|
+
return walk(templateValue);
|
|
621
|
+
}
|
|
622
|
+
function containsDynamicReference(value) {
|
|
623
|
+
return typeof value === "string" && DYNAMIC_REFERENCE_DETECT.test(value);
|
|
624
|
+
}
|
|
625
|
+
function malformed(raw, why) {
|
|
626
|
+
return new DynamicReferenceResolutionError(`Malformed CloudFormation dynamic reference ${displayUntrustedValue(raw)}: ${why}.`);
|
|
627
|
+
}
|
|
628
|
+
function parseDynamicReference(raw) {
|
|
629
|
+
const m = /^\{\{resolve:([^:{}]*):([^{}]*)\}\}$/.exec(raw);
|
|
630
|
+
if (!m) throw malformed(raw, "expected {{resolve:<service>:<reference>}}");
|
|
631
|
+
const service = m[1];
|
|
632
|
+
const body = m[2];
|
|
633
|
+
if (service === "secretsmanager") return parseSecretsManager(raw, body);
|
|
634
|
+
if (service === "ssm" || service === "ssm-secure") return parseSsm(raw, service, body);
|
|
635
|
+
throw malformed(raw, `unsupported service ${displayUntrustedValue(service)} (expected secretsmanager, ssm or ssm-secure)`);
|
|
636
|
+
}
|
|
637
|
+
function parseSecretsManager(raw, body) {
|
|
638
|
+
const parts = body.split(":");
|
|
639
|
+
let secretId;
|
|
640
|
+
let rest;
|
|
641
|
+
let arnRegion;
|
|
642
|
+
if (body.startsWith("arn:")) {
|
|
643
|
+
if (parts.length < 7 || parts[2] !== "secretsmanager" || parts[5] !== "secret" || !parts[6]) throw malformed(raw, "the secret ARN is not arn:<partition>:secretsmanager:<region>:<account>:secret:<name>");
|
|
644
|
+
secretId = parts.slice(0, 7).join(":");
|
|
645
|
+
arnRegion = parts[3] || void 0;
|
|
646
|
+
rest = parts.slice(7);
|
|
647
|
+
} else {
|
|
648
|
+
secretId = parts[0];
|
|
649
|
+
rest = parts.slice(1);
|
|
650
|
+
}
|
|
651
|
+
if (secretId.length === 0) throw malformed(raw, "the secret id is empty");
|
|
652
|
+
if (rest.length > 4) throw malformed(raw, "too many segments after the secret id (expected SecretString:<json-key>:<version-stage>:<version-id>)");
|
|
653
|
+
const [secretString, jsonKey, versionStage, versionId] = rest;
|
|
654
|
+
if (secretString !== void 0 && secretString !== "" && secretString !== "SecretString") throw malformed(raw, "the only supported value segment is SecretString");
|
|
655
|
+
if (versionStage && versionId) throw malformed(raw, "specify a version stage or a version id, not both");
|
|
656
|
+
return {
|
|
657
|
+
service: "secretsmanager",
|
|
658
|
+
raw,
|
|
659
|
+
secretId,
|
|
660
|
+
...arnRegion !== void 0 && { arnRegion },
|
|
661
|
+
...jsonKey && { jsonKey },
|
|
662
|
+
...versionStage && { versionStage },
|
|
663
|
+
...versionId && { versionId }
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
function parseSsm(raw, service, body) {
|
|
667
|
+
const parts = body.split(":");
|
|
668
|
+
let nameParts;
|
|
669
|
+
let versionParts;
|
|
670
|
+
let arnRegion;
|
|
671
|
+
if (body.startsWith("arn:")) {
|
|
672
|
+
if (parts.length < 6 || parts[2] !== "ssm" || !parts[5]?.startsWith("parameter/")) throw malformed(raw, "the parameter ARN is not arn:<partition>:ssm:<region>:<account>:parameter/<name>");
|
|
673
|
+
nameParts = parts.slice(0, 6);
|
|
674
|
+
versionParts = parts.slice(6);
|
|
675
|
+
arnRegion = parts[3] || void 0;
|
|
676
|
+
} else {
|
|
677
|
+
nameParts = parts.slice(0, 1);
|
|
678
|
+
versionParts = parts.slice(1);
|
|
679
|
+
}
|
|
680
|
+
const name = nameParts.join(":");
|
|
681
|
+
if (name.length === 0) throw malformed(raw, "the parameter name is empty");
|
|
682
|
+
if (versionParts.length > 1) throw malformed(raw, "too many segments after the parameter name");
|
|
683
|
+
const version = versionParts[0];
|
|
684
|
+
if (version !== void 0 && !/^[1-9]\d*$/.test(version)) throw malformed(raw, "the parameter version must be a positive integer");
|
|
685
|
+
return {
|
|
686
|
+
service,
|
|
687
|
+
raw,
|
|
688
|
+
name,
|
|
689
|
+
...arnRegion !== void 0 && { arnRegion },
|
|
690
|
+
...version !== void 0 && { version }
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
function requiredPermissionsFor(ref) {
|
|
694
|
+
switch (ref.service) {
|
|
695
|
+
case "secretsmanager": return "secretsmanager:GetSecretValue (plus kms:Decrypt when the secret uses a customer managed KMS key)";
|
|
696
|
+
case "ssm": return "ssm:GetParameter";
|
|
697
|
+
case "ssm-secure": return "ssm:GetParameter and kms:Decrypt on the parameter key";
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
var DynamicReferenceResolver = class {
|
|
701
|
+
smClients = /* @__PURE__ */ new Map();
|
|
702
|
+
ssmClients = /* @__PURE__ */ new Map();
|
|
703
|
+
cache = /* @__PURE__ */ new Map();
|
|
704
|
+
options;
|
|
705
|
+
constructor(options = {}) {
|
|
706
|
+
this.options = options;
|
|
707
|
+
}
|
|
708
|
+
async resolveString(value, opts) {
|
|
709
|
+
if (!containsDynamicReference(value)) return value;
|
|
710
|
+
const tokens = [...value.matchAll(dynamicReferenceMatcher())].map((m) => m[0]);
|
|
711
|
+
const resolved = await Promise.all(tokens.map((t) => this.resolveToken(t, opts)));
|
|
712
|
+
let i = 0;
|
|
713
|
+
return value.replace(dynamicReferenceMatcher(), () => resolved[i++]);
|
|
714
|
+
}
|
|
715
|
+
dispose() {
|
|
716
|
+
for (const c of this.smClients.values()) c.destroy();
|
|
717
|
+
for (const c of this.ssmClients.values()) c.destroy();
|
|
718
|
+
this.smClients.clear();
|
|
719
|
+
this.ssmClients.clear();
|
|
720
|
+
this.cache.clear();
|
|
721
|
+
}
|
|
722
|
+
resolveToken(raw, opts) {
|
|
723
|
+
let ref;
|
|
724
|
+
try {
|
|
725
|
+
ref = parseDynamicReference(raw);
|
|
726
|
+
} catch (err) {
|
|
727
|
+
if (!(err instanceof DynamicReferenceResolutionError)) throw err;
|
|
728
|
+
return Promise.reject(new DynamicReferenceResolutionError(`${err.message.replace(/\.$/, "")} (${opts.consumer}).`));
|
|
729
|
+
}
|
|
730
|
+
const region = firstUsableRegion(ref.arnRegion, opts.region);
|
|
731
|
+
const cacheKey = `${region ?? ""}\u0000${raw}`;
|
|
732
|
+
let pending = this.cache.get(cacheKey);
|
|
733
|
+
if (!pending) {
|
|
734
|
+
pending = ref.service === "secretsmanager" ? this.fetchSecret(ref, region) : this.fetchParameter(ref, region);
|
|
735
|
+
this.cache.set(cacheKey, pending);
|
|
736
|
+
pending.catch(() => this.cache.delete(cacheKey));
|
|
737
|
+
}
|
|
738
|
+
const service = ref.service;
|
|
739
|
+
return pending.then((value) => {
|
|
740
|
+
getLogger().child("dynamic-reference").debug(`Resolved ${service} dynamic reference for ${opts.consumer}`);
|
|
741
|
+
return value;
|
|
742
|
+
}, (err) => {
|
|
743
|
+
throw err instanceof DeferredFailure ? err.render(opts) : err;
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
smClient(region) {
|
|
747
|
+
const key = region ?? "";
|
|
748
|
+
let c = this.smClients.get(key);
|
|
749
|
+
if (!c) {
|
|
750
|
+
c = this.options.secretsManagerClientFactory?.(region) ?? new SecretsManagerClient({
|
|
751
|
+
...buildProxyClientConfig({ profile: this.options.profile }),
|
|
752
|
+
...region && { region },
|
|
753
|
+
...this.options.profile && { profile: this.options.profile }
|
|
754
|
+
});
|
|
755
|
+
this.smClients.set(key, c);
|
|
756
|
+
}
|
|
757
|
+
return c;
|
|
758
|
+
}
|
|
759
|
+
ssmClient(region) {
|
|
760
|
+
const key = region ?? "";
|
|
761
|
+
let c = this.ssmClients.get(key);
|
|
762
|
+
if (!c) {
|
|
763
|
+
c = this.options.ssmClientFactory?.(region) ?? new SSMClient({
|
|
764
|
+
...buildProxyClientConfig({ profile: this.options.profile }),
|
|
765
|
+
...region && { region },
|
|
766
|
+
...this.options.profile && { profile: this.options.profile }
|
|
767
|
+
});
|
|
768
|
+
this.ssmClients.set(key, c);
|
|
769
|
+
}
|
|
770
|
+
return c;
|
|
771
|
+
}
|
|
772
|
+
fetchFailure(ref, region, operation, err) {
|
|
773
|
+
const name = err instanceof Error ? err.name : "";
|
|
774
|
+
let hint = "";
|
|
775
|
+
if (/NotFound/.test(name)) hint = ` The ${ref.service === "secretsmanager" ? "secret" : "parameter"} (or the requested version) does not exist in ${region ?? "the default region"}.`;
|
|
776
|
+
else if (/AccessDenied|NotAuthorized|UnrecognizedClient|ExpiredToken/.test(name)) hint = " The credentials cdk-local resolves with were refused.";
|
|
777
|
+
const detail = describeAwsFailureForWarn(err, operation);
|
|
778
|
+
return deferred((consumer, overridable) => `Could not resolve CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} (${operation} in ${region ?? "the default region"}): ${detail}.${hint} Resolving it needs ${requiredPermissionsFor(ref)}. cdk-local does not fall back to the unresolved token` + (overridable ? "; override the variable with --env-vars to skip the lookup." : "."));
|
|
779
|
+
}
|
|
780
|
+
async fetchSecret(ref, region) {
|
|
781
|
+
const operation = "SecretsManager GetSecretValue";
|
|
782
|
+
let secretString;
|
|
783
|
+
try {
|
|
784
|
+
secretString = (await this.smClient(region).send(new GetSecretValueCommand({
|
|
785
|
+
SecretId: ref.secretId,
|
|
786
|
+
...ref.versionStage && { VersionStage: ref.versionStage },
|
|
787
|
+
...ref.versionId && { VersionId: ref.versionId }
|
|
788
|
+
}))).SecretString;
|
|
789
|
+
} catch (err) {
|
|
790
|
+
throw this.fetchFailure(ref, region, operation, err);
|
|
791
|
+
}
|
|
792
|
+
if (secretString === void 0) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer}: the secret has no SecretString (binary secrets cannot be referenced).`);
|
|
793
|
+
if (ref.jsonKey === void 0) return secretString;
|
|
794
|
+
const jsonKey = ref.jsonKey;
|
|
795
|
+
let parsed;
|
|
796
|
+
try {
|
|
797
|
+
parsed = JSON.parse(secretString);
|
|
798
|
+
} catch (err) {
|
|
799
|
+
const kind = err instanceof Error ? err.name : "unknown";
|
|
800
|
+
throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but the secret value is not valid JSON (${kind}). The parser detail is withheld because it would echo the secret plaintext.`);
|
|
801
|
+
}
|
|
802
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but the secret root is not a JSON object.`);
|
|
803
|
+
if (!Object.hasOwn(parsed, jsonKey)) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but no such key exists in the secret JSON.`);
|
|
804
|
+
const value = parsed[jsonKey];
|
|
805
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
806
|
+
}
|
|
807
|
+
async fetchParameter(ref, region) {
|
|
808
|
+
const operation = "SSM GetParameter";
|
|
809
|
+
let value;
|
|
810
|
+
let type;
|
|
811
|
+
try {
|
|
812
|
+
const resp = await this.ssmClient(region).send(new GetParameterCommand({
|
|
813
|
+
Name: ref.version !== void 0 ? `${ref.name}:${ref.version}` : ref.name,
|
|
814
|
+
WithDecryption: ref.service === "ssm-secure"
|
|
815
|
+
}));
|
|
816
|
+
value = resp.Parameter?.Value;
|
|
817
|
+
type = resp.Parameter?.Type;
|
|
818
|
+
} catch (err) {
|
|
819
|
+
throw this.fetchFailure(ref, region, operation, err);
|
|
820
|
+
}
|
|
821
|
+
if (value === void 0) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer}: SSM returned no parameter value.`);
|
|
822
|
+
if (ref.service === "ssm" && type === "SecureString") throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names a SecureString parameter; use {{resolve:ssm-secure:...}} for SecureString parameters.`);
|
|
823
|
+
return value;
|
|
824
|
+
}
|
|
825
|
+
};
|
|
826
|
+
function keysNotFromTemplate(templateEnv, finalEnv) {
|
|
827
|
+
const out = /* @__PURE__ */ new Set();
|
|
828
|
+
for (const [k, v] of Object.entries(finalEnv)) {
|
|
829
|
+
const declared = templateEnv !== void 0 && Object.hasOwn(templateEnv, k) ? templateEnv[k] : void 0;
|
|
830
|
+
if (declared === void 0 || typeof declared !== "string" && typeof declared !== "number" && typeof declared !== "boolean" || String(declared) !== v) out.add(k);
|
|
831
|
+
}
|
|
832
|
+
return out;
|
|
833
|
+
}
|
|
834
|
+
async function resolveDynamicReferencesInEnv(env, options) {
|
|
835
|
+
const candidates = Object.keys(env).filter((k) => !options.skipKeys?.has(k) && containsDynamicReference(env[k]));
|
|
836
|
+
if (candidates.length === 0) return {
|
|
837
|
+
env,
|
|
838
|
+
resolvedKeys: []
|
|
839
|
+
};
|
|
840
|
+
const resolver = options.resolver ?? new DynamicReferenceResolver(options);
|
|
841
|
+
try {
|
|
842
|
+
const values = await Promise.all(candidates.map((k) => resolver.resolveString(env[k], {
|
|
843
|
+
region: options.region,
|
|
844
|
+
consumer: `${options.label} env var ${displayUntrustedValue(k)}`
|
|
845
|
+
})));
|
|
846
|
+
const out = {};
|
|
847
|
+
for (const k of Object.keys(env)) defineOwnKey(out, k, env[k]);
|
|
848
|
+
candidates.forEach((k, i) => defineOwnKey(out, k, values[i]));
|
|
849
|
+
return {
|
|
850
|
+
env: out,
|
|
851
|
+
resolvedKeys: candidates
|
|
852
|
+
};
|
|
853
|
+
} finally {
|
|
854
|
+
if (!options.resolver) resolver.dispose();
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
509
858
|
//#endregion
|
|
510
859
|
//#region src/utils/error-handler.ts
|
|
511
860
|
var CdkLocalError = class CdkLocalError extends Error {
|
|
@@ -3612,17 +3961,6 @@ function toFlagName(field) {
|
|
|
3612
3961
|
return "--" + field.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
3613
3962
|
}
|
|
3614
3963
|
|
|
3615
|
-
//#endregion
|
|
3616
|
-
//#region src/utils/own-keys.ts
|
|
3617
|
-
function defineOwnKey(target, key, value) {
|
|
3618
|
-
Object.defineProperty(target, key, {
|
|
3619
|
-
value,
|
|
3620
|
-
writable: true,
|
|
3621
|
-
enumerable: true,
|
|
3622
|
-
configurable: true
|
|
3623
|
-
});
|
|
3624
|
-
}
|
|
3625
|
-
|
|
3626
3964
|
//#endregion
|
|
3627
3965
|
//#region src/local/state-resolver.ts
|
|
3628
3966
|
function substituteAgainstState(value, contextOrResources) {
|
|
@@ -3988,9 +4326,20 @@ async function resolveImportValueAsync(arg, context) {
|
|
|
3988
4326
|
kind: "unresolved",
|
|
3989
4327
|
reason: `Fn::ImportValue ${displayUntrustedValue(exportName)}: export not found in any deployed stack in this region`
|
|
3990
4328
|
};
|
|
4329
|
+
return crossStackLiteral(resolved, context.consumerRegion ?? context.pseudoParameters?.region, context);
|
|
4330
|
+
}
|
|
4331
|
+
async function crossStackLiteral(value, producerRegion, context) {
|
|
4332
|
+
if (producerRegion && context.resolveDynamicReferences && containsDynamicReference(value)) {
|
|
4333
|
+
const plain = await context.resolveDynamicReferences(value, producerRegion);
|
|
4334
|
+
context.onDynamicReferenceResolved?.();
|
|
4335
|
+
return {
|
|
4336
|
+
kind: "literal",
|
|
4337
|
+
value: plain
|
|
4338
|
+
};
|
|
4339
|
+
}
|
|
3991
4340
|
return {
|
|
3992
4341
|
kind: "literal",
|
|
3993
|
-
value
|
|
4342
|
+
value
|
|
3994
4343
|
};
|
|
3995
4344
|
}
|
|
3996
4345
|
async function resolveGetStackOutputAsync(arg, context) {
|
|
@@ -4057,10 +4406,7 @@ async function resolveGetStackOutputAsync(arg, context) {
|
|
|
4057
4406
|
kind: "unresolved",
|
|
4058
4407
|
reason: `Fn::GetStackOutput ${displayUntrustedValue(stackName)}.${displayUntrustedValue(outputName)} (${displayUntrustedValue(region)}): output not found in producer stack state`
|
|
4059
4408
|
};
|
|
4060
|
-
return
|
|
4061
|
-
kind: "literal",
|
|
4062
|
-
value: resolved
|
|
4063
|
-
};
|
|
4409
|
+
return crossStackLiteral(resolved, region, context);
|
|
4064
4410
|
}
|
|
4065
4411
|
function substituteEnvVarsFromState(templateEnv, contextOrResources) {
|
|
4066
4412
|
const env = {};
|
|
@@ -4111,7 +4457,7 @@ function resolveWithSensitivity(value, context) {
|
|
|
4111
4457
|
};
|
|
4112
4458
|
}
|
|
4113
4459
|
async function resolveWithSensitivityAsync(value, context) {
|
|
4114
|
-
if (!context.sensitiveParameters || context.sensitiveParameters.size === 0) return {
|
|
4460
|
+
if ((!context.sensitiveParameters || context.sensitiveParameters.size === 0) && !context.resolveDynamicReferences) return {
|
|
4115
4461
|
result: await substituteAgainstStateAsync(value, context),
|
|
4116
4462
|
consumedSensitive: false
|
|
4117
4463
|
};
|
|
@@ -4121,6 +4467,9 @@ async function resolveWithSensitivityAsync(value, context) {
|
|
|
4121
4467
|
...context,
|
|
4122
4468
|
onSensitiveParameterConsumed: () => {
|
|
4123
4469
|
consumedSensitive = true;
|
|
4470
|
+
},
|
|
4471
|
+
onDynamicReferenceResolved: () => {
|
|
4472
|
+
consumedSensitive = true;
|
|
4124
4473
|
}
|
|
4125
4474
|
}),
|
|
4126
4475
|
consumedSensitive
|
|
@@ -4928,6 +5277,7 @@ function checkVolumeHostPath(hostPath) {
|
|
|
4928
5277
|
}
|
|
4929
5278
|
async function applyCrossStackResolverToTask(task, context) {
|
|
4930
5279
|
if (!context.crossStackResolver) return;
|
|
5280
|
+
const { resolveDynamicReferences: _envOnly, ...secretContext } = context;
|
|
4931
5281
|
const rawContainers = (task.resource.Properties ?? {})["ContainerDefinitions"];
|
|
4932
5282
|
if (!Array.isArray(rawContainers)) return;
|
|
4933
5283
|
for (let idx = 0; idx < task.containers.length; idx += 1) {
|
|
@@ -4963,7 +5313,7 @@ async function applyCrossStackResolverToTask(task, context) {
|
|
|
4963
5313
|
if (typeof valueFromRaw === "string" && valueFromRaw.length > 0) continue;
|
|
4964
5314
|
if (container.secrets.some((s) => s.name === sName)) continue;
|
|
4965
5315
|
if (!isCrossStackIntrinsic(valueFromRaw)) continue;
|
|
4966
|
-
const sub = await substituteAgainstStateAsync(valueFromRaw,
|
|
5316
|
+
const sub = await substituteAgainstStateAsync(valueFromRaw, secretContext);
|
|
4967
5317
|
if (sub.kind === "literal" && typeof sub.value === "string" && sub.value.length > 0) {
|
|
4968
5318
|
container.secrets.push({
|
|
4969
5319
|
name: sName,
|
|
@@ -12136,6 +12486,8 @@ async function buildContainerSpec(args) {
|
|
|
12136
12486
|
let templateEnv = getTemplateEnv$1(lambda.resource);
|
|
12137
12487
|
const stateBundle = stateByStack.get(lambda.stack.stackName);
|
|
12138
12488
|
let stateAudit;
|
|
12489
|
+
const plaintextKeys = /* @__PURE__ */ new Set();
|
|
12490
|
+
const deployedSecretKeys = [];
|
|
12139
12491
|
if (stateBundle) {
|
|
12140
12492
|
const context = { resources: stateBundle.state.resources };
|
|
12141
12493
|
if (stateBundle.pseudoParameters) context.pseudoParameters = stateBundle.pseudoParameters;
|
|
@@ -12153,13 +12505,15 @@ async function buildContainerSpec(args) {
|
|
|
12153
12505
|
unresolved = fb.stillUnresolved;
|
|
12154
12506
|
for (const key of fb.filled) {
|
|
12155
12507
|
resolvedKeys.push(key);
|
|
12508
|
+
plaintextKeys.add(key);
|
|
12509
|
+
if (deployedFillMayBeSecret(getTemplateEnv$1(lambda.resource)?.[key], lambda.stack.template)) deployedSecretKeys.push(key);
|
|
12156
12510
|
getLogger().debug(`Lambda ${logicalId}: filled env var ${key} from deployed function config`);
|
|
12157
12511
|
}
|
|
12158
12512
|
}
|
|
12159
12513
|
stateAudit = {
|
|
12160
12514
|
resolvedKeys,
|
|
12161
12515
|
unresolved,
|
|
12162
|
-
sensitiveKeys: audit.sensitiveKeys
|
|
12516
|
+
sensitiveKeys: [...audit.sensitiveKeys, ...deployedSecretKeys]
|
|
12163
12517
|
};
|
|
12164
12518
|
for (const { key, reason } of unresolved) getLogger().warn(`Lambda ${logicalId}: state source could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
|
|
12165
12519
|
}
|
|
@@ -12170,6 +12524,14 @@ async function buildContainerSpec(args) {
|
|
|
12170
12524
|
const overrideKeyExample = lambdaCdkPath?.replace(/\/Resource$/, "") ?? logicalId;
|
|
12171
12525
|
getLogger().warn(`Lambda ${logicalId}: env var ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}) or pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to recover deployed values.`);
|
|
12172
12526
|
}
|
|
12527
|
+
for (const key of stateAudit?.sensitiveKeys ?? []) plaintextKeys.add(key);
|
|
12528
|
+
for (const key of keysNotFromTemplate(templateEnv, envResult.resolved)) plaintextKeys.add(key);
|
|
12529
|
+
const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
|
|
12530
|
+
region: firstUsableRegion(stateBundle?.region, stackRegionOverride, lambda.stack.region, stsRegion, profileRegion),
|
|
12531
|
+
label: `Lambda ${logicalId}`,
|
|
12532
|
+
skipKeys: plaintextKeys,
|
|
12533
|
+
...profile !== void 0 && { profile }
|
|
12534
|
+
});
|
|
12173
12535
|
const dockerEnv = {
|
|
12174
12536
|
AWS_LAMBDA_FUNCTION_NAME: logicalId,
|
|
12175
12537
|
AWS_LAMBDA_FUNCTION_MEMORY_SIZE: String(lambda.memoryMb),
|
|
@@ -12177,7 +12539,7 @@ async function buildContainerSpec(args) {
|
|
|
12177
12539
|
AWS_LAMBDA_FUNCTION_VERSION: "$LATEST",
|
|
12178
12540
|
AWS_LAMBDA_LOG_GROUP_NAME: `/aws/lambda/${logicalId}`,
|
|
12179
12541
|
AWS_LAMBDA_LOG_STREAM_NAME: "local",
|
|
12180
|
-
...
|
|
12542
|
+
...dynamic.env
|
|
12181
12543
|
};
|
|
12182
12544
|
const roleArn = resolveStartApiAssumeRoleArn({
|
|
12183
12545
|
logicalId,
|
|
@@ -12217,7 +12579,8 @@ async function buildContainerSpec(args) {
|
|
|
12217
12579
|
target: "/tmp",
|
|
12218
12580
|
sizeMb: lambda.ephemeralStorageMb
|
|
12219
12581
|
} : void 0;
|
|
12220
|
-
const
|
|
12582
|
+
const sensitiveKeyList = [...stateAudit?.sensitiveKeys ?? [], ...dynamic.resolvedKeys];
|
|
12583
|
+
const sensitiveEnvKeys = sensitiveKeyList.length > 0 ? new Set(sensitiveKeyList) : void 0;
|
|
12221
12584
|
if (lambda.kind === "zip") return {
|
|
12222
12585
|
kind: "zip",
|
|
12223
12586
|
lambda,
|
|
@@ -12631,13 +12994,16 @@ async function loadStateForRoutedStacks(stacks, routes, routesWithAuth, options,
|
|
|
12631
12994
|
try {
|
|
12632
12995
|
const loaded = await provider.load(stack.stackName, stack.region);
|
|
12633
12996
|
if (!loaded) continue;
|
|
12634
|
-
const bundle = {
|
|
12635
|
-
|
|
12636
|
-
|
|
12637
|
-
|
|
12638
|
-
|
|
12639
|
-
|
|
12640
|
-
|
|
12997
|
+
const bundle = {
|
|
12998
|
+
state: {
|
|
12999
|
+
version: 1,
|
|
13000
|
+
stackName: stack.stackName,
|
|
13001
|
+
resources: loaded.resources,
|
|
13002
|
+
outputs: loaded.outputs,
|
|
13003
|
+
lastModified: 0
|
|
13004
|
+
},
|
|
13005
|
+
region: loaded.region
|
|
13006
|
+
};
|
|
12641
13007
|
if (stackHasIntrinsicEnv(stackName)) {
|
|
12642
13008
|
const pseudo = await resolvePseudoParametersForStartApi(loaded.region, options);
|
|
12643
13009
|
if (pseudo) bundle.pseudoParameters = pseudo;
|
|
@@ -13145,14 +13511,30 @@ function applyProfileCredentialsOverlay(env, profileCreds, assumeRoleActive) {
|
|
|
13145
13511
|
else delete env["AWS_SESSION_TOKEN"];
|
|
13146
13512
|
}
|
|
13147
13513
|
async function resolveLambdaContainerEnv(lambda, options, profileCredentials, extraStateProviders) {
|
|
13514
|
+
const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
|
|
13515
|
+
try {
|
|
13516
|
+
return await resolveLambdaContainerEnvWith(lambda, options, profileCredentials, extraStateProviders, dynamicRefs);
|
|
13517
|
+
} finally {
|
|
13518
|
+
dynamicRefs.dispose();
|
|
13519
|
+
}
|
|
13520
|
+
}
|
|
13521
|
+
async function resolveLambdaContainerEnvWith(lambda, options, profileCredentials, extraStateProviders, dynamicRefs) {
|
|
13148
13522
|
const logger = getLogger();
|
|
13149
13523
|
let stateAudit;
|
|
13150
|
-
let
|
|
13524
|
+
let ownerRegion;
|
|
13525
|
+
const plaintextKeys = /* @__PURE__ */ new Set();
|
|
13526
|
+
const deployedSecretKeys = [];
|
|
13527
|
+
const declaredEnv = getTemplateEnv(lambda.resource);
|
|
13528
|
+
const overrides = readEnvOverridesFile$3(options.envVars);
|
|
13529
|
+
const lambdaCdkPath = readCdkPathOrUndefined(lambda.resource);
|
|
13530
|
+
const overriddenKeys = keysOverriddenBy(declaredEnv, (env) => resolveEnvVars$1(lambda.logicalId, lambdaCdkPath, env, overrides).resolved);
|
|
13531
|
+
let templateEnv = declaredEnv && withoutKeys(declaredEnv, overriddenKeys);
|
|
13151
13532
|
let stateForRoleHint;
|
|
13152
13533
|
const stateProvider = createLocalStateProvider(options, lambda.stack.stackName, await resolveCfnFallbackRegion(options, lambda.stack.region), extraStateProviders);
|
|
13153
13534
|
if (stateProvider) try {
|
|
13154
13535
|
const loaded = await stateProvider.load(lambda.stack.stackName, lambda.stack.region);
|
|
13155
13536
|
if (loaded) {
|
|
13537
|
+
ownerRegion = loaded.region;
|
|
13156
13538
|
stateForRoleHint = {
|
|
13157
13539
|
version: 1,
|
|
13158
13540
|
stackName: lambda.stack.stackName,
|
|
@@ -13162,7 +13544,11 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13162
13544
|
};
|
|
13163
13545
|
const subContext = {
|
|
13164
13546
|
resources: loaded.resources,
|
|
13165
|
-
consumerRegion: loaded.region
|
|
13547
|
+
consumerRegion: loaded.region,
|
|
13548
|
+
resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
|
|
13549
|
+
region: producerRegion,
|
|
13550
|
+
consumer: `Lambda ${lambda.logicalId} cross-stack env value`
|
|
13551
|
+
})
|
|
13166
13552
|
};
|
|
13167
13553
|
if (envHasIntrinsicValue(templateEnv)) {
|
|
13168
13554
|
const pseudo = await resolvePseudoParametersForInvoke(lambda.stack.region, options);
|
|
@@ -13192,6 +13578,8 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13192
13578
|
unresolved = fb.stillUnresolved;
|
|
13193
13579
|
for (const key of fb.filled) {
|
|
13194
13580
|
resolvedKeys.push(key);
|
|
13581
|
+
plaintextKeys.add(key);
|
|
13582
|
+
if (deployedFillMayBeSecret(declaredEnv?.[key], lambda.stack.template)) deployedSecretKeys.push(key);
|
|
13195
13583
|
logger.debug(`${label}: filled env var ${key} from deployed function config`);
|
|
13196
13584
|
}
|
|
13197
13585
|
}
|
|
@@ -13199,7 +13587,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13199
13587
|
stateAudit = {
|
|
13200
13588
|
resolvedKeys,
|
|
13201
13589
|
unresolved,
|
|
13202
|
-
sensitiveKeys: audit.sensitiveKeys
|
|
13590
|
+
sensitiveKeys: [...audit.sensitiveKeys, ...deployedSecretKeys]
|
|
13203
13591
|
};
|
|
13204
13592
|
for (const { key, reason } of unresolved) logger.warn(`${label}: could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
|
|
13205
13593
|
}
|
|
@@ -13207,14 +13595,20 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13207
13595
|
stateProvider.dispose();
|
|
13208
13596
|
throw err;
|
|
13209
13597
|
}
|
|
13210
|
-
const overrides = readEnvOverridesFile$3(options.envVars);
|
|
13211
|
-
const lambdaCdkPath = readCdkPathOrUndefined(lambda.resource);
|
|
13212
13598
|
const envResult = resolveEnvVars$1(lambda.logicalId, lambdaCdkPath, templateEnv, overrides);
|
|
13213
13599
|
for (const key of envResult.unresolved) {
|
|
13214
13600
|
if (stateAudit && stateAudit.unresolved.some((u) => u.key === key)) continue;
|
|
13215
13601
|
const overrideKeyExample = lambdaCdkPath?.replace(/\/Resource$/, "") ?? lambda.logicalId;
|
|
13216
13602
|
logger.warn(`Environment variable ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}), or pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to recover deployed values.`);
|
|
13217
13603
|
}
|
|
13604
|
+
for (const key of stateAudit?.sensitiveKeys ?? []) plaintextKeys.add(key);
|
|
13605
|
+
for (const key of keysNotFromTemplate(templateEnv, envResult.resolved)) plaintextKeys.add(key);
|
|
13606
|
+
const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
|
|
13607
|
+
region: firstUsableRegion(ownerRegion, options.stackRegion, lambda.stack.region, options.region, profileCredentials?.region),
|
|
13608
|
+
label: `Lambda ${lambda.logicalId}`,
|
|
13609
|
+
skipKeys: plaintextKeys,
|
|
13610
|
+
resolver: dynamicRefs
|
|
13611
|
+
});
|
|
13218
13612
|
let resolvedAssumeRoleArn;
|
|
13219
13613
|
try {
|
|
13220
13614
|
resolvedAssumeRoleArn = await resolveAssumeRoleArnForLambda(options.assumeRole, stateForRoleHint, stateProvider, lambda.logicalId);
|
|
@@ -13228,7 +13622,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13228
13622
|
AWS_LAMBDA_FUNCTION_VERSION: "$LATEST",
|
|
13229
13623
|
AWS_LAMBDA_LOG_GROUP_NAME: `/aws/lambda/${lambda.logicalId}`,
|
|
13230
13624
|
AWS_LAMBDA_LOG_STREAM_NAME: "local",
|
|
13231
|
-
...
|
|
13625
|
+
...dynamic.env
|
|
13232
13626
|
};
|
|
13233
13627
|
let assumeSucceeded = false;
|
|
13234
13628
|
if (resolvedAssumeRoleArn) {
|
|
@@ -13264,7 +13658,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
|
|
|
13264
13658
|
}
|
|
13265
13659
|
return {
|
|
13266
13660
|
env: dockerEnv,
|
|
13267
|
-
sensitiveEnvKeys: stateAudit?.sensitiveKeys ?? [],
|
|
13661
|
+
sensitiveEnvKeys: [.../* @__PURE__ */ new Set([...stateAudit?.sensitiveKeys ?? [], ...dynamic.resolvedKeys])],
|
|
13268
13662
|
...stateForRoleHint !== void 0 && { stateForRoleHint },
|
|
13269
13663
|
assumeRoleApplied: assumeSucceeded
|
|
13270
13664
|
};
|
|
@@ -14583,13 +14977,28 @@ function findFileAssetByObjectKey$1(fileAssets, hash) {
|
|
|
14583
14977
|
for (const asset of fileAssets.values()) if (Object.values(asset.destinations).some((d) => d.objectKey === zip || d.objectKey.endsWith(`/${zip}`))) return asset;
|
|
14584
14978
|
}
|
|
14585
14979
|
async function buildContainerEnv(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext) {
|
|
14980
|
+
const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
|
|
14981
|
+
try {
|
|
14982
|
+
return await buildContainerEnvWith(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext, dynamicRefs);
|
|
14983
|
+
} finally {
|
|
14984
|
+
dynamicRefs.dispose();
|
|
14985
|
+
}
|
|
14986
|
+
}
|
|
14987
|
+
async function buildContainerEnvWith(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext, dynamicRefs) {
|
|
14586
14988
|
const logger = getLogger();
|
|
14587
|
-
|
|
14989
|
+
const overrides = readEnvOverridesFile$2(options.envVars);
|
|
14990
|
+
const cdkPath = readCdkPathOrUndefined(resolved.resource);
|
|
14991
|
+
const overriddenKeys = keysOverriddenBy(resolved.environmentVariables, (env) => resolveEnvVars$1(resolved.logicalId, cdkPath, env, overrides).resolved);
|
|
14992
|
+
let templateEnv = withoutKeys(resolved.environmentVariables, overriddenKeys);
|
|
14588
14993
|
const sensitiveEnvKeys = /* @__PURE__ */ new Set();
|
|
14589
14994
|
if (stateProvider && loaded) {
|
|
14590
14995
|
const subContext = {
|
|
14591
14996
|
resources: imageContext?.stateResources ?? loaded.resources,
|
|
14592
|
-
consumerRegion: loaded.region
|
|
14997
|
+
consumerRegion: loaded.region,
|
|
14998
|
+
resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
|
|
14999
|
+
region: producerRegion,
|
|
15000
|
+
consumer: `AgentCore Runtime ${resolved.logicalId} cross-stack env value`
|
|
15001
|
+
})
|
|
14593
15002
|
};
|
|
14594
15003
|
const pseudo = imageContext?.pseudoParameters ?? derivePseudoParametersFromRegion(loaded.region);
|
|
14595
15004
|
if (pseudo) subContext.pseudoParameters = pseudo;
|
|
@@ -14603,14 +15012,21 @@ async function buildContainerEnv(resolved, options, profileCredentials, profileC
|
|
|
14603
15012
|
for (const key of audit.sensitiveKeys) sensitiveEnvKeys.add(key);
|
|
14604
15013
|
for (const { key, reason } of audit.unresolved) logger.warn(`${stateProvider.label}: could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
|
|
14605
15014
|
}
|
|
14606
|
-
const overrides = readEnvOverridesFile$2(options.envVars);
|
|
14607
|
-
const cdkPath = readCdkPathOrUndefined(resolved.resource);
|
|
14608
15015
|
const envResult = resolveEnvVars$1(resolved.logicalId, cdkPath, templateEnv, overrides);
|
|
14609
15016
|
for (const key of envResult.unresolved) {
|
|
14610
15017
|
const overrideKeyExample = cdkPath?.replace(/\/Resource$/, "") ?? resolved.logicalId;
|
|
14611
15018
|
logger.warn(`Environment variable ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}), or pass a state-source flag (e.g. --from-cfn-stack) to recover deployed values.`);
|
|
14612
15019
|
}
|
|
14613
|
-
const
|
|
15020
|
+
const skipKeys = keysNotFromTemplate(templateEnv, envResult.resolved);
|
|
15021
|
+
for (const key of sensitiveEnvKeys) skipKeys.add(key);
|
|
15022
|
+
const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
|
|
15023
|
+
region: firstUsableRegion(loaded?.region, options.stackRegion, resolved.stack.region, options.region),
|
|
15024
|
+
label: `AgentCore Runtime ${resolved.logicalId}`,
|
|
15025
|
+
skipKeys,
|
|
15026
|
+
resolver: dynamicRefs
|
|
15027
|
+
});
|
|
15028
|
+
for (const key of dynamic.resolvedKeys) sensitiveEnvKeys.add(key);
|
|
15029
|
+
const dockerEnv = { ...dynamic.env };
|
|
14614
15030
|
const assumeRoleArn = await resolveAssumeRoleArn(options, resolved, loaded, stateProvider);
|
|
14615
15031
|
await applyAgentCoreCredentialEnv(dockerEnv, {
|
|
14616
15032
|
...assumeRoleArn !== void 0 && { assumeRoleArn },
|
|
@@ -15588,13 +16004,27 @@ async function runEcsTask(task, options, state) {
|
|
|
15588
16004
|
const startOrder = topoSort(buildDependencyGraph(task.containers), task.containers);
|
|
15589
16005
|
const finchRefusals = [];
|
|
15590
16006
|
for (const c of task.containers) {
|
|
15591
|
-
const refusal = finchSecretArgvRefusal([
|
|
16007
|
+
const refusal = finchSecretArgvRefusal([
|
|
16008
|
+
...c.secrets.map((s) => s.name),
|
|
16009
|
+
...c.sensitiveEnvKeys,
|
|
16010
|
+
...dynamicReferenceEnvKeys(c, options.envOverrides)
|
|
16011
|
+
].filter((n) => !isMalformedEnvKey(n) && !isDockerClientEnvKey(n)), {
|
|
15592
16012
|
label: "Container",
|
|
15593
16013
|
name: c.name
|
|
15594
16014
|
});
|
|
15595
16015
|
if (refusal !== void 0) finchRefusals.push(refusal);
|
|
15596
16016
|
}
|
|
15597
16017
|
if (finchRefusals.length > 0) throw new EcsTaskRunnerError(finchRefusals.join("\n"));
|
|
16018
|
+
const argvRefusals = [];
|
|
16019
|
+
for (const c of task.containers) {
|
|
16020
|
+
const fields = [
|
|
16021
|
+
["Command", c.command],
|
|
16022
|
+
["EntryPoint", c.entryPoint],
|
|
16023
|
+
["HealthCheck.Command", c.healthCheck?.command]
|
|
16024
|
+
];
|
|
16025
|
+
for (const [field, argv] of fields) if (argv?.some((a) => containsDynamicReference(a))) argvRefusals.push(`Container ${displayUntrustedValue(c.name)}: ${field} carries a CloudFormation dynamic reference ({{resolve:...}}). cdk-local resolves dynamic references only in Environment, because resolving one here would put the secret on the docker run argv. Move the value into an Environment variable or a Secrets entry.`);
|
|
16026
|
+
}
|
|
16027
|
+
if (argvRefusals.length > 0) throw new EcsTaskRunnerError(argvRefusals.join("\n"));
|
|
15598
16028
|
const imagePlan = options.imagePlanByContainer ?? /* @__PURE__ */ new Map();
|
|
15599
16029
|
if (!options.imagePlanByContainer) await prepareImages(task, imagePlan, options);
|
|
15600
16030
|
const allSecrets = [];
|
|
@@ -15607,6 +16037,22 @@ async function runEcsTask(task, options, state) {
|
|
|
15607
16037
|
...options.region !== void 0 && { region: options.region },
|
|
15608
16038
|
...options.profile !== void 0 && { profile: options.profile }
|
|
15609
16039
|
}));
|
|
16040
|
+
const dynamicEnvByContainer = /* @__PURE__ */ new Map();
|
|
16041
|
+
const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
|
|
16042
|
+
try {
|
|
16043
|
+
for (const c of task.containers) {
|
|
16044
|
+
const tokenKeys = new Set(dynamicReferenceEnvKeys(c, options.envOverrides));
|
|
16045
|
+
if (tokenKeys.size === 0) continue;
|
|
16046
|
+
dynamicEnvByContainer.set(c.name, await resolveDynamicReferencesInEnv(c.environment, {
|
|
16047
|
+
region: firstUsableRegion(options.stackRegion, task.stack.region, options.region),
|
|
16048
|
+
label: `Container ${c.name}`,
|
|
16049
|
+
skipKeys: new Set(Object.keys(c.environment).filter((k) => !tokenKeys.has(k))),
|
|
16050
|
+
resolver: dynamicRefs
|
|
16051
|
+
}));
|
|
16052
|
+
}
|
|
16053
|
+
} finally {
|
|
16054
|
+
dynamicRefs.dispose();
|
|
16055
|
+
}
|
|
15610
16056
|
if (options.existingNetwork) state.network = {
|
|
15611
16057
|
...options.existingNetwork,
|
|
15612
16058
|
ownedByCaller: true
|
|
@@ -15645,9 +16091,14 @@ async function runEcsTask(task, options, state) {
|
|
|
15645
16091
|
for (const container of task.containers) {
|
|
15646
16092
|
const image = imagePlan.get(container.name);
|
|
15647
16093
|
if (!image) throw new EcsTaskRunnerError(`Internal: no resolved image for container '${container.name}'.`);
|
|
16094
|
+
const dynamic = dynamicEnvByContainer.get(container.name);
|
|
15648
16095
|
const built = buildDockerRunArgs({
|
|
15649
16096
|
task,
|
|
15650
|
-
container
|
|
16097
|
+
container: dynamic && dynamic.resolvedKeys.length > 0 ? {
|
|
16098
|
+
...container,
|
|
16099
|
+
environment: dynamic.env,
|
|
16100
|
+
sensitiveEnvKeys: [...container.sensitiveEnvKeys, ...dynamic.resolvedKeys]
|
|
16101
|
+
} : container,
|
|
15651
16102
|
image,
|
|
15652
16103
|
network: state.network.networkName,
|
|
15653
16104
|
volumeByName,
|
|
@@ -15919,6 +16370,18 @@ async function realizeDockerVolumes(volumes, state) {
|
|
|
15919
16370
|
function randHex(bytes) {
|
|
15920
16371
|
return randomBytes(bytes).toString("hex");
|
|
15921
16372
|
}
|
|
16373
|
+
function overriddenEnvKeys(overrides, containerName) {
|
|
16374
|
+
if (!overrides) return [];
|
|
16375
|
+
return [...Object.keys(overrides["Parameters"] ?? {}), ...Object.keys(overrides[containerName] ?? {})];
|
|
16376
|
+
}
|
|
16377
|
+
function dynamicReferenceEnvKeys(container, overrides) {
|
|
16378
|
+
const skip = /* @__PURE__ */ new Set([
|
|
16379
|
+
...container.sensitiveEnvKeys,
|
|
16380
|
+
...container.secrets.map((s) => s.name),
|
|
16381
|
+
...overriddenEnvKeys(overrides, container.name)
|
|
16382
|
+
]);
|
|
16383
|
+
return Object.keys(container.environment).filter((k) => !skip.has(k) && containsDynamicReference(container.environment[k]));
|
|
16384
|
+
}
|
|
15922
16385
|
function groupSecretsByContainer(resolved) {
|
|
15923
16386
|
const out = /* @__PURE__ */ new Map();
|
|
15924
16387
|
for (const r of resolved) {
|
|
@@ -19395,15 +19858,25 @@ async function resolveServiceAndRunnerOpts(boot, stacks, options, discovery, ski
|
|
|
19395
19858
|
const consumerRegion = options.region ?? process.env["AWS_REGION"] ?? process.env["AWS_DEFAULT_REGION"] ?? service.stack.region ?? "us-east-1";
|
|
19396
19859
|
const resolver = await stateProvider.buildCrossStackResolver(consumerRegion);
|
|
19397
19860
|
if (resolver) {
|
|
19861
|
+
const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
|
|
19398
19862
|
const subContext = {
|
|
19399
19863
|
resources: imageContext?.stateResources ?? {},
|
|
19400
19864
|
...imageContext?.pseudoParameters && { pseudoParameters: imageContext.pseudoParameters },
|
|
19401
19865
|
...imageContext?.stateParameters && { parameters: imageContext.stateParameters },
|
|
19402
19866
|
...imageContext?.stateSensitiveParameters?.length && { sensitiveParameters: new Set(imageContext.stateSensitiveParameters) },
|
|
19403
19867
|
consumerRegion,
|
|
19404
|
-
crossStackResolver: resolver
|
|
19868
|
+
crossStackResolver: resolver,
|
|
19869
|
+
resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
|
|
19870
|
+
region: producerRegion,
|
|
19871
|
+
consumer: `Task ${service.task.taskDefinitionLogicalId} cross-stack env value`,
|
|
19872
|
+
overridable: false
|
|
19873
|
+
})
|
|
19405
19874
|
};
|
|
19406
|
-
|
|
19875
|
+
try {
|
|
19876
|
+
await applyCrossStackResolverToTask(service.task, subContext);
|
|
19877
|
+
} finally {
|
|
19878
|
+
dynamicRefs.dispose();
|
|
19879
|
+
}
|
|
19407
19880
|
}
|
|
19408
19881
|
} else if (!stateProvider && taskNeeds.needsCrossStackResolver) logger.warn("Container Environment / Secrets entries contain Fn::ImportValue / Fn::GetStackOutput intrinsics. Pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to substitute them against deployed state.");
|
|
19409
19882
|
const effectiveAssumeRole = resolveEcsAssumeRoleOption(options);
|
|
@@ -19427,6 +19900,7 @@ async function resolveServiceAndRunnerOpts(boot, stacks, options, discovery, ski
|
|
|
19427
19900
|
detach: true
|
|
19428
19901
|
};
|
|
19429
19902
|
if (envOverrides) taskOpts.envOverrides = envOverrides;
|
|
19903
|
+
if (options.stackRegion) taskOpts.stackRegion = options.stackRegion;
|
|
19430
19904
|
if (assumedCredentials) taskOpts.taskCredentials = assumedCredentials;
|
|
19431
19905
|
if (resolvedRoleArn) taskOpts.taskRoleArn = resolvedRoleArn;
|
|
19432
19906
|
if (options.platform) taskOpts.platformOverride = options.platform;
|
|
@@ -20045,14 +20519,27 @@ async function localRunTaskCommand(target, options, extraStateProviders) {
|
|
|
20045
20519
|
if (stateProvider && taskNeeds.needsCrossStackResolver) {
|
|
20046
20520
|
const consumerRegion = options.region ?? process.env["AWS_REGION"] ?? process.env["AWS_DEFAULT_REGION"] ?? task.stack.region ?? "us-east-1";
|
|
20047
20521
|
const resolver = await stateProvider.buildCrossStackResolver(consumerRegion);
|
|
20048
|
-
if (resolver)
|
|
20049
|
-
|
|
20050
|
-
|
|
20051
|
-
|
|
20052
|
-
|
|
20053
|
-
|
|
20054
|
-
|
|
20055
|
-
|
|
20522
|
+
if (resolver) {
|
|
20523
|
+
const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
|
|
20524
|
+
const subContext = {
|
|
20525
|
+
resources: imageContext?.stateResources ?? {},
|
|
20526
|
+
...imageContext?.pseudoParameters && { pseudoParameters: imageContext.pseudoParameters },
|
|
20527
|
+
...imageContext?.stateParameters && { parameters: imageContext.stateParameters },
|
|
20528
|
+
...imageContext?.stateSensitiveParameters?.length && { sensitiveParameters: new Set(imageContext.stateSensitiveParameters) },
|
|
20529
|
+
consumerRegion,
|
|
20530
|
+
crossStackResolver: resolver,
|
|
20531
|
+
resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
|
|
20532
|
+
region: producerRegion,
|
|
20533
|
+
consumer: `Task ${task.taskDefinitionLogicalId} cross-stack env value`,
|
|
20534
|
+
overridable: false
|
|
20535
|
+
})
|
|
20536
|
+
};
|
|
20537
|
+
try {
|
|
20538
|
+
await applyCrossStackResolverToTask(task, subContext);
|
|
20539
|
+
} finally {
|
|
20540
|
+
dynamicRefs.dispose();
|
|
20541
|
+
}
|
|
20542
|
+
}
|
|
20056
20543
|
} else if (!stateProvider && taskNeeds.needsCrossStackResolver) logger.warn("Container Environment / Secrets entries contain Fn::ImportValue / Fn::GetStackOutput intrinsics. Pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to substitute them against deployed state.");
|
|
20057
20544
|
sigintHandler = () => {
|
|
20058
20545
|
sigintCount += 1;
|
|
@@ -20092,6 +20579,7 @@ async function localRunTaskCommand(target, options, extraStateProviders) {
|
|
|
20092
20579
|
if (resolvedRoleArn) runOpts.taskRoleArn = resolvedRoleArn;
|
|
20093
20580
|
if (options.platform) runOpts.platformOverride = options.platform;
|
|
20094
20581
|
if (options.region) runOpts.region = options.region;
|
|
20582
|
+
if (options.stackRegion) runOpts.stackRegion = options.stackRegion;
|
|
20095
20583
|
if (options.ecrRoleArn) runOpts.ecrRoleArn = options.ecrRoleArn;
|
|
20096
20584
|
if (options.profile) runOpts.profile = options.profile;
|
|
20097
20585
|
const hostPortOverrides = parseHostPortOverrides(options.hostPort);
|
|
@@ -29038,5 +29526,5 @@ function addStudioSpecificOptions(cmd) {
|
|
|
29038
29526
|
}
|
|
29039
29527
|
|
|
29040
29528
|
//#endregion
|
|
29041
|
-
export { applyEdgeResponseResult as $, buildJwksUrlFromIssuer as $n, resolveCfnStackName as $r, buildCloudMapIndex as $t, startAgentCoreHttpServer as A,
|
|
29042
|
-
//# sourceMappingURL=local-studio-
|
|
29529
|
+
export { applyEdgeResponseResult as $, buildJwksUrlFromIssuer as $n, resolveCfnStackName as $r, buildCloudMapIndex as $t, startAgentCoreHttpServer as A, DynamicReferenceResolver as Ai, classifySourceChange as An, ConnectionRegistry as Ar, addRunTaskSpecificOptions as At, idFromArn as B, resolveProfileCredentials as Bi, buildStageMap as Bn, resolveRuntimeFileExtension as Br, resolveEcsAssumeRoleOption as Bt, addListSpecificOptions as C, resolveAgentCoreTarget as Ci, waitForAgentCorePing as Cn, tryParseStatus as Cr, parseLbPortOverrides as Ct, createLocalStartAgentCoreCommand as D, tryResolveImageFnJoin as Di, computeCodeImageTag as Dn, probeHostGatewaySupport as Dr, addStartServiceSpecificOptions as Dt, addStartAgentCoreSpecificOptions as E, substituteImagePlaceholders as Ei, buildAgentCoreCodeImage as En, HOST_GATEWAY_MIN_VERSION as Er, resolveAlbFrontDoor as Et, createLocalStartCloudFrontCommand as F, keysOverriddenBy as Fi, createWatchPredicates as Fn, buildDisconnectEvent as Fr, addImageOverrideOptions as Ft, classifyS3Error as G, filterRoutesByApiIdentifiers as Gn, substituteEnvVarsFromState as Gr, enforceImageOverrideOrphans as Gt, createDeployedKvsDataSource as H, isProxyEnvConfigured as Hi, resolveEnvVars$1 as Hn, EcsTaskResolutionError as Hr, runEcsServiceEmulator as Ht, normalizeKvsFileKeys as I, parseDynamicReference as Ii, resolveApiTargetSubset as In, buildMessageEvent as Ir, buildEcsImageResolutionContext$1 as It, startCloudFrontServer as J, startApiServer as Jn, createLocalStateProvider as Jr, resolveImageOverrides as Jt, createS3OriginReader as K, groupRoutesByServer as Kn, substituteEnvVarsFromStateAsync as Kr, mergeForService as Kt, parseKvsFileOverrides as L, resolveDynamicReferencesInEnv as Li, createAuthorizerCache as Ln, architectureToPlatform as Lr, ecsClusterOption as Lt, startAgentCoreWsBridge as M, deployedFillMayBeSecret as Mi, createLocalInvokeCommand as Mn, handleConnectionsRequest as Mr, MAX_TASKS_SUBNET_RANGE_CAP as Mt, LocalStartCloudFrontError as N, firstUsableRegion as Ni, addStartApiSpecificOptions as Nn, parseConnectionsPath as Nr, addCommonEcsServiceOptions as Nt, buildAgentCoreServeAuthCheck as O, LocalInvokeBuildError as Oi, renderCodeDockerfile as On, resolveHostGatewayExtraHosts as Or, createLocalStartServiceCommand as Ot, addStartCloudFrontSpecificOptions as P, keysNotFromTemplate as Pi, createLocalStartApiCommand as Pn, buildConnectEvent as Pr, addEcsAssumeRoleOptions as Pt, applyEdgeRequestResult as Q, buildCognitoJwksUrl as Qn, resolveCfnRegion as Qr, listPinnedTargets as Qt, parseOriginOverrides as R, withoutKeys as Ri, createFileWatcher as Rn, buildContainerImage as Rr, parseMaxTasks as Rt, StudioEventBus as S, pickAgentCoreCandidateStack as Si, waitForAgentCoreHttpReady as Sn, selectIntegrationResponse as Sr, createLocalStartAlbCommand as St, formatTargetListing as T, formatStateRemedy as Ti, SUPPORTED_CODE_RUNTIMES as Tn, HOST_DOCKER_INTERNAL_GATEWAY as Tr, isApplicationLoadBalancer as Tt, resolveDeployedKvsArnByName as U, availableApiIdentifiers as Un, substituteAgainstState as Ur, ImageOverrideError as Ut, resolveKvsModulesForDistribution as V, buildProxyClientConfig as Vi, materializeLayerFromArn as Vn, resolveRuntimeImage as Vr, resolveSharedSidecarCredentials as Vt, resolveDeployedOriginBucket as W, filterRoutesByApiIdentifier as Wn, substituteAgainstStateAsync as Wr, buildImageOverrideTag as Wt, serveFromStaticOrigin as X, resolveServiceIntegrationParameters as Xn, rejectExplicitCfnStackWithMultipleStacks as Xr, describePinnedImageUri as Xt, resolveErrorResponseCandidates as Y, resolveSelectionExpression as Yn, isCfnFlagPresent as Yr, runImageOverrideBuilds as Yt, serveLambdaUrlOrigin as Z, defaultCredentialsLoader as Zn, resolveCfnFallbackRegion as Zr, isLocalCdkAssetImage as Zt, filterStudioTargetGroups as _, AGENTCORE_AGUI_PROTOCOL as _i, parseSseForJsonRpc as _n, applyAuthorizerOverlay as _r, createCloudFrontModule as _t, createLocalStudioCommand as a, countTargets as ai, attachContainerLogStreamer as an, computeRequestIdentityHash as ar, describeS3OriginDomain as at, renderStudioHtml as b, AGENTCORE_RUNTIME_TYPE as bi, AGENTCORE_SESSION_ID_HEADER as bn, evaluateResponseParameters as br, addAlbSpecificOptions as bt, startStudioProxy as c, discoverWebSocketApis as ci, bridgeAgentCoreWs as cn, invokeTokenAuthorizer as cr, pickFunctionUrlLogicalIdFromOrigin as ct, createStudioDispatcher as d, parseSelectionExpressionPath as di, A2A_PATH as dn, buildCorsConfigByApiId as dr, pickTargetFunctionLogicalId as dt, CfnLocalStateProvider as ei, CloudMapRegistry as en, createJwksCache as er, buildEdgeRequestEvent as et, filterStudioCustomResources as f, webSocketApiMatchesIdentifier as fi, a2aInvokeOnce as fn, buildCorsConfigFromCloudFrontChain as fr, resolveCloudFrontDistribution as ft, annotatePinnedEcsTargets as g, AGENTCORE_A2A_PROTOCOL as gi, mcpInvokeOnce as gn, translateLambdaResponse as gr, stripCloudFrontImport as gt, annotateEcsTaskPinnedTargets as h, resolveLambdaArnIntrinsic as hi, MCP_PROTOCOL_VERSION as hn, matchRoute as hr, runViewerResponse as ht, coerceStopRequest as i, resolveSingleTarget as ii, getContainerNetworkIp as in, buildMethodArn as ir, CLOUDFRONT_DISTRIBUTION_TYPE as it, attachAgentCoreWsBridge as j, containsDynamicReference as ji, addInvokeSpecificOptions as jn, buildMgmtEndpointEnvUrl as jr, createLocalRunTaskCommand as jt, selectServeInboundAuth as k, DynamicReferenceResolutionError as ki, toCmdArgv as kn, bufferToBody as kr, serviceStrategy as kt, relayServeRequest as l, discoverWebSocketApisOrThrow as li, invokeAgentCoreWs as ln, attachAuthorizers as lr, pickKvsLogicalIdFromArn as lt, annotateAlbPinnedBackingServices as m, pickRefLogicalId as mi, MCP_PATH as mn, matchPreflight as mr, runViewerRequest as mt, coerceRunRequest as n, resolveSsmParameters as ni, SOFT_RELOAD_COMPLETION_LOG_SUFFIX as nn, verifyJwtAuthorizer as nr, edgeHeadersToHttp as nt, resolveServeBaseUrl as o, listTargets as oi, addInvokeAgentCoreSpecificOptions as on, evaluateCachedLambdaPolicy as or, extractKvsAssociations as ot, isCustomResourceLambdaTarget as p, discoverRoutes as pi, MCP_CONTAINER_PORT as pn, isFunctionUrlOacFronted as pr, compileCloudFrontFunction as pt, matchBehavior as q, readMtlsMaterialsFromDisk as qn, LocalStateSourceError as qr, parseImageOverrideFlags as qt, coerceServeRequest as r, resolveWatchConfig as ri, setShadowReadyTimeoutMs as rn, verifyJwtViaDiscovery as rr, httpHeadersToEdge as rt, createStudioServeManager as s, availableWebSocketApiIdentifiers as si, createLocalInvokeAgentCoreCommand as sn, invokeRequestAuthorizer as sr, isCloudFrontDistribution as st, addStudioSpecificOptions as t, collectSsmParameterRefs as ti, DEFAULT_SHADOW_READY_TIMEOUT_MS as tn, verifyCognitoJwt as tr, buildEdgeResponseEvent as tt, reinvoke as u, filterWebSocketApisByIdentifiers as ui, A2A_CONTAINER_PORT as un, applyCorsResponseHeaders as ur, pickLambdaEdgeFunctionLogicalId as ut, startStudioServer as v, AGENTCORE_HTTP_PROTOCOL as vi, AGENTCORE_SIGV4_SERVICE as vn, buildHttpApiV2Event as vr, createLocalFileKvsDataSource as vt, createLocalListCommand as w, derivePseudoParametersFromRegion as wi, downloadAndExtractS3Bundle as wn, VtlEvaluationError as wr, resolveAlbTarget as wt, createStudioStore as x, AgentCoreResolutionError as xi, invokeAgentCore as xn, pickResponseTemplate as xr, albStrategy as xt, toStudioTargetGroups as y, AGENTCORE_MCP_PROTOCOL as yi, signAgentCoreInvocation as yn, buildRestV1Event as yr, createUnboundCloudFrontModule as yt, resolveCloudFrontTarget as z, buildStsClientConfig as zi, attachStageContext as zn, resolveRuntimeCodeMountPath as zr, parseRestartPolicy as zt };
|
|
29530
|
+
//# sourceMappingURL=local-studio-CcK2y5Gs.js.map
|