@composurecdk/bedrock 0.10.1 → 0.10.2
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 +110 -17
- package/dist/commonjs/alarm-definition.d.ts +29 -0
- package/dist/commonjs/alarm-definition.d.ts.map +1 -0
- package/dist/commonjs/alarm-definition.js +53 -0
- package/dist/commonjs/alarm-definition.js.map +1 -0
- package/dist/commonjs/application-inference-profile-builder.d.ts +44 -0
- package/dist/commonjs/application-inference-profile-builder.d.ts.map +1 -0
- package/dist/commonjs/application-inference-profile-builder.js +51 -0
- package/dist/commonjs/application-inference-profile-builder.js.map +1 -0
- package/dist/commonjs/grants.d.ts +25 -1
- package/dist/commonjs/grants.d.ts.map +1 -1
- package/dist/commonjs/grants.js +57 -6
- package/dist/commonjs/grants.js.map +1 -1
- package/dist/commonjs/guardrail-alarms.d.ts +40 -0
- package/dist/commonjs/guardrail-alarms.d.ts.map +1 -0
- package/dist/commonjs/guardrail-alarms.js +41 -0
- package/dist/commonjs/guardrail-alarms.js.map +1 -0
- package/dist/commonjs/guardrail-builder.d.ts +70 -0
- package/dist/commonjs/guardrail-builder.d.ts.map +1 -0
- package/dist/commonjs/guardrail-builder.js +78 -0
- package/dist/commonjs/guardrail-builder.js.map +1 -0
- package/dist/commonjs/guardrail-defaults.d.ts +25 -0
- package/dist/commonjs/guardrail-defaults.d.ts.map +1 -0
- package/dist/commonjs/guardrail-defaults.js +30 -0
- package/dist/commonjs/guardrail-defaults.js.map +1 -0
- package/dist/commonjs/index.d.ts +8 -2
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +15 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/inference-profile.d.ts +19 -0
- package/dist/commonjs/inference-profile.d.ts.map +1 -1
- package/dist/commonjs/inference-profile.js.map +1 -1
- package/dist/commonjs/inference-target.d.ts +14 -7
- package/dist/commonjs/inference-target.d.ts.map +1 -1
- package/dist/commonjs/inference-target.js +63 -35
- package/dist/commonjs/inference-target.js.map +1 -1
- package/dist/commonjs/model-alarm-defaults.d.ts.map +1 -1
- package/dist/commonjs/model-alarm-defaults.js +5 -14
- package/dist/commonjs/model-alarm-defaults.js.map +1 -1
- package/dist/commonjs/model-alarms.d.ts +2 -2
- package/dist/commonjs/model-alarms.d.ts.map +1 -1
- package/dist/commonjs/model-alarms.js +35 -58
- package/dist/commonjs/model-alarms.js.map +1 -1
- package/dist/commonjs/model-invocation-logging-alarms.d.ts +42 -0
- package/dist/commonjs/model-invocation-logging-alarms.d.ts.map +1 -0
- package/dist/commonjs/model-invocation-logging-alarms.js +59 -0
- package/dist/commonjs/model-invocation-logging-alarms.js.map +1 -0
- package/dist/commonjs/model-invocation-logging-builder.d.ts +84 -0
- package/dist/commonjs/model-invocation-logging-builder.d.ts.map +1 -0
- package/dist/commonjs/model-invocation-logging-builder.js +135 -0
- package/dist/commonjs/model-invocation-logging-builder.js.map +1 -0
- package/dist/esm/alarm-definition.d.ts +29 -0
- package/dist/esm/alarm-definition.d.ts.map +1 -0
- package/dist/esm/alarm-definition.js +48 -0
- package/dist/esm/alarm-definition.js.map +1 -0
- package/dist/esm/application-inference-profile-builder.d.ts +44 -0
- package/dist/esm/application-inference-profile-builder.d.ts.map +1 -0
- package/dist/esm/application-inference-profile-builder.js +48 -0
- package/dist/esm/application-inference-profile-builder.js.map +1 -0
- package/dist/esm/grants.d.ts +25 -1
- package/dist/esm/grants.d.ts.map +1 -1
- package/dist/esm/grants.js +58 -7
- package/dist/esm/grants.js.map +1 -1
- package/dist/esm/guardrail-alarms.d.ts +40 -0
- package/dist/esm/guardrail-alarms.d.ts.map +1 -0
- package/dist/esm/guardrail-alarms.js +37 -0
- package/dist/esm/guardrail-alarms.js.map +1 -0
- package/dist/esm/guardrail-builder.d.ts +70 -0
- package/dist/esm/guardrail-builder.d.ts.map +1 -0
- package/dist/esm/guardrail-builder.js +75 -0
- package/dist/esm/guardrail-builder.js.map +1 -0
- package/dist/esm/guardrail-defaults.d.ts +25 -0
- package/dist/esm/guardrail-defaults.d.ts.map +1 -0
- package/dist/esm/guardrail-defaults.js +27 -0
- package/dist/esm/guardrail-defaults.js.map +1 -0
- package/dist/esm/index.d.ts +8 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +7 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inference-profile.d.ts +19 -0
- package/dist/esm/inference-profile.d.ts.map +1 -1
- package/dist/esm/inference-profile.js.map +1 -1
- package/dist/esm/inference-target.d.ts +14 -7
- package/dist/esm/inference-target.d.ts.map +1 -1
- package/dist/esm/inference-target.js +62 -35
- package/dist/esm/inference-target.js.map +1 -1
- package/dist/esm/model-alarm-defaults.d.ts.map +1 -1
- package/dist/esm/model-alarm-defaults.js +1 -10
- package/dist/esm/model-alarm-defaults.js.map +1 -1
- package/dist/esm/model-alarms.d.ts +2 -2
- package/dist/esm/model-alarms.d.ts.map +1 -1
- package/dist/esm/model-alarms.js +35 -58
- package/dist/esm/model-alarms.js.map +1 -1
- package/dist/esm/model-invocation-logging-alarms.d.ts +42 -0
- package/dist/esm/model-invocation-logging-alarms.d.ts.map +1 -0
- package/dist/esm/model-invocation-logging-alarms.js +55 -0
- package/dist/esm/model-invocation-logging-alarms.js.map +1 -0
- package/dist/esm/model-invocation-logging-builder.d.ts +84 -0
- package/dist/esm/model-invocation-logging-builder.d.ts.map +1 -0
- package/dist/esm/model-invocation-logging-builder.js +131 -0
- package/dist/esm/model-invocation-logging-builder.js.map +1 -0
- package/package.json +5 -11
|
@@ -2,10 +2,10 @@ import type { FoundationModelIdentifier } from "aws-cdk-lib/aws-bedrock";
|
|
|
2
2
|
import { Metric, type MetricOptions } from "aws-cdk-lib/aws-cloudwatch";
|
|
3
3
|
import type { IConstruct } from "constructs";
|
|
4
4
|
import type { AlarmDefinition } from "@composurecdk/cloudwatch";
|
|
5
|
-
import type { InferenceProfile } from "./inference-profile.js";
|
|
5
|
+
import type { ApplicationInferenceProfile, InferenceProfile } from "./inference-profile.js";
|
|
6
6
|
import type { ModelAlarmConfig } from "./model-alarm-config.js";
|
|
7
7
|
/** A model whose `AWS/Bedrock` metrics an alarm can read. */
|
|
8
|
-
export type ModelAlarmTarget = FoundationModelIdentifier | InferenceProfile;
|
|
8
|
+
export type ModelAlarmTarget = FoundationModelIdentifier | InferenceProfile | ApplicationInferenceProfile;
|
|
9
9
|
/** `AWS/Bedrock` metrics for one model, for alarms added with `addAlarm()`. */
|
|
10
10
|
export interface ModelMetrics {
|
|
11
11
|
/** The `ModelId` dimension value: the model or inference profile id invoked. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-alarms.d.ts","sourceRoot":"","sources":["../../src/model-alarms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"model-alarms.d.ts","sourceRoot":"","sources":["../../src/model-alarms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAOhE,OAAO,KAAK,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GAC1B,yBAAyB,GAAG,gBAAgB,GAAG,2BAA2B,CAAC;AAE7E,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CAC7D;AAID,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,CAanE;AAoFD,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,eAAe,EAAE,CAUnB"}
|
|
@@ -5,12 +5,12 @@ exports.resolveModelAlarmDefinitions = resolveModelAlarmDefinitions;
|
|
|
5
5
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
6
|
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
7
7
|
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
8
|
-
const
|
|
8
|
+
const alarm_definition_js_1 = require("./alarm-definition.js");
|
|
9
9
|
const model_alarm_defaults_js_1 = require("./model-alarm-defaults.js");
|
|
10
10
|
const PERIOD = aws_cdk_lib_1.Duration.minutes(1);
|
|
11
11
|
/** Returns the `AWS/Bedrock` metrics for `target`. */
|
|
12
12
|
function modelMetrics(target) {
|
|
13
|
-
const modelId =
|
|
13
|
+
const modelId = "profileId" in target ? target.profileId : target.modelId;
|
|
14
14
|
return {
|
|
15
15
|
modelId,
|
|
16
16
|
metric: (metricName, options) => new aws_cloudwatch_1.Metric({
|
|
@@ -22,49 +22,38 @@ function modelMetrics(target) {
|
|
|
22
22
|
}),
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
invocationThrottles: {
|
|
27
|
-
metricName: "InvocationThrottles",
|
|
28
|
-
statistic: "Sum",
|
|
29
|
-
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationThrottles,
|
|
30
|
-
describe: (id, t) => `Bedrock is throttling requests to ${id}; the account's quota for the model is exhausted. ` +
|
|
31
|
-
`Threshold: > ${String(t)} per minute.`,
|
|
32
|
-
},
|
|
33
|
-
invocationServerErrors: {
|
|
34
|
-
metricName: "InvocationServerErrors",
|
|
35
|
-
statistic: "Sum",
|
|
36
|
-
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationServerErrors,
|
|
37
|
-
describe: (id, t) => `Bedrock is returning server errors for ${id}. Threshold: > ${String(t)} per minute.`,
|
|
38
|
-
},
|
|
39
|
-
invocationClientErrors: {
|
|
40
|
-
metricName: "InvocationClientErrors",
|
|
41
|
-
statistic: "Sum",
|
|
42
|
-
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationClientErrors,
|
|
43
|
-
describe: (id, t) => `Requests to ${id} are failing with client errors, such as AccessDenied or validation ` +
|
|
44
|
-
`errors. Threshold: > ${String(t)} per minute.`,
|
|
45
|
-
},
|
|
46
|
-
invocationLatency: {
|
|
47
|
-
metricName: "InvocationLatency",
|
|
48
|
-
statistic: "p90",
|
|
49
|
-
describe: (id, t) => `p90 invocation latency for ${id} exceeds ${String(t)} ms.`,
|
|
50
|
-
},
|
|
51
|
-
timeToFirstToken: {
|
|
52
|
-
metricName: "TimeToFirstToken",
|
|
53
|
-
statistic: "p90",
|
|
54
|
-
describe: (id, t) => `p90 time to first token for ${id} exceeds ${String(t)} ms.`,
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
function toDefinition(key, metric, cfg, description) {
|
|
25
|
+
function thresholdAlarms(modelId) {
|
|
58
26
|
return {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
27
|
+
invocationThrottles: {
|
|
28
|
+
metricName: "InvocationThrottles",
|
|
29
|
+
statistic: "Sum",
|
|
30
|
+
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationThrottles,
|
|
31
|
+
describe: (t) => `Bedrock is throttling requests to ${modelId}; the account's quota for the model is ` +
|
|
32
|
+
`exhausted. Threshold: > ${String(t)} per minute.`,
|
|
33
|
+
},
|
|
34
|
+
invocationServerErrors: {
|
|
35
|
+
metricName: "InvocationServerErrors",
|
|
36
|
+
statistic: "Sum",
|
|
37
|
+
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationServerErrors,
|
|
38
|
+
describe: (t) => `Bedrock is returning server errors for ${modelId}. Threshold: > ${String(t)} per minute.`,
|
|
39
|
+
},
|
|
40
|
+
invocationClientErrors: {
|
|
41
|
+
metricName: "InvocationClientErrors",
|
|
42
|
+
statistic: "Sum",
|
|
43
|
+
defaults: model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.invocationClientErrors,
|
|
44
|
+
describe: (t) => `Requests to ${modelId} are failing with client errors, such as AccessDenied or ` +
|
|
45
|
+
`validation errors. Threshold: > ${String(t)} per minute.`,
|
|
46
|
+
},
|
|
47
|
+
invocationLatency: {
|
|
48
|
+
metricName: "InvocationLatency",
|
|
49
|
+
statistic: "p90",
|
|
50
|
+
describe: (t) => `p90 invocation latency for ${modelId} exceeds ${String(t)} ms.`,
|
|
51
|
+
},
|
|
52
|
+
timeToFirstToken: {
|
|
53
|
+
metricName: "TimeToFirstToken",
|
|
54
|
+
statistic: "p90",
|
|
55
|
+
describe: (t) => `p90 time to first token for ${modelId} exceeds ${String(t)} ms.`,
|
|
56
|
+
},
|
|
68
57
|
};
|
|
69
58
|
}
|
|
70
59
|
function quotaAlarm(scope, metrics, config) {
|
|
@@ -89,7 +78,7 @@ function quotaAlarm(scope, metrics, config) {
|
|
|
89
78
|
}
|
|
90
79
|
const cfg = (0, cloudwatch_1.resolveAlarmConfig)({ ...config, threshold: Math.floor(quota * percent) }, { ...model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.optIn, threshold: 0 });
|
|
91
80
|
return [
|
|
92
|
-
toDefinition("estimatedTpmQuotaUsage", metrics.metric("EstimatedTPMQuotaUsage", { statistic: "Maximum" }), cfg, `Estimated token usage for ${metrics.modelId} exceeds ${String(percent * 100)}% of the ` +
|
|
81
|
+
(0, alarm_definition_js_1.toDefinition)("estimatedTpmQuotaUsage", metrics.metric("EstimatedTPMQuotaUsage", { statistic: "Maximum" }), cfg, `Estimated token usage for ${metrics.modelId} exceeds ${String(percent * 100)}% of the ` +
|
|
93
82
|
`${String(quota)} tokens-per-minute quota.`),
|
|
94
83
|
];
|
|
95
84
|
}
|
|
@@ -97,19 +86,7 @@ function quotaAlarm(scope, metrics, config) {
|
|
|
97
86
|
function resolveModelAlarmDefinitions(scope, metrics, config) {
|
|
98
87
|
if (config?.enabled === false)
|
|
99
88
|
return [];
|
|
100
|
-
const definitions =
|
|
101
|
-
const userConfig = config?.[key];
|
|
102
|
-
if (userConfig === false || (userConfig === undefined && !spec.defaults))
|
|
103
|
-
return [];
|
|
104
|
-
if (!spec.defaults && userConfig?.threshold === undefined) {
|
|
105
|
-
throw new Error(`The "${key}" alarm has no default threshold. Supply one, e.g. ` +
|
|
106
|
-
`recommendedAlarms({ ${key}: { threshold: … } }).`);
|
|
107
|
-
}
|
|
108
|
-
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(userConfig, spec.defaults ?? { ...model_alarm_defaults_js_1.MODEL_ALARM_DEFAULTS.optIn, threshold: 0 });
|
|
109
|
-
return [
|
|
110
|
-
toDefinition(key, metrics.metric(spec.metricName, { statistic: spec.statistic }), cfg, spec.describe(metrics.modelId, cfg.threshold)),
|
|
111
|
-
];
|
|
112
|
-
});
|
|
89
|
+
const definitions = (0, alarm_definition_js_1.resolveThresholdAlarms)(thresholdAlarms(metrics.modelId), config, (metricName, statistic) => metrics.metric(metricName, { statistic }));
|
|
113
90
|
return [...definitions, ...quotaAlarm(scope, metrics, config?.estimatedTpmQuotaUsage)];
|
|
114
91
|
}
|
|
115
92
|
//# sourceMappingURL=model-alarms.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-alarms.js","sourceRoot":"","sources":["../../src/model-alarms.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"model-alarms.js","sourceRoot":"","sources":["../../src/model-alarms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AlarmConfig, AlarmConfigDefaults, AlarmDefinition } from "@composurecdk/cloudwatch";
|
|
2
|
+
/**
|
|
3
|
+
* Controls the recommended alarms for model invocation logging. Set an alarm
|
|
4
|
+
* to `false` to disable it, or provide a config to tune it.
|
|
5
|
+
*
|
|
6
|
+
* The delivery metrics are account-wide for the Region, in the `AWS/Bedrock`
|
|
7
|
+
* namespace with no dimensions.
|
|
8
|
+
*
|
|
9
|
+
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/monitoring-runtime-metrics.html
|
|
10
|
+
*/
|
|
11
|
+
export interface ModelInvocationLoggingAlarmConfig {
|
|
12
|
+
/**
|
|
13
|
+
* Master switch: set to `false` to disable all recommended alarms.
|
|
14
|
+
* @default true
|
|
15
|
+
*/
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Alarm when invocation logs fail to reach the log group.
|
|
19
|
+
*
|
|
20
|
+
* Metric: `ModelInvocationLogsCloudWatchDeliveryFailure`, statistic Sum.
|
|
21
|
+
*/
|
|
22
|
+
cloudWatchDeliveryFailure?: AlarmConfig | false;
|
|
23
|
+
/**
|
|
24
|
+
* Alarm when large or binary bodies fail to reach the large-data bucket.
|
|
25
|
+
* Created only when a large-data bucket is configured.
|
|
26
|
+
*
|
|
27
|
+
* Metric: `ModelInvocationLargeDataS3DeliveryFailure`, statistic Sum.
|
|
28
|
+
*/
|
|
29
|
+
largeDataS3DeliveryFailure?: AlarmConfig | false;
|
|
30
|
+
}
|
|
31
|
+
type DeliveryAlarmKey = Exclude<keyof ModelInvocationLoggingAlarmConfig, "enabled">;
|
|
32
|
+
/**
|
|
33
|
+
* Default alarm configuration for model invocation logging. AWS publishes no
|
|
34
|
+
* Bedrock thresholds.
|
|
35
|
+
*
|
|
36
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
37
|
+
*/
|
|
38
|
+
export declare const MODEL_INVOCATION_LOGGING_ALARM_DEFAULTS: Record<DeliveryAlarmKey, AlarmConfigDefaults>;
|
|
39
|
+
/** Resolves the recommended delivery-failure alarms. */
|
|
40
|
+
export declare function resolveModelInvocationLoggingAlarmDefinitions(config: ModelInvocationLoggingAlarmConfig | false | undefined, hasLargeDataBucket: boolean): AlarmDefinition[];
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=model-invocation-logging-alarms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-invocation-logging-alarms.d.ts","sourceRoot":"","sources":["../../src/model-invocation-logging-alarms.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIlG;;;;;;;;GAQG;AACH,MAAM,WAAW,iCAAiC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEhD;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAClD;AAED,KAAK,gBAAgB,GAAG,OAAO,CAAC,MAAM,iCAAiC,EAAE,SAAS,CAAC,CAAC;AAUpF;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,EAAE,MAAM,CAC1D,gBAAgB,EAChB,mBAAmB,CAIpB,CAAC;AAkBF,wDAAwD;AACxD,wBAAgB,6CAA6C,CAC3D,MAAM,EAAE,iCAAiC,GAAG,KAAK,GAAG,SAAS,EAC7D,kBAAkB,EAAE,OAAO,GAC1B,eAAe,EAAE,CA4BnB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODEL_INVOCATION_LOGGING_ALARM_DEFAULTS = void 0;
|
|
4
|
+
exports.resolveModelInvocationLoggingAlarmDefinitions = resolveModelInvocationLoggingAlarmDefinitions;
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
7
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
8
|
+
const alarm_definition_js_1 = require("./alarm-definition.js");
|
|
9
|
+
/** A failed delivery is an invocation missing from the audit record. */
|
|
10
|
+
const ANY_FAILURE = {
|
|
11
|
+
threshold: 0,
|
|
12
|
+
evaluationPeriods: 1,
|
|
13
|
+
datapointsToAlarm: 1,
|
|
14
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Default alarm configuration for model invocation logging. AWS publishes no
|
|
18
|
+
* Bedrock thresholds.
|
|
19
|
+
*
|
|
20
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
21
|
+
*/
|
|
22
|
+
exports.MODEL_INVOCATION_LOGGING_ALARM_DEFAULTS = {
|
|
23
|
+
cloudWatchDeliveryFailure: ANY_FAILURE,
|
|
24
|
+
largeDataS3DeliveryFailure: ANY_FAILURE,
|
|
25
|
+
};
|
|
26
|
+
const DELIVERY_ALARMS = {
|
|
27
|
+
cloudWatchDeliveryFailure: {
|
|
28
|
+
metricName: "ModelInvocationLogsCloudWatchDeliveryFailure",
|
|
29
|
+
destination: "the log group",
|
|
30
|
+
requiresBucket: false,
|
|
31
|
+
},
|
|
32
|
+
largeDataS3DeliveryFailure: {
|
|
33
|
+
metricName: "ModelInvocationLargeDataS3DeliveryFailure",
|
|
34
|
+
destination: "the large-data bucket",
|
|
35
|
+
requiresBucket: true,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
/** Resolves the recommended delivery-failure alarms. */
|
|
39
|
+
function resolveModelInvocationLoggingAlarmDefinitions(config, hasLargeDataBucket) {
|
|
40
|
+
if (config === false || config?.enabled === false)
|
|
41
|
+
return [];
|
|
42
|
+
return Object.entries(DELIVERY_ALARMS).flatMap(([key, spec]) => {
|
|
43
|
+
const userConfig = config?.[key];
|
|
44
|
+
if (userConfig === false || (spec.requiresBucket && !hasLargeDataBucket))
|
|
45
|
+
return [];
|
|
46
|
+
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(userConfig, exports.MODEL_INVOCATION_LOGGING_ALARM_DEFAULTS[key]);
|
|
47
|
+
const metric = new aws_cloudwatch_1.Metric({
|
|
48
|
+
namespace: "AWS/Bedrock",
|
|
49
|
+
metricName: spec.metricName,
|
|
50
|
+
statistic: "Sum",
|
|
51
|
+
period: aws_cdk_lib_1.Duration.minutes(1),
|
|
52
|
+
});
|
|
53
|
+
return [
|
|
54
|
+
(0, alarm_definition_js_1.toDefinition)(key, metric, cfg, `Bedrock model invocation logs are failing to reach ${spec.destination}; ` +
|
|
55
|
+
`invocations are missing from the audit record. Threshold: > ${String(cfg.threshold)} per minute.`),
|
|
56
|
+
];
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=model-invocation-logging-alarms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-invocation-logging-alarms.js","sourceRoot":"","sources":["../../src/model-invocation-logging-alarms.ts"],"names":[],"mappings":";;;AA+EA,sGA+BC;AA9GD,6CAAuC;AACvC,+DAAsE;AAEtE,yDAA8D;AAC9D,+DAAqD;AAoCrD,wEAAwE;AACxE,MAAM,WAAW,GAAwB;IACvC,SAAS,EAAE,CAAC;IACZ,iBAAiB,EAAE,CAAC;IACpB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;CACjD,CAAC;AAEF;;;;;GAKG;AACU,QAAA,uCAAuC,GAGhD;IACF,yBAAyB,EAAE,WAAW;IACtC,0BAA0B,EAAE,WAAW;CACxC,CAAC;AAEF,MAAM,eAAe,GAGjB;IACF,yBAAyB,EAAE;QACzB,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,eAAe;QAC5B,cAAc,EAAE,KAAK;KACtB;IACD,0BAA0B,EAAE;QAC1B,UAAU,EAAE,2CAA2C;QACvD,WAAW,EAAE,uBAAuB;QACpC,cAAc,EAAE,IAAI;KACrB;CACF,CAAC;AAEF,wDAAwD;AACxD,SAAgB,6CAA6C,CAC3D,MAA6D,EAC7D,kBAA2B;IAE3B,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAE7D,OACE,MAAM,CAAC,OAAO,CAAC,eAAe,CAI/B,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,kBAAkB,CAAC;YAAE,OAAO,EAAE,CAAC;QACpF,MAAM,GAAG,GAAG,IAAA,+BAAkB,EAAC,UAAU,EAAE,+CAAuC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,IAAI,uBAAM,CAAC;YACxB,SAAS,EAAE,aAAa;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,sBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;SAC5B,CAAC,CAAC;QACH,OAAO;YACL,IAAA,kCAAY,EACV,GAAG,EACH,MAAM,EACN,GAAG,EACH,sDAAsD,IAAI,CAAC,WAAW,IAAI;gBACxE,+DAA+D,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CACrG;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Alarm } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import { type IRole } from "aws-cdk-lib/aws-iam";
|
|
3
|
+
import type { ILogGroup } from "aws-cdk-lib/aws-logs";
|
|
4
|
+
import type { IBucket } from "aws-cdk-lib/aws-s3";
|
|
5
|
+
import { type AwsCustomResource } from "aws-cdk-lib/custom-resources";
|
|
6
|
+
import type { IConstruct } from "constructs";
|
|
7
|
+
import { type Lifecycle, type Resolvable } from "@composurecdk/core";
|
|
8
|
+
import { type ITaggedBuilder } from "@composurecdk/cloudformation";
|
|
9
|
+
import { type ILogGroupBuilder } from "@composurecdk/logs";
|
|
10
|
+
import { type ModelInvocationLoggingAlarmConfig } from "./model-invocation-logging-alarms.js";
|
|
11
|
+
/** Which request and response modalities are logged. */
|
|
12
|
+
export interface ModelInvocationLoggingModalities {
|
|
13
|
+
textDataDeliveryEnabled?: boolean;
|
|
14
|
+
imageDataDeliveryEnabled?: boolean;
|
|
15
|
+
embeddingDataDeliveryEnabled?: boolean;
|
|
16
|
+
videoDataDeliveryEnabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Configuration properties for {@link createModelInvocationLoggingBuilder}. */
|
|
19
|
+
export interface ModelInvocationLoggingBuilderProps extends ModelInvocationLoggingModalities {
|
|
20
|
+
/** The log group the builder creates, from `@composurecdk/logs`' defaults. */
|
|
21
|
+
logGroup?: {
|
|
22
|
+
/** Customises the log group sub-builder. */
|
|
23
|
+
configure?: (builder: ILogGroupBuilder) => ILogGroupBuilder;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Receives bodies over 100 KB and binary data, such as images, which
|
|
27
|
+
* CloudWatch Logs cannot hold; without it, those bodies are not logged. The
|
|
28
|
+
* builder adds the bucket and key policy statements Bedrock needs to write.
|
|
29
|
+
*/
|
|
30
|
+
largeDataBucket?: Resolvable<IBucket>;
|
|
31
|
+
/** Key prefix within {@link largeDataBucket}. */
|
|
32
|
+
largeDataKeyPrefix?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for the recommended delivery-failure alarms. Set to
|
|
35
|
+
* `false` to disable them.
|
|
36
|
+
*/
|
|
37
|
+
recommendedAlarms?: ModelInvocationLoggingAlarmConfig | false;
|
|
38
|
+
}
|
|
39
|
+
/** The build output of an {@link IModelInvocationLoggingBuilder}. */
|
|
40
|
+
export interface ModelInvocationLoggingBuilderResult {
|
|
41
|
+
/** The log group invocation logs are delivered to. */
|
|
42
|
+
logGroup: ILogGroup;
|
|
43
|
+
/** The role Bedrock assumes to write to {@link logGroup}. */
|
|
44
|
+
role: IRole;
|
|
45
|
+
/** The custom resource that applies the account's logging configuration. */
|
|
46
|
+
configuration: AwsCustomResource;
|
|
47
|
+
/** The CloudWatch alarms created, keyed by alarm key. */
|
|
48
|
+
alarms: Record<string, Alarm>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A fluent builder for Amazon Bedrock model invocation logging.
|
|
52
|
+
*
|
|
53
|
+
* @see {@link createModelInvocationLoggingBuilder}
|
|
54
|
+
*/
|
|
55
|
+
export type IModelInvocationLoggingBuilder = ITaggedBuilder<ModelInvocationLoggingBuilderProps, ModelInvocationLoggingBuilder>;
|
|
56
|
+
/**
|
|
57
|
+
* Every modality is logged, so the record covers every invocation.
|
|
58
|
+
*
|
|
59
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
60
|
+
*/
|
|
61
|
+
export declare const MODEL_INVOCATION_LOGGING_DEFAULTS: Required<ModelInvocationLoggingModalities>;
|
|
62
|
+
declare class ModelInvocationLoggingBuilder implements Lifecycle<ModelInvocationLoggingBuilderResult> {
|
|
63
|
+
props: Partial<ModelInvocationLoggingBuilderProps>;
|
|
64
|
+
build(scope: IConstruct, id: string, context?: Record<string, object>): ModelInvocationLoggingBuilderResult;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates a builder that turns on Amazon Bedrock model invocation logging for
|
|
68
|
+
* the account in the stack's Region, delivering to a log group it creates.
|
|
69
|
+
*
|
|
70
|
+
* Account-wide per Region: build it once. A second one overwrites the first,
|
|
71
|
+
* and deleting either stack turns logging off.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* createModelInvocationLoggingBuilder()
|
|
76
|
+
* .largeDataBucket(ref("audit", (r: BucketBuilderResult) => r.bucket));
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html
|
|
80
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
81
|
+
*/
|
|
82
|
+
export declare function createModelInvocationLoggingBuilder(): IModelInvocationLoggingBuilder;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=model-invocation-logging-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-invocation-logging-builder.d.ts","sourceRoot":"","sources":["../../src/model-invocation-logging-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,KAAK,KAAK,EAAqC,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,iBAAiB,EAAsB,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAIlF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,KAAK,iCAAiC,EAEvC,MAAM,sCAAsC,CAAC;AAE9C,wDAAwD;AACxD,MAAM,WAAW,gCAAgC;IAC/C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,gFAAgF;AAChF,MAAM,WAAW,kCAAmC,SAAQ,gCAAgC;IAC1F,8EAA8E;IAC9E,QAAQ,CAAC,EAAE;QACT,4CAA4C;QAC5C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;KAC7D,CAAC;IAEF;;;;OAIG;IACH,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAEtC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iCAAiC,GAAG,KAAK,CAAC;CAC/D;AAED,qEAAqE;AACrE,MAAM,WAAW,mCAAmC;IAClD,sDAAsD;IACtD,QAAQ,EAAE,SAAS,CAAC;IACpB,6DAA6D;IAC7D,IAAI,EAAE,KAAK,CAAC;IACZ,4EAA4E;IAC5E,aAAa,EAAE,iBAAiB,CAAC;IACjC,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,8BAA8B,GAAG,cAAc,CACzD,kCAAkC,EAClC,6BAA6B,CAC9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CAAC,gCAAgC,CAKxF,CAAC;AAuCF,cAAM,6BAA8B,YAAW,SAAS,CAAC,mCAAmC,CAAC;IAC3F,KAAK,EAAE,OAAO,CAAC,kCAAkC,CAAC,CAAM;IAExD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,mCAAmC;CAsFvC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mCAAmC,IAAI,8BAA8B,CAIpF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODEL_INVOCATION_LOGGING_DEFAULTS = void 0;
|
|
4
|
+
exports.createModelInvocationLoggingBuilder = createModelInvocationLoggingBuilder;
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
7
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
8
|
+
const core_1 = require("@composurecdk/core");
|
|
9
|
+
const cloudformation_1 = require("@composurecdk/cloudformation");
|
|
10
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
11
|
+
const custom_resources_2 = require("@composurecdk/custom-resources");
|
|
12
|
+
const iam_1 = require("@composurecdk/iam");
|
|
13
|
+
const logs_1 = require("@composurecdk/logs");
|
|
14
|
+
const model_invocation_logging_alarms_js_1 = require("./model-invocation-logging-alarms.js");
|
|
15
|
+
/**
|
|
16
|
+
* Every modality is logged, so the record covers every invocation.
|
|
17
|
+
*
|
|
18
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
19
|
+
*/
|
|
20
|
+
exports.MODEL_INVOCATION_LOGGING_DEFAULTS = {
|
|
21
|
+
textDataDeliveryEnabled: true,
|
|
22
|
+
imageDataDeliveryEnabled: true,
|
|
23
|
+
embeddingDataDeliveryEnabled: true,
|
|
24
|
+
videoDataDeliveryEnabled: true,
|
|
25
|
+
};
|
|
26
|
+
/** The stream Bedrock writes to within the log group. */
|
|
27
|
+
const LOG_STREAM = "aws/bedrock/modelinvocations";
|
|
28
|
+
/** Bedrock, trusted only for this account and Region (confused-deputy guard). */
|
|
29
|
+
function bedrockPrincipal(stack) {
|
|
30
|
+
return new aws_iam_1.ServicePrincipal("bedrock.amazonaws.com", {
|
|
31
|
+
conditions: {
|
|
32
|
+
StringEquals: { "aws:SourceAccount": stack.account },
|
|
33
|
+
ArnLike: {
|
|
34
|
+
"aws:SourceArn": stack.formatArn({
|
|
35
|
+
service: "bedrock",
|
|
36
|
+
resource: "*",
|
|
37
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.NO_RESOURCE_NAME,
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Lets Bedrock write large-data objects into `bucket`. */
|
|
44
|
+
function grantLargeDataWrite(bucket, bedrock, keyPrefix, account) {
|
|
45
|
+
const prefix = keyPrefix ? `${keyPrefix}/` : "";
|
|
46
|
+
bucket.addToResourcePolicy(new aws_iam_1.PolicyStatement({
|
|
47
|
+
principals: [bedrock],
|
|
48
|
+
actions: ["s3:PutObject"],
|
|
49
|
+
resources: [bucket.arnForObjects(`${prefix}AWSLogs/${account}/BedrockModelInvocationLogs/*`)],
|
|
50
|
+
}));
|
|
51
|
+
bucket.encryptionKey?.grant(bedrock, "kms:GenerateDataKey");
|
|
52
|
+
}
|
|
53
|
+
class ModelInvocationLoggingBuilder {
|
|
54
|
+
props = {};
|
|
55
|
+
build(scope, id, context = {}) {
|
|
56
|
+
const { logGroup: logGroupConfig, largeDataBucket, largeDataKeyPrefix, recommendedAlarms, ...modalities } = this.props;
|
|
57
|
+
const stack = aws_cdk_lib_1.Stack.of(scope);
|
|
58
|
+
const bedrock = bedrockPrincipal(stack);
|
|
59
|
+
const logGroupBuilder = (0, logs_1.createLogGroupBuilder)();
|
|
60
|
+
const logGroup = (logGroupConfig?.configure?.(logGroupBuilder) ?? logGroupBuilder).build(scope, `${id}LogGroup`, context).logGroup;
|
|
61
|
+
const role = (0, iam_1.createRoleBuilder)()
|
|
62
|
+
.assumedBy(bedrock)
|
|
63
|
+
.addInlinePolicyStatements("ModelInvocationLogsWriter", [
|
|
64
|
+
new aws_iam_1.PolicyStatement({
|
|
65
|
+
actions: ["logs:CreateLogStream", "logs:PutLogEvents"],
|
|
66
|
+
resources: [
|
|
67
|
+
stack.formatArn({
|
|
68
|
+
service: "logs",
|
|
69
|
+
resource: "log-group",
|
|
70
|
+
resourceName: `${logGroup.logGroupName}:log-stream:${LOG_STREAM}`,
|
|
71
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
72
|
+
}),
|
|
73
|
+
],
|
|
74
|
+
}),
|
|
75
|
+
])
|
|
76
|
+
.build(scope, `${id}Role`, context).role;
|
|
77
|
+
const bucket = largeDataBucket === undefined ? undefined : (0, core_1.resolve)(largeDataBucket, context);
|
|
78
|
+
if (bucket)
|
|
79
|
+
grantLargeDataWrite(bucket, bedrock, largeDataKeyPrefix, stack.account);
|
|
80
|
+
const loggingConfig = {
|
|
81
|
+
cloudWatchConfig: {
|
|
82
|
+
logGroupName: logGroup.logGroupName,
|
|
83
|
+
roleArn: role.roleArn,
|
|
84
|
+
...(bucket && {
|
|
85
|
+
largeDataDeliveryS3Config: {
|
|
86
|
+
bucketName: bucket.bucketName,
|
|
87
|
+
...(largeDataKeyPrefix && { keyPrefix: largeDataKeyPrefix }),
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
},
|
|
91
|
+
...exports.MODEL_INVOCATION_LOGGING_DEFAULTS,
|
|
92
|
+
...modalities,
|
|
93
|
+
};
|
|
94
|
+
const configurationBuilder = (0, custom_resources_2.createAwsCustomResourceBuilder)()
|
|
95
|
+
.onUpdate({
|
|
96
|
+
service: "Bedrock",
|
|
97
|
+
action: "PutModelInvocationLoggingConfiguration",
|
|
98
|
+
parameters: { loggingConfig },
|
|
99
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("ModelInvocationLogging"),
|
|
100
|
+
})
|
|
101
|
+
.onDelete({ service: "Bedrock", action: "DeleteModelInvocationLoggingConfiguration" })
|
|
102
|
+
// The configuration is account-wide for the Region; it has no ARN.
|
|
103
|
+
.allow([
|
|
104
|
+
"bedrock:PutModelInvocationLoggingConfiguration",
|
|
105
|
+
"bedrock:DeleteModelInvocationLoggingConfiguration",
|
|
106
|
+
], ["*"])
|
|
107
|
+
.allow(["iam:PassRole"], [role.roleArn])
|
|
108
|
+
.dependsOn(role);
|
|
109
|
+
if (bucket?.policy)
|
|
110
|
+
configurationBuilder.dependsOn(bucket.policy);
|
|
111
|
+
const { customResource: configuration } = configurationBuilder.build(scope, `${id}Configuration`, context);
|
|
112
|
+
const alarms = (0, cloudwatch_1.createAlarms)(scope, id, (0, model_invocation_logging_alarms_js_1.resolveModelInvocationLoggingAlarmDefinitions)(recommendedAlarms, bucket !== undefined));
|
|
113
|
+
return { logGroup, role, configuration, alarms };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Creates a builder that turns on Amazon Bedrock model invocation logging for
|
|
118
|
+
* the account in the stack's Region, delivering to a log group it creates.
|
|
119
|
+
*
|
|
120
|
+
* Account-wide per Region: build it once. A second one overwrites the first,
|
|
121
|
+
* and deleting either stack turns logging off.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* createModelInvocationLoggingBuilder()
|
|
126
|
+
* .largeDataBucket(ref("audit", (r: BucketBuilderResult) => r.bucket));
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html
|
|
130
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp04.html
|
|
131
|
+
*/
|
|
132
|
+
function createModelInvocationLoggingBuilder() {
|
|
133
|
+
return (0, cloudformation_1.taggedBuilder)(ModelInvocationLoggingBuilder);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=model-invocation-logging-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-invocation-logging-builder.js","sourceRoot":"","sources":["../../src/model-invocation-logging-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import type { AlarmConfig, AlarmConfigDefaults, AlarmDefinition, ResolvedAlarmConfig } from "@composurecdk/cloudwatch";
|
|
3
|
+
/**
|
|
4
|
+
* 3 breaching minutes out of 5: SDK retries absorb isolated throttles and
|
|
5
|
+
* transient errors, so a single datapoint is noise. No traffic emits no data.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare const SUSTAINED: {
|
|
9
|
+
evaluationPeriods: number;
|
|
10
|
+
datapointsToAlarm: number;
|
|
11
|
+
treatMissingData: TreatMissingData;
|
|
12
|
+
};
|
|
13
|
+
/** A greater-than alarm definition from a resolved config. @internal */
|
|
14
|
+
export declare function toDefinition(key: string, metric: Metric, cfg: ResolvedAlarmConfig, description: string): AlarmDefinition;
|
|
15
|
+
/** A recommended alarm on one metric. @internal */
|
|
16
|
+
export interface ThresholdAlarmSpec {
|
|
17
|
+
metricName: string;
|
|
18
|
+
statistic: string;
|
|
19
|
+
/** Absent for opt-in alarms, whose threshold the caller must supply. */
|
|
20
|
+
defaults?: AlarmConfigDefaults;
|
|
21
|
+
describe: (threshold: number) => string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolves each spec against the caller's config: on-by-default alarms merge
|
|
25
|
+
* over their defaults, opt-in alarms are created only when configured, with
|
|
26
|
+
* a threshold. @internal
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveThresholdAlarms<K extends string>(specs: Record<K, ThresholdAlarmSpec>, config: Partial<Record<K, AlarmConfig | false>> | undefined, metric: (metricName: string, statistic: string) => Metric): AlarmDefinition[];
|
|
29
|
+
//# sourceMappingURL=alarm-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-definition.d.ts","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;CAIrB,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,mBAAmB,EACxB,WAAW,EAAE,MAAM,GAClB,eAAe,CAYjB;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,kBAAkB,CAAC,EACpC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,GAAG,SAAS,EAC3D,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GACxD,eAAe,EAAE,CAgBnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ComparisonOperator, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import { resolveAlarmConfig } from "@composurecdk/cloudwatch";
|
|
3
|
+
/**
|
|
4
|
+
* 3 breaching minutes out of 5: SDK retries absorb isolated throttles and
|
|
5
|
+
* transient errors, so a single datapoint is noise. No traffic emits no data.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export const SUSTAINED = {
|
|
9
|
+
evaluationPeriods: 5,
|
|
10
|
+
datapointsToAlarm: 3,
|
|
11
|
+
treatMissingData: TreatMissingData.NOT_BREACHING,
|
|
12
|
+
};
|
|
13
|
+
/** A greater-than alarm definition from a resolved config. @internal */
|
|
14
|
+
export function toDefinition(key, metric, cfg, description) {
|
|
15
|
+
return {
|
|
16
|
+
key,
|
|
17
|
+
alarmName: cfg.alarmName,
|
|
18
|
+
metric,
|
|
19
|
+
threshold: cfg.threshold,
|
|
20
|
+
comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
21
|
+
evaluationPeriods: cfg.evaluationPeriods,
|
|
22
|
+
datapointsToAlarm: cfg.datapointsToAlarm,
|
|
23
|
+
treatMissingData: cfg.treatMissingData,
|
|
24
|
+
description,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolves each spec against the caller's config: on-by-default alarms merge
|
|
29
|
+
* over their defaults, opt-in alarms are created only when configured, with
|
|
30
|
+
* a threshold. @internal
|
|
31
|
+
*/
|
|
32
|
+
export function resolveThresholdAlarms(specs, config, metric) {
|
|
33
|
+
return Object.keys(specs).flatMap((key) => {
|
|
34
|
+
const spec = specs[key];
|
|
35
|
+
const userConfig = config?.[key];
|
|
36
|
+
if (userConfig === false || (userConfig === undefined && !spec.defaults))
|
|
37
|
+
return [];
|
|
38
|
+
if (!spec.defaults && userConfig?.threshold === undefined) {
|
|
39
|
+
throw new Error(`The "${key}" alarm has no default threshold. Supply one, e.g. ` +
|
|
40
|
+
`recommendedAlarms({ ${key}: { threshold: … } }).`);
|
|
41
|
+
}
|
|
42
|
+
const cfg = resolveAlarmConfig(userConfig, spec.defaults ?? { ...SUSTAINED, threshold: 0 });
|
|
43
|
+
return [
|
|
44
|
+
toDefinition(key, metric(spec.metricName, spec.statistic), cfg, spec.describe(cfg.threshold)),
|
|
45
|
+
];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=alarm-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAe,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAO/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,iBAAiB,EAAE,CAAC;IACpB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;CACjD,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,MAAc,EACd,GAAwB,EACxB,WAAmB;IAEnB,OAAO;QACL,GAAG;QACH,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM;QACN,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,kBAAkB,EAAE,kBAAkB,CAAC,sBAAsB;QAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,WAAW;KACZ,CAAC;AACJ,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAoC,EACpC,MAA2D,EAC3D,MAAyD;IAEzD,OAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACpF,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,QAAQ,GAAG,qDAAqD;gBAC9D,uBAAuB,GAAG,wBAAwB,CACrD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5F,OAAO;YACL,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAC9F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|