@composurecdk/budgets 0.10.2 → 0.11.0
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 +8 -3
- package/dist/commonjs/budget-builder.d.ts +18 -6
- package/dist/commonjs/budget-builder.d.ts.map +1 -1
- package/dist/commonjs/budget-builder.js +2 -2
- package/dist/commonjs/budget-builder.js.map +1 -1
- package/dist/commonjs/defaults.d.ts +7 -0
- package/dist/commonjs/defaults.d.ts.map +1 -1
- package/dist/commonjs/defaults.js +7 -0
- package/dist/commonjs/defaults.js.map +1 -1
- package/dist/commonjs/email.d.ts +2 -1
- package/dist/commonjs/email.d.ts.map +1 -1
- package/dist/commonjs/email.js.map +1 -1
- package/dist/commonjs/topic-policy.d.ts +7 -11
- package/dist/commonjs/topic-policy.d.ts.map +1 -1
- package/dist/commonjs/topic-policy.js +22 -21
- package/dist/commonjs/topic-policy.js.map +1 -1
- package/dist/esm/budget-builder.d.ts +18 -6
- package/dist/esm/budget-builder.d.ts.map +1 -1
- package/dist/esm/budget-builder.js +2 -2
- package/dist/esm/budget-builder.js.map +1 -1
- package/dist/esm/defaults.d.ts +7 -0
- package/dist/esm/defaults.d.ts.map +1 -1
- package/dist/esm/defaults.js +7 -0
- package/dist/esm/defaults.js.map +1 -1
- package/dist/esm/email.d.ts +2 -1
- package/dist/esm/email.d.ts.map +1 -1
- package/dist/esm/email.js.map +1 -1
- package/dist/esm/topic-policy.d.ts +7 -11
- package/dist/esm/topic-policy.d.ts.map +1 -1
- package/dist/esm/topic-policy.js +22 -21
- package/dist/esm/topic-policy.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
AWS Budgets builder for [ComposureCDK](../../README.md).
|
|
4
4
|
|
|
5
|
-
This package provides a fluent builder for `AWS::Budgets::Budget` with well-architected defaults, percentage-threshold notification helpers, and automatic `
|
|
5
|
+
This package provides a fluent builder for `AWS::Budgets::Budget` with well-architected defaults, percentage-threshold notification helpers, and automatic `budgets.amazonaws.com` publish permission on SNS subscriber topics. It wraps the CDK L1 [CfnBudget](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_budgets.CfnBudget.html) construct — there is no L2 for Budgets.
|
|
6
6
|
|
|
7
7
|
## Budget Builder
|
|
8
8
|
|
|
@@ -77,14 +77,19 @@ Applies the AWS Cost Optimization pillar defaults: `ACTUAL` at 80% and `FORECAST
|
|
|
77
77
|
| `limitUnit` | `"USD"` | Matches the AWS Billing console default. |
|
|
78
78
|
| `recommendedThresholds.actualPercent` | `80` | Early-warning threshold before breach. |
|
|
79
79
|
| `recommendedThresholds.forecastedPercent` | `100` | Trending-over-budget alert for the period. |
|
|
80
|
+
| `topicPolicy` | `true` | Budgets cannot deliver to an SNS topic whose policy does not allow it. |
|
|
80
81
|
|
|
81
82
|
Exported as `BUDGET_DEFAULTS`.
|
|
82
83
|
|
|
83
84
|
## Automatic SNS Topic Policies
|
|
84
85
|
|
|
85
|
-
When at least one notification subscriber is an SNS topic, the builder
|
|
86
|
+
When at least one notification subscriber is an SNS topic, the builder grants `SNS:Publish` to the `budgets.amazonaws.com` service principal. Without that grant, budget notifications to SNS silently fail to deliver — one of the most common footguns when wiring Budgets by hand.
|
|
86
87
|
|
|
87
|
-
The
|
|
88
|
+
The statement is added to the topic's own access policy with `topic.addToResourcePolicy(...)`, next to any statement already there, such as the `enforceSSL` statement [`@composurecdk/sns`](../sns/README.md) adds by default. An SNS topic has exactly one access policy and every `AWS::SNS::TopicPolicy` replaces it, so a second policy resource would race the first. [`topicPolicyConflictPolicy`](../sns/README.md#topic-policy-conflict-policy) catches that at synth.
|
|
89
|
+
|
|
90
|
+
An imported topic (`Topic.fromTopicArn`) is the exception: CDK cannot add to its policy, so the builder creates a standalone `TopicPolicy` granting only the Budgets statement. It replaces whatever policy the topic already has, and the builder emits a synth warning (`@composurecdk/budgets:imported-topic-policy`) saying so. `result.topicPolicies` holds these policies, keyed by the topic's fully-qualified node path (unique within the CDK app); it is empty when every SNS subscriber is a topic created in CDK.
|
|
91
|
+
|
|
92
|
+
To manage the topics' access policies yourself, turn this off with `.topicPolicy(false)`. The builder then adds no statement and creates no policy; Budgets cannot deliver to a topic whose policy does not allow `budgets.amazonaws.com` to publish.
|
|
88
93
|
|
|
89
94
|
## Recommended Alarms
|
|
90
95
|
|
|
@@ -68,6 +68,15 @@ export interface BudgetBuilderProps {
|
|
|
68
68
|
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html
|
|
69
69
|
*/
|
|
70
70
|
recommendedAlarms?: BudgetAlarmConfig | false;
|
|
71
|
+
/**
|
|
72
|
+
* Whether to grant `budgets.amazonaws.com` `SNS:Publish` on the SNS
|
|
73
|
+
* topics this budget notifies. Set to `false` when you manage those
|
|
74
|
+
* topics' access policies yourself; Budgets cannot deliver to a topic
|
|
75
|
+
* whose policy does not allow it.
|
|
76
|
+
*
|
|
77
|
+
* @default true
|
|
78
|
+
*/
|
|
79
|
+
topicPolicy?: boolean;
|
|
71
80
|
}
|
|
72
81
|
/**
|
|
73
82
|
* The build output of an {@link IBudgetBuilder}.
|
|
@@ -76,12 +85,15 @@ export interface BudgetBuilderResult {
|
|
|
76
85
|
/** The `AWS::Budgets::Budget` construct. */
|
|
77
86
|
budget: CfnBudget;
|
|
78
87
|
/**
|
|
79
|
-
* `AWS::SNS::TopicPolicy` constructs created
|
|
80
|
-
*
|
|
81
|
-
* fully-qualified node path.
|
|
82
|
-
* to
|
|
88
|
+
* `AWS::SNS::TopicPolicy` constructs the builder created for imported SNS
|
|
89
|
+
* topics referenced as notification subscribers, keyed by the topic's
|
|
90
|
+
* fully-qualified node path. For a topic created in CDK, the
|
|
91
|
+
* `budgets.amazonaws.com` publish statement is added to the topic's own
|
|
92
|
+
* policy and nothing is created here; see
|
|
93
|
+
* {@link createBudgetsTopicPolicies} for why.
|
|
83
94
|
*
|
|
84
|
-
* `{}` when no SNS
|
|
95
|
+
* `{}` when no imported SNS topics were subscribed, or `topicPolicy` is
|
|
96
|
+
* `false`.
|
|
85
97
|
*/
|
|
86
98
|
topicPolicies: Record<string, TopicPolicy>;
|
|
87
99
|
/**
|
|
@@ -103,7 +115,7 @@ export interface BudgetBuilderResult {
|
|
|
103
115
|
* Wraps the {@link CfnBudget} L1 construct (the CDK does not ship an L2
|
|
104
116
|
* for Budgets) with well-architected defaults, helpers for the
|
|
105
117
|
* percentage-threshold notification shape, and automatic
|
|
106
|
-
* `
|
|
118
|
+
* `budgets.amazonaws.com` publish permission on SNS subscriber topics.
|
|
107
119
|
*
|
|
108
120
|
* The builder can also create the AWS-recommended `EstimatedCharges`
|
|
109
121
|
* billing alarm; opt in via `recommendedAlarms`. For non-`us-east-1`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-builder.d.ts","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAU,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,iBAAiB,EAGvB,MAAM,oBAAoB,CAAC;AAK5B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,SAAS,CAAC,iBAAiB,CAAC;IACxC;;;;;;;;;;;;;;;;;OAiBG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"budget-builder.d.ts","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,7 +90,7 @@ class BudgetBuilder {
|
|
|
90
90
|
target.#customAlarms.push(...this.#customAlarms);
|
|
91
91
|
}
|
|
92
92
|
build(scope, id, context = {}) {
|
|
93
|
-
const { recommendedAlarms: alarmConfig, ...budgetProps } = this.props;
|
|
93
|
+
const { recommendedAlarms: alarmConfig, topicPolicy = defaults_js_1.BUDGET_DEFAULTS.topicPolicy, ...budgetProps } = this.props;
|
|
94
94
|
const budgetType = budgetProps.budgetType ?? defaults_js_1.BUDGET_DEFAULTS.budgetType;
|
|
95
95
|
const timeUnit = budgetProps.timeUnit ?? defaults_js_1.BUDGET_DEFAULTS.timeUnit;
|
|
96
96
|
const requiresLimit = budgetType === "COST" || budgetType === "USAGE";
|
|
@@ -123,7 +123,7 @@ class BudgetBuilder {
|
|
|
123
123
|
...(notificationsWithSubscribers.length > 0 ? { notificationsWithSubscribers } : {}),
|
|
124
124
|
};
|
|
125
125
|
const budget = new aws_budgets_1.CfnBudget(scope, id, cfnProps);
|
|
126
|
-
const topicPolicies = (0, topic_policy_js_1.createBudgetsTopicPolicies)(scope, id, snsTopics);
|
|
126
|
+
const topicPolicies = topicPolicy ? (0, topic_policy_js_1.createBudgetsTopicPolicies)(scope, id, snsTopics) : {};
|
|
127
127
|
const alarms = (0, budget_alarm_builder_js_1.buildBudgetAlarms)(scope, id, { budget }, {
|
|
128
128
|
recommendedAlarms: alarmConfig,
|
|
129
129
|
customAlarms: this.#customAlarms,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-builder.js","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"budget-builder.js","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,13 @@ export declare const BUDGET_DEFAULTS: {
|
|
|
39
39
|
actualPercent: number;
|
|
40
40
|
forecastedPercent: number;
|
|
41
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* Grant `budgets.amazonaws.com` `SNS:Publish` on SNS subscriber topics.
|
|
44
|
+
* Budgets cannot deliver to a topic whose access policy does not allow it.
|
|
45
|
+
*
|
|
46
|
+
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
47
|
+
*/
|
|
48
|
+
topicPolicy: boolean;
|
|
42
49
|
};
|
|
43
50
|
/**
|
|
44
51
|
* ISO 4217 currency codes accepted by AWS Budgets for `COST` budgets'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;OAIG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;;;;;OASG;;;;;
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;OAIG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;;;;;OASG;;;;;IAMH;;;;;OAKG;;CAEJ,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAkCtD,CAAC"}
|
|
@@ -42,6 +42,13 @@ exports.BUDGET_DEFAULTS = {
|
|
|
42
42
|
actualPercent: 80,
|
|
43
43
|
forecastedPercent: 100,
|
|
44
44
|
},
|
|
45
|
+
/**
|
|
46
|
+
* Grant `budgets.amazonaws.com` `SNS:Publish` on SNS subscriber topics.
|
|
47
|
+
* Budgets cannot deliver to a topic whose access policy does not allow it.
|
|
48
|
+
*
|
|
49
|
+
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
50
|
+
*/
|
|
51
|
+
topicPolicy: true,
|
|
45
52
|
};
|
|
46
53
|
/**
|
|
47
54
|
* ISO 4217 currency codes accepted by AWS Budgets for `COST` budgets'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,eAAe,GAAG;IAC7B;;;;OAIG;IACH,UAAU,EAAE,MAAe;IAE3B;;;;;OAKG;IACH,QAAQ,EAAE,SAAkB;IAE5B;;;;;OAKG;IACH,SAAS,EAAE,KAAK;IAEhB;;;;;;;;;OASG;IACH,qBAAqB,EAAE;QACrB,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,GAAG;KACvB;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,eAAe,GAAG;IAC7B;;;;OAIG;IACH,UAAU,EAAE,MAAe;IAE3B;;;;;OAKG;IACH,QAAQ,EAAE,SAAkB;IAE5B;;;;;OAKG;IACH,SAAS,EAAE,KAAK;IAEhB;;;;;;;;;OASG;IACH,qBAAqB,EAAE;QACrB,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,GAAG;KACvB;IAED;;;;;OAKG;IACH,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACU,QAAA,yBAAyB,GAAsB;IAC1D,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC"}
|
package/dist/commonjs/email.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ declare const emailBrand: unique symbol;
|
|
|
4
4
|
* subscriber. Construct via {@link email}; the brand prevents bare
|
|
5
5
|
* strings from being passed where an `Email` is required, ensuring the
|
|
6
6
|
* value has been syntactically validated and length-checked against
|
|
7
|
-
* AWS Budgets' per-subscriber limit.
|
|
7
|
+
* AWS Budgets' per-subscriber limit. A value holding an unresolved CDK token
|
|
8
|
+
* is branded unchecked (ADR-0010 rule 6).
|
|
8
9
|
*/
|
|
9
10
|
export type Email = string & {
|
|
10
11
|
readonly [emailBrand]: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAyB7D,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAI1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":";;AAsCA,sCAEC;AASD,sBAIC;AArDD,iEAAqF;AAcrF;;;;;;;;;;;;;GAaG;AACH,MAAM,KAAK,GAAqB;IAC9B,IAAI,EAAE,0BAA0B;IAChC,OAAO,EAAE,mCAAmC;IAC5C,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,+CAA+C;IACxD,MAAM,EACJ,iGAAiG;CACpG,CAAC;AAEF,4FAA4F;AAC5F,SAAgB,aAAa,CAAC,KAAa;IACzC,IAAA,+BAAc,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,KAAK,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,OAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { type ITopic, TopicPolicy } from "aws-cdk-lib/aws-sns";
|
|
2
2
|
import type { IConstruct } from "constructs";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Grant the AWS Budgets service principal (`budgets.amazonaws.com`)
|
|
5
|
+
* permission to publish to each of the supplied topics, by adding the
|
|
6
|
+
* statement to each topic's own access policy.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Each topic gets its own `TopicPolicy` construct, keyed by the topic's
|
|
14
|
-
* fully-qualified CDK node path, so callers can inspect or extend them
|
|
15
|
-
* via the build result.
|
|
8
|
+
* Returns the `TopicPolicy` constructs this creates, keyed by the topic's
|
|
9
|
+
* fully-qualified CDK node path. Only an imported topic, whose policy CDK
|
|
10
|
+
* cannot add to, gets one: a standalone policy granting just this statement.
|
|
11
|
+
* The package README's "Automatic SNS Topic Policies" section explains why.
|
|
16
12
|
*
|
|
17
13
|
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
18
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-policy.d.ts","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"topic-policy.d.ts","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA+B7B"}
|
|
@@ -1,44 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createBudgetsTopicPolicies = createBudgetsTopicPolicies;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
4
5
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
5
6
|
const aws_sns_1 = require("aws-cdk-lib/aws-sns");
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Grant the AWS Budgets service principal (`budgets.amazonaws.com`)
|
|
9
|
+
* permission to publish to each of the supplied topics, by adding the
|
|
10
|
+
* statement to each topic's own access policy.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* Each topic gets its own `TopicPolicy` construct, keyed by the topic's
|
|
17
|
-
* fully-qualified CDK node path, so callers can inspect or extend them
|
|
18
|
-
* via the build result.
|
|
12
|
+
* Returns the `TopicPolicy` constructs this creates, keyed by the topic's
|
|
13
|
+
* fully-qualified CDK node path. Only an imported topic, whose policy CDK
|
|
14
|
+
* cannot add to, gets one: a standalone policy granting just this statement.
|
|
15
|
+
* The package README's "Automatic SNS Topic Policies" section explains why.
|
|
19
16
|
*
|
|
20
17
|
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
21
18
|
*/
|
|
22
19
|
function createBudgetsTopicPolicies(scope, id, topics) {
|
|
23
20
|
const policies = {};
|
|
24
|
-
const seen = new Set();
|
|
25
21
|
for (const topic of topics) {
|
|
26
22
|
const key = topic.node.path;
|
|
27
|
-
if (
|
|
23
|
+
if (key in policies)
|
|
28
24
|
continue;
|
|
29
|
-
|
|
30
|
-
const policy = new aws_sns_1.TopicPolicy(scope, `${id}TopicPolicy${topic.node.addr}`, {
|
|
31
|
-
topics: [topic],
|
|
32
|
-
policyDocument: undefined,
|
|
33
|
-
});
|
|
34
|
-
policy.document.addStatements(new aws_iam_1.PolicyStatement({
|
|
25
|
+
const statement = new aws_iam_1.PolicyStatement({
|
|
35
26
|
sid: "AllowBudgetsPublish",
|
|
36
27
|
effect: aws_iam_1.Effect.ALLOW,
|
|
37
28
|
principals: [new aws_iam_1.ServicePrincipal("budgets.amazonaws.com")],
|
|
38
29
|
actions: ["SNS:Publish"],
|
|
39
30
|
resources: [topic.topicArn],
|
|
40
|
-
})
|
|
41
|
-
|
|
31
|
+
});
|
|
32
|
+
if (!topic.addToResourcePolicy(statement).statementAdded) {
|
|
33
|
+
// The logical id earlier versions gave every Budgets-only policy.
|
|
34
|
+
const policy = new aws_sns_1.TopicPolicy(scope, `${id}TopicPolicy${topic.node.addr}`, {
|
|
35
|
+
topics: [topic],
|
|
36
|
+
});
|
|
37
|
+
policy.document.addStatements(statement);
|
|
38
|
+
aws_cdk_lib_1.Annotations.of(policy).addWarningV2("@composurecdk/budgets:imported-topic-policy", `SNS topic ${key} was not created in this app, so its access policy cannot be added to. ` +
|
|
39
|
+
`This TopicPolicy grants budgets.amazonaws.com SNS:Publish and replaces the topic's ` +
|
|
40
|
+
`existing policy. Set topicPolicy(false) to manage the topic's policy yourself.`);
|
|
41
|
+
policies[key] = policy;
|
|
42
|
+
}
|
|
42
43
|
}
|
|
43
44
|
return policies;
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-policy.js","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"topic-policy.js","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":";;AAiBA,gEAmCC;AApDD,6CAA0C;AAC1C,iDAAgF;AAChF,iDAA+D;AAG/D;;;;;;;;;;;GAWG;AACH,SAAgB,0BAA0B,CACxC,KAAiB,EACjB,EAAU,EACV,MAAgB;IAEhB,MAAM,QAAQ,GAAgC,EAAE,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAG,IAAI,QAAQ;YAAE,SAAS;QAE9B,MAAM,SAAS,GAAG,IAAI,yBAAe,CAAC;YACpC,GAAG,EAAE,qBAAqB;YAC1B,MAAM,EAAE,gBAAM,CAAC,KAAK;YACpB,UAAU,EAAE,CAAC,IAAI,0BAAgB,CAAC,uBAAuB,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;YACzD,kEAAkE;YAClE,MAAM,MAAM,GAAG,IAAI,qBAAW,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;gBAC1E,MAAM,EAAE,CAAC,KAAK,CAAC;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACzC,yBAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,YAAY,CACjC,6CAA6C,EAC7C,aAAa,GAAG,yEAAyE;gBACvF,qFAAqF;gBACrF,gFAAgF,CACnF,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -68,6 +68,15 @@ export interface BudgetBuilderProps {
|
|
|
68
68
|
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html
|
|
69
69
|
*/
|
|
70
70
|
recommendedAlarms?: BudgetAlarmConfig | false;
|
|
71
|
+
/**
|
|
72
|
+
* Whether to grant `budgets.amazonaws.com` `SNS:Publish` on the SNS
|
|
73
|
+
* topics this budget notifies. Set to `false` when you manage those
|
|
74
|
+
* topics' access policies yourself; Budgets cannot deliver to a topic
|
|
75
|
+
* whose policy does not allow it.
|
|
76
|
+
*
|
|
77
|
+
* @default true
|
|
78
|
+
*/
|
|
79
|
+
topicPolicy?: boolean;
|
|
71
80
|
}
|
|
72
81
|
/**
|
|
73
82
|
* The build output of an {@link IBudgetBuilder}.
|
|
@@ -76,12 +85,15 @@ export interface BudgetBuilderResult {
|
|
|
76
85
|
/** The `AWS::Budgets::Budget` construct. */
|
|
77
86
|
budget: CfnBudget;
|
|
78
87
|
/**
|
|
79
|
-
* `AWS::SNS::TopicPolicy` constructs created
|
|
80
|
-
*
|
|
81
|
-
* fully-qualified node path.
|
|
82
|
-
* to
|
|
88
|
+
* `AWS::SNS::TopicPolicy` constructs the builder created for imported SNS
|
|
89
|
+
* topics referenced as notification subscribers, keyed by the topic's
|
|
90
|
+
* fully-qualified node path. For a topic created in CDK, the
|
|
91
|
+
* `budgets.amazonaws.com` publish statement is added to the topic's own
|
|
92
|
+
* policy and nothing is created here; see
|
|
93
|
+
* {@link createBudgetsTopicPolicies} for why.
|
|
83
94
|
*
|
|
84
|
-
* `{}` when no SNS
|
|
95
|
+
* `{}` when no imported SNS topics were subscribed, or `topicPolicy` is
|
|
96
|
+
* `false`.
|
|
85
97
|
*/
|
|
86
98
|
topicPolicies: Record<string, TopicPolicy>;
|
|
87
99
|
/**
|
|
@@ -103,7 +115,7 @@ export interface BudgetBuilderResult {
|
|
|
103
115
|
* Wraps the {@link CfnBudget} L1 construct (the CDK does not ship an L2
|
|
104
116
|
* for Budgets) with well-architected defaults, helpers for the
|
|
105
117
|
* percentage-threshold notification shape, and automatic
|
|
106
|
-
* `
|
|
118
|
+
* `budgets.amazonaws.com` publish permission on SNS subscriber topics.
|
|
107
119
|
*
|
|
108
120
|
* The builder can also create the AWS-recommended `EstimatedCharges`
|
|
109
121
|
* billing alarm; opt in via `recommendedAlarms`. For non-`us-east-1`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-builder.d.ts","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAU,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,iBAAiB,EAGvB,MAAM,oBAAoB,CAAC;AAK5B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,SAAS,CAAC,iBAAiB,CAAC;IACxC;;;;;;;;;;;;;;;;;OAiBG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"budget-builder.d.ts","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,7 +87,7 @@ class BudgetBuilder {
|
|
|
87
87
|
target.#customAlarms.push(...this.#customAlarms);
|
|
88
88
|
}
|
|
89
89
|
build(scope, id, context = {}) {
|
|
90
|
-
const { recommendedAlarms: alarmConfig, ...budgetProps } = this.props;
|
|
90
|
+
const { recommendedAlarms: alarmConfig, topicPolicy = BUDGET_DEFAULTS.topicPolicy, ...budgetProps } = this.props;
|
|
91
91
|
const budgetType = budgetProps.budgetType ?? BUDGET_DEFAULTS.budgetType;
|
|
92
92
|
const timeUnit = budgetProps.timeUnit ?? BUDGET_DEFAULTS.timeUnit;
|
|
93
93
|
const requiresLimit = budgetType === "COST" || budgetType === "USAGE";
|
|
@@ -120,7 +120,7 @@ class BudgetBuilder {
|
|
|
120
120
|
...(notificationsWithSubscribers.length > 0 ? { notificationsWithSubscribers } : {}),
|
|
121
121
|
};
|
|
122
122
|
const budget = new CfnBudget(scope, id, cfnProps);
|
|
123
|
-
const topicPolicies = createBudgetsTopicPolicies(scope, id, snsTopics);
|
|
123
|
+
const topicPolicies = topicPolicy ? createBudgetsTopicPolicies(scope, id, snsTopics) : {};
|
|
124
124
|
const alarms = buildBudgetAlarms(scope, id, { budget }, {
|
|
125
125
|
recommendedAlarms: alarmConfig,
|
|
126
126
|
customAlarms: this.#customAlarms,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-builder.js","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,yBAAyB,CAAC;AAIzE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAiC,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAIL,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,2BAA2B,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"budget-builder.js","sourceRoot":"","sources":["../../src/budget-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/defaults.d.ts
CHANGED
|
@@ -39,6 +39,13 @@ export declare const BUDGET_DEFAULTS: {
|
|
|
39
39
|
actualPercent: number;
|
|
40
40
|
forecastedPercent: number;
|
|
41
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* Grant `budgets.amazonaws.com` `SNS:Publish` on SNS subscriber topics.
|
|
44
|
+
* Budgets cannot deliver to a topic whose access policy does not allow it.
|
|
45
|
+
*
|
|
46
|
+
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
47
|
+
*/
|
|
48
|
+
topicPolicy: boolean;
|
|
42
49
|
};
|
|
43
50
|
/**
|
|
44
51
|
* ISO 4217 currency codes accepted by AWS Budgets for `COST` budgets'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;OAIG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;;;;;OASG;;;;;
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;OAIG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;;;;;OASG;;;;;IAMH;;;;;OAKG;;CAEJ,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAkCtD,CAAC"}
|
package/dist/esm/defaults.js
CHANGED
|
@@ -39,6 +39,13 @@ export const BUDGET_DEFAULTS = {
|
|
|
39
39
|
actualPercent: 80,
|
|
40
40
|
forecastedPercent: 100,
|
|
41
41
|
},
|
|
42
|
+
/**
|
|
43
|
+
* Grant `budgets.amazonaws.com` `SNS:Publish` on SNS subscriber topics.
|
|
44
|
+
* Budgets cannot deliver to a topic whose access policy does not allow it.
|
|
45
|
+
*
|
|
46
|
+
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
47
|
+
*/
|
|
48
|
+
topicPolicy: true,
|
|
42
49
|
};
|
|
43
50
|
/**
|
|
44
51
|
* ISO 4217 currency codes accepted by AWS Budgets for `COST` budgets'
|
package/dist/esm/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;;;;OAIG;IACH,UAAU,EAAE,MAAe;IAE3B;;;;;OAKG;IACH,QAAQ,EAAE,SAAkB;IAE5B;;;;;OAKG;IACH,SAAS,EAAE,KAAK;IAEhB;;;;;;;;;OASG;IACH,qBAAqB,EAAE;QACrB,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,GAAG;KACvB;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;;;;OAIG;IACH,UAAU,EAAE,MAAe;IAE3B;;;;;OAKG;IACH,QAAQ,EAAE,SAAkB;IAE5B;;;;;OAKG;IACH,SAAS,EAAE,KAAK;IAEhB;;;;;;;;;OASG;IACH,qBAAqB,EAAE;QACrB,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,GAAG;KACvB;IAED;;;;;OAKG;IACH,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC"}
|
package/dist/esm/email.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ declare const emailBrand: unique symbol;
|
|
|
4
4
|
* subscriber. Construct via {@link email}; the brand prevents bare
|
|
5
5
|
* strings from being passed where an `Email` is required, ensuring the
|
|
6
6
|
* value has been syntactically validated and length-checked against
|
|
7
|
-
* AWS Budgets' per-subscriber limit.
|
|
7
|
+
* AWS Budgets' per-subscriber limit. A value holding an unresolved CDK token
|
|
8
|
+
* is branded unchecked (ADR-0010 rule 6).
|
|
8
9
|
*/
|
|
9
10
|
export type Email = string & {
|
|
10
11
|
readonly [emailBrand]: true;
|
package/dist/esm/email.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAyB7D,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAI1C"}
|
package/dist/esm/email.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,cAAc,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAcrF;;;;;;;;;;;;;GAaG;AACH,MAAM,KAAK,GAAqB;IAC9B,IAAI,EAAE,0BAA0B;IAChC,OAAO,EAAE,mCAAmC;IAC5C,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,+CAA+C;IACxD,MAAM,EACJ,iGAAiG;CACpG,CAAC;AAEF,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,OAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { type ITopic, TopicPolicy } from "aws-cdk-lib/aws-sns";
|
|
2
2
|
import type { IConstruct } from "constructs";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Grant the AWS Budgets service principal (`budgets.amazonaws.com`)
|
|
5
|
+
* permission to publish to each of the supplied topics, by adding the
|
|
6
|
+
* statement to each topic's own access policy.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Each topic gets its own `TopicPolicy` construct, keyed by the topic's
|
|
14
|
-
* fully-qualified CDK node path, so callers can inspect or extend them
|
|
15
|
-
* via the build result.
|
|
8
|
+
* Returns the `TopicPolicy` constructs this creates, keyed by the topic's
|
|
9
|
+
* fully-qualified CDK node path. Only an imported topic, whose policy CDK
|
|
10
|
+
* cannot add to, gets one: a standalone policy granting just this statement.
|
|
11
|
+
* The package README's "Automatic SNS Topic Policies" section explains why.
|
|
16
12
|
*
|
|
17
13
|
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
18
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-policy.d.ts","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"topic-policy.d.ts","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA+B7B"}
|
package/dist/esm/topic-policy.js
CHANGED
|
@@ -1,41 +1,42 @@
|
|
|
1
|
+
import { Annotations } from "aws-cdk-lib";
|
|
1
2
|
import { Effect, PolicyStatement, ServicePrincipal } from "aws-cdk-lib/aws-iam";
|
|
2
3
|
import { TopicPolicy } from "aws-cdk-lib/aws-sns";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Grant the AWS Budgets service principal (`budgets.amazonaws.com`)
|
|
6
|
+
* permission to publish to each of the supplied topics, by adding the
|
|
7
|
+
* statement to each topic's own access policy.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Each topic gets its own `TopicPolicy` construct, keyed by the topic's
|
|
14
|
-
* fully-qualified CDK node path, so callers can inspect or extend them
|
|
15
|
-
* via the build result.
|
|
9
|
+
* Returns the `TopicPolicy` constructs this creates, keyed by the topic's
|
|
10
|
+
* fully-qualified CDK node path. Only an imported topic, whose policy CDK
|
|
11
|
+
* cannot add to, gets one: a standalone policy granting just this statement.
|
|
12
|
+
* The package README's "Automatic SNS Topic Policies" section explains why.
|
|
16
13
|
*
|
|
17
14
|
* @see https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
|
|
18
15
|
*/
|
|
19
16
|
export function createBudgetsTopicPolicies(scope, id, topics) {
|
|
20
17
|
const policies = {};
|
|
21
|
-
const seen = new Set();
|
|
22
18
|
for (const topic of topics) {
|
|
23
19
|
const key = topic.node.path;
|
|
24
|
-
if (
|
|
20
|
+
if (key in policies)
|
|
25
21
|
continue;
|
|
26
|
-
|
|
27
|
-
const policy = new TopicPolicy(scope, `${id}TopicPolicy${topic.node.addr}`, {
|
|
28
|
-
topics: [topic],
|
|
29
|
-
policyDocument: undefined,
|
|
30
|
-
});
|
|
31
|
-
policy.document.addStatements(new PolicyStatement({
|
|
22
|
+
const statement = new PolicyStatement({
|
|
32
23
|
sid: "AllowBudgetsPublish",
|
|
33
24
|
effect: Effect.ALLOW,
|
|
34
25
|
principals: [new ServicePrincipal("budgets.amazonaws.com")],
|
|
35
26
|
actions: ["SNS:Publish"],
|
|
36
27
|
resources: [topic.topicArn],
|
|
37
|
-
})
|
|
38
|
-
|
|
28
|
+
});
|
|
29
|
+
if (!topic.addToResourcePolicy(statement).statementAdded) {
|
|
30
|
+
// The logical id earlier versions gave every Budgets-only policy.
|
|
31
|
+
const policy = new TopicPolicy(scope, `${id}TopicPolicy${topic.node.addr}`, {
|
|
32
|
+
topics: [topic],
|
|
33
|
+
});
|
|
34
|
+
policy.document.addStatements(statement);
|
|
35
|
+
Annotations.of(policy).addWarningV2("@composurecdk/budgets:imported-topic-policy", `SNS topic ${key} was not created in this app, so its access policy cannot be added to. ` +
|
|
36
|
+
`This TopicPolicy grants budgets.amazonaws.com SNS:Publish and replaces the topic's ` +
|
|
37
|
+
`existing policy. Set topicPolicy(false) to manage the topic's policy yourself.`);
|
|
38
|
+
policies[key] = policy;
|
|
39
|
+
}
|
|
39
40
|
}
|
|
40
41
|
return policies;
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-policy.js","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAe,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG/D
|
|
1
|
+
{"version":3,"file":"topic-policy.js","sourceRoot":"","sources":["../../src/topic-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAe,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG/D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAiB,EACjB,EAAU,EACV,MAAgB;IAEhB,MAAM,QAAQ,GAAgC,EAAE,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAG,IAAI,QAAQ;YAAE,SAAS;QAE9B,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;YACpC,GAAG,EAAE,qBAAqB;YAC1B,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,UAAU,EAAE,CAAC,IAAI,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;YACzD,kEAAkE;YAClE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;gBAC1E,MAAM,EAAE,CAAC,KAAK,CAAC;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACzC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,YAAY,CACjC,6CAA6C,EAC7C,aAAa,GAAG,yEAAyE;gBACvF,qFAAqF;gBACrF,gFAAgF,CACnF,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@composurecdk/budgets",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Composable AWS Budgets builder with well-architected defaults and automatic SNS topic policies",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"@composurecdk/cloudformation": "^0.
|
|
43
|
-
"@composurecdk/cloudwatch": "^0.
|
|
44
|
-
"@composurecdk/core": "^0.
|
|
42
|
+
"@composurecdk/cloudformation": "^0.11.0",
|
|
43
|
+
"@composurecdk/cloudwatch": "^0.11.0",
|
|
44
|
+
"@composurecdk/core": "^0.11.0",
|
|
45
45
|
"aws-cdk-lib": "^2.93.0",
|
|
46
46
|
"constructs": "^10.0.0"
|
|
47
47
|
},
|