@reyemtech/nimbus 0.1.0 → 1.0.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 +71 -311
- package/dist/cjs/aws/dns.d.ts.map +1 -1
- package/dist/cjs/aws/dns.js +3 -1
- package/dist/cjs/aws/dns.js.map +1 -1
- package/dist/cjs/aws/index.d.ts +1 -0
- package/dist/cjs/aws/index.d.ts.map +1 -1
- package/dist/cjs/aws/index.js +3 -1
- package/dist/cjs/aws/index.js.map +1 -1
- package/dist/cjs/aws/network.d.ts.map +1 -1
- package/dist/cjs/aws/network.js +3 -1
- package/dist/cjs/aws/network.js.map +1 -1
- package/dist/cjs/aws/state.d.ts +32 -0
- package/dist/cjs/aws/state.d.ts.map +1 -0
- package/dist/cjs/aws/state.js +209 -0
- package/dist/cjs/aws/state.js.map +1 -0
- package/dist/cjs/azure/cluster.d.ts.map +1 -1
- package/dist/cjs/azure/cluster.js +15 -5
- package/dist/cjs/azure/cluster.js.map +1 -1
- package/dist/cjs/azure/dns.d.ts.map +1 -1
- package/dist/cjs/azure/dns.js +3 -1
- package/dist/cjs/azure/dns.js.map +1 -1
- package/dist/cjs/azure/index.d.ts +1 -0
- package/dist/cjs/azure/index.d.ts.map +1 -1
- package/dist/cjs/azure/index.js +3 -1
- package/dist/cjs/azure/index.js.map +1 -1
- package/dist/cjs/azure/network.d.ts.map +1 -1
- package/dist/cjs/azure/network.js +9 -3
- package/dist/cjs/azure/network.js.map +1 -1
- package/dist/cjs/azure/secrets.d.ts.map +1 -1
- package/dist/cjs/azure/secrets.js +6 -2
- package/dist/cjs/azure/secrets.js.map +1 -1
- package/dist/cjs/azure/state.d.ts +30 -0
- package/dist/cjs/azure/state.d.ts.map +1 -0
- package/dist/cjs/azure/state.js +115 -0
- package/dist/cjs/azure/state.js.map +1 -0
- package/dist/cjs/cache/interfaces.d.ts +12 -0
- package/dist/cjs/cache/interfaces.d.ts.map +1 -1
- package/dist/cjs/cli/templates.d.ts +67 -0
- package/dist/cjs/cli/templates.d.ts.map +1 -0
- package/dist/cjs/cli/templates.js +752 -0
- package/dist/cjs/cli/templates.js.map +1 -0
- package/dist/cjs/cli.d.ts +15 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +209 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/cluster/interfaces.d.ts +28 -0
- package/dist/cjs/cluster/interfaces.d.ts.map +1 -1
- package/dist/cjs/database/interfaces.d.ts +15 -0
- package/dist/cjs/database/interfaces.d.ts.map +1 -1
- package/dist/cjs/dns/interfaces.d.ts +11 -0
- package/dist/cjs/dns/interfaces.d.ts.map +1 -1
- package/dist/cjs/factories/cluster.d.ts +4 -3
- package/dist/cjs/factories/cluster.d.ts.map +1 -1
- package/dist/cjs/factories/cluster.js +46 -11
- package/dist/cjs/factories/cluster.js.map +1 -1
- package/dist/cjs/factories/dns.d.ts +3 -2
- package/dist/cjs/factories/dns.d.ts.map +1 -1
- package/dist/cjs/factories/dns.js +44 -9
- package/dist/cjs/factories/dns.js.map +1 -1
- package/dist/cjs/factories/index.d.ts +1 -0
- package/dist/cjs/factories/index.d.ts.map +1 -1
- package/dist/cjs/factories/index.js +3 -1
- package/dist/cjs/factories/index.js.map +1 -1
- package/dist/cjs/factories/network.d.ts +4 -3
- package/dist/cjs/factories/network.d.ts.map +1 -1
- package/dist/cjs/factories/network.js +46 -11
- package/dist/cjs/factories/network.js.map +1 -1
- package/dist/cjs/factories/secrets.d.ts +4 -3
- package/dist/cjs/factories/secrets.d.ts.map +1 -1
- package/dist/cjs/factories/secrets.js +45 -10
- package/dist/cjs/factories/secrets.js.map +1 -1
- package/dist/cjs/factories/state.d.ts +33 -0
- package/dist/cjs/factories/state.d.ts.map +1 -0
- package/dist/cjs/factories/state.js +96 -0
- package/dist/cjs/factories/state.js.map +1 -0
- package/dist/cjs/factories/types.d.ts +22 -0
- package/dist/cjs/factories/types.d.ts.map +1 -1
- package/dist/cjs/factories/types.js +18 -0
- package/dist/cjs/factories/types.js.map +1 -1
- package/dist/cjs/global-lb/glb.d.ts.map +1 -1
- package/dist/cjs/global-lb/glb.js +23 -9
- package/dist/cjs/global-lb/glb.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/network/cidr.d.ts +34 -0
- package/dist/cjs/network/cidr.d.ts.map +1 -1
- package/dist/cjs/network/cidr.js +34 -0
- package/dist/cjs/network/cidr.js.map +1 -1
- package/dist/cjs/network/interfaces.d.ts +16 -0
- package/dist/cjs/network/interfaces.d.ts.map +1 -1
- package/dist/cjs/platform/interfaces.d.ts +1 -1
- package/dist/cjs/platform/interfaces.d.ts.map +1 -1
- package/dist/cjs/platform/stack.d.ts.map +1 -1
- package/dist/cjs/platform/stack.js +6 -1
- package/dist/cjs/platform/stack.js.map +1 -1
- package/dist/cjs/queue/interfaces.d.ts +8 -0
- package/dist/cjs/queue/interfaces.d.ts.map +1 -1
- package/dist/cjs/secrets/interfaces.d.ts +5 -0
- package/dist/cjs/secrets/interfaces.d.ts.map +1 -1
- package/dist/cjs/state/index.d.ts +7 -0
- package/dist/cjs/state/index.d.ts.map +1 -0
- package/dist/cjs/state/index.js +8 -0
- package/dist/cjs/state/index.js.map +1 -0
- package/dist/cjs/state/interfaces.d.ts +82 -0
- package/dist/cjs/state/interfaces.d.ts.map +1 -0
- package/dist/cjs/state/interfaces.js +11 -0
- package/dist/cjs/state/interfaces.js.map +1 -0
- package/dist/cjs/storage/interfaces.d.ts +17 -0
- package/dist/cjs/storage/interfaces.d.ts.map +1 -1
- package/dist/cjs/types/cloud-target.d.ts +12 -0
- package/dist/cjs/types/cloud-target.d.ts.map +1 -1
- package/dist/cjs/types/cloud-target.js +12 -0
- package/dist/cjs/types/cloud-target.js.map +1 -1
- package/dist/cjs/types/tags.d.ts +16 -0
- package/dist/cjs/types/tags.d.ts.map +1 -1
- package/dist/cjs/types/tags.js +16 -0
- package/dist/cjs/types/tags.js.map +1 -1
- package/dist/cjs/types/validation.d.ts.map +1 -1
- package/dist/cjs/types/validation.js +14 -11
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +7 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +11 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/provider-loader.d.ts +14 -0
- package/dist/cjs/utils/provider-loader.d.ts.map +1 -0
- package/dist/cjs/utils/provider-loader.js +66 -0
- package/dist/cjs/utils/provider-loader.js.map +1 -0
- package/dist/esm/aws/dns.d.ts.map +1 -1
- package/dist/esm/aws/dns.js +3 -1
- package/dist/esm/aws/dns.js.map +1 -1
- package/dist/esm/aws/index.d.ts +1 -0
- package/dist/esm/aws/index.d.ts.map +1 -1
- package/dist/esm/aws/index.js +3 -1
- package/dist/esm/aws/index.js.map +1 -1
- package/dist/esm/aws/network.d.ts.map +1 -1
- package/dist/esm/aws/network.js +3 -1
- package/dist/esm/aws/network.js.map +1 -1
- package/dist/esm/aws/state.d.ts +32 -0
- package/dist/esm/aws/state.d.ts.map +1 -0
- package/dist/esm/aws/state.js +209 -0
- package/dist/esm/aws/state.js.map +1 -0
- package/dist/esm/azure/cluster.d.ts.map +1 -1
- package/dist/esm/azure/cluster.js +15 -5
- package/dist/esm/azure/cluster.js.map +1 -1
- package/dist/esm/azure/dns.d.ts.map +1 -1
- package/dist/esm/azure/dns.js +3 -1
- package/dist/esm/azure/dns.js.map +1 -1
- package/dist/esm/azure/index.d.ts +1 -0
- package/dist/esm/azure/index.d.ts.map +1 -1
- package/dist/esm/azure/index.js +3 -1
- package/dist/esm/azure/index.js.map +1 -1
- package/dist/esm/azure/network.d.ts.map +1 -1
- package/dist/esm/azure/network.js +9 -3
- package/dist/esm/azure/network.js.map +1 -1
- package/dist/esm/azure/secrets.d.ts.map +1 -1
- package/dist/esm/azure/secrets.js +6 -2
- package/dist/esm/azure/secrets.js.map +1 -1
- package/dist/esm/azure/state.d.ts +30 -0
- package/dist/esm/azure/state.d.ts.map +1 -0
- package/dist/esm/azure/state.js +115 -0
- package/dist/esm/azure/state.js.map +1 -0
- package/dist/esm/cache/interfaces.d.ts +12 -0
- package/dist/esm/cache/interfaces.d.ts.map +1 -1
- package/dist/esm/cli/templates.d.ts +67 -0
- package/dist/esm/cli/templates.d.ts.map +1 -0
- package/dist/esm/cli/templates.js +752 -0
- package/dist/esm/cli/templates.js.map +1 -0
- package/dist/esm/cli.d.ts +15 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +176 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/cluster/interfaces.d.ts +28 -0
- package/dist/esm/cluster/interfaces.d.ts.map +1 -1
- package/dist/esm/database/interfaces.d.ts +15 -0
- package/dist/esm/database/interfaces.d.ts.map +1 -1
- package/dist/esm/dns/interfaces.d.ts +11 -0
- package/dist/esm/dns/interfaces.d.ts.map +1 -1
- package/dist/esm/factories/cluster.d.ts +4 -3
- package/dist/esm/factories/cluster.d.ts.map +1 -1
- package/dist/esm/factories/cluster.js +13 -11
- package/dist/esm/factories/cluster.js.map +1 -1
- package/dist/esm/factories/dns.d.ts +3 -2
- package/dist/esm/factories/dns.d.ts.map +1 -1
- package/dist/esm/factories/dns.js +11 -9
- package/dist/esm/factories/dns.js.map +1 -1
- package/dist/esm/factories/index.d.ts +1 -0
- package/dist/esm/factories/index.d.ts.map +1 -1
- package/dist/esm/factories/index.js +3 -1
- package/dist/esm/factories/index.js.map +1 -1
- package/dist/esm/factories/network.d.ts +4 -3
- package/dist/esm/factories/network.d.ts.map +1 -1
- package/dist/esm/factories/network.js +13 -11
- package/dist/esm/factories/network.js.map +1 -1
- package/dist/esm/factories/secrets.d.ts +4 -3
- package/dist/esm/factories/secrets.d.ts.map +1 -1
- package/dist/esm/factories/secrets.js +12 -10
- package/dist/esm/factories/secrets.js.map +1 -1
- package/dist/esm/factories/state.d.ts +33 -0
- package/dist/esm/factories/state.d.ts.map +1 -0
- package/dist/esm/factories/state.js +63 -0
- package/dist/esm/factories/state.js.map +1 -0
- package/dist/esm/factories/types.d.ts +22 -0
- package/dist/esm/factories/types.d.ts.map +1 -1
- package/dist/esm/factories/types.js +18 -0
- package/dist/esm/factories/types.js.map +1 -1
- package/dist/esm/global-lb/glb.d.ts.map +1 -1
- package/dist/esm/global-lb/glb.js +23 -9
- package/dist/esm/global-lb/glb.js.map +1 -1
- package/dist/esm/index.d.ts +2 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -13
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/network/cidr.d.ts +34 -0
- package/dist/esm/network/cidr.d.ts.map +1 -1
- package/dist/esm/network/cidr.js +34 -0
- package/dist/esm/network/cidr.js.map +1 -1
- package/dist/esm/network/interfaces.d.ts +16 -0
- package/dist/esm/network/interfaces.d.ts.map +1 -1
- package/dist/esm/platform/interfaces.d.ts +1 -1
- package/dist/esm/platform/interfaces.d.ts.map +1 -1
- package/dist/esm/platform/stack.d.ts.map +1 -1
- package/dist/esm/platform/stack.js +6 -1
- package/dist/esm/platform/stack.js.map +1 -1
- package/dist/esm/queue/interfaces.d.ts +8 -0
- package/dist/esm/queue/interfaces.d.ts.map +1 -1
- package/dist/esm/secrets/interfaces.d.ts +5 -0
- package/dist/esm/secrets/interfaces.d.ts.map +1 -1
- package/dist/esm/state/index.d.ts +7 -0
- package/dist/esm/state/index.d.ts.map +1 -0
- package/dist/esm/state/index.js +8 -0
- package/dist/esm/state/index.js.map +1 -0
- package/dist/esm/state/interfaces.d.ts +82 -0
- package/dist/esm/state/interfaces.d.ts.map +1 -0
- package/dist/esm/state/interfaces.js +11 -0
- package/dist/esm/state/interfaces.js.map +1 -0
- package/dist/esm/storage/interfaces.d.ts +17 -0
- package/dist/esm/storage/interfaces.d.ts.map +1 -1
- package/dist/esm/types/cloud-target.d.ts +12 -0
- package/dist/esm/types/cloud-target.d.ts.map +1 -1
- package/dist/esm/types/cloud-target.js +12 -0
- package/dist/esm/types/cloud-target.js.map +1 -1
- package/dist/esm/types/tags.d.ts +16 -0
- package/dist/esm/types/tags.d.ts.map +1 -1
- package/dist/esm/types/tags.js +16 -0
- package/dist/esm/types/tags.js.map +1 -1
- package/dist/esm/types/validation.d.ts.map +1 -1
- package/dist/esm/types/validation.js +14 -11
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/utils/index.d.ts +7 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +11 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/provider-loader.d.ts +14 -0
- package/dist/esm/utils/provider-loader.d.ts.map +1 -0
- package/dist/esm/utils/provider-loader.js +33 -0
- package/dist/esm/utils/provider-loader.js.map +1 -0
- package/package.json +41 -3
|
@@ -0,0 +1,752 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Embedded project templates for `nimbus new`.
|
|
4
|
+
*
|
|
5
|
+
* Each template function returns the contents for `index.ts` and `README.md`
|
|
6
|
+
* with the project name substituted into resource names.
|
|
7
|
+
*
|
|
8
|
+
* @module cli/templates
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.TEMPLATES = exports.TEMPLATE_NAMES = void 0;
|
|
12
|
+
exports.emptyTemplate = emptyTemplate;
|
|
13
|
+
exports.minimalAwsTemplate = minimalAwsTemplate;
|
|
14
|
+
exports.minimalAzureTemplate = minimalAzureTemplate;
|
|
15
|
+
exports.awsTemplate = awsTemplate;
|
|
16
|
+
exports.azureTemplate = azureTemplate;
|
|
17
|
+
exports.multiCloudTemplate = multiCloudTemplate;
|
|
18
|
+
/** Valid template names accepted by the CLI. */
|
|
19
|
+
exports.TEMPLATE_NAMES = [
|
|
20
|
+
"empty",
|
|
21
|
+
"minimal-aws",
|
|
22
|
+
"minimal-azure",
|
|
23
|
+
"aws",
|
|
24
|
+
"azure",
|
|
25
|
+
"multi-cloud",
|
|
26
|
+
];
|
|
27
|
+
/** Common operations section included in every generated README. */
|
|
28
|
+
const OPERATIONS_SECTION = `## Operations
|
|
29
|
+
|
|
30
|
+
\`\`\`bash
|
|
31
|
+
pulumi preview # Preview changes before deploying
|
|
32
|
+
pulumi up # Deploy infrastructure
|
|
33
|
+
pulumi refresh # Sync state with actual cloud resources
|
|
34
|
+
pulumi destroy # Tear down all resources
|
|
35
|
+
pulumi config set <key> <value> # Set stack configuration (e.g. secrets)
|
|
36
|
+
pulumi stack output # View stack outputs
|
|
37
|
+
pulumi logs # View cloud resource logs (if supported)
|
|
38
|
+
\`\`\`
|
|
39
|
+
`;
|
|
40
|
+
/** Template registry with metadata and provider dependencies. */
|
|
41
|
+
exports.TEMPLATES = {
|
|
42
|
+
empty: {
|
|
43
|
+
description: "Blank scaffold with TODO placeholders",
|
|
44
|
+
providers: [],
|
|
45
|
+
generate: emptyTemplate,
|
|
46
|
+
},
|
|
47
|
+
"minimal-aws": {
|
|
48
|
+
description: "State backend + Secrets Manager (no cluster)",
|
|
49
|
+
providers: ["aws"],
|
|
50
|
+
generate: minimalAwsTemplate,
|
|
51
|
+
},
|
|
52
|
+
"minimal-azure": {
|
|
53
|
+
description: "State backend + Key Vault (no cluster)",
|
|
54
|
+
providers: ["azure"],
|
|
55
|
+
generate: minimalAzureTemplate,
|
|
56
|
+
},
|
|
57
|
+
aws: {
|
|
58
|
+
description: "Full stack: VPC + EKS + Route 53 + Secrets + Platform",
|
|
59
|
+
providers: ["aws", "kubernetes"],
|
|
60
|
+
generate: awsTemplate,
|
|
61
|
+
},
|
|
62
|
+
azure: {
|
|
63
|
+
description: "Full stack: VNet + AKS + Azure DNS + Key Vault + Platform",
|
|
64
|
+
providers: ["azure", "kubernetes"],
|
|
65
|
+
generate: azureTemplate,
|
|
66
|
+
},
|
|
67
|
+
"multi-cloud": {
|
|
68
|
+
description: "AWS + Azure active-active with Global Load Balancer",
|
|
69
|
+
providers: ["aws", "azure", "kubernetes"],
|
|
70
|
+
generate: multiCloudTemplate,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Empty scaffold with imports and TODO placeholders.
|
|
75
|
+
*
|
|
76
|
+
* @param name - Project name used in comments
|
|
77
|
+
* @returns Template files
|
|
78
|
+
*/
|
|
79
|
+
function emptyTemplate(name) {
|
|
80
|
+
const indexTs = `/**
|
|
81
|
+
* ${name} — Nimbus infrastructure project.
|
|
82
|
+
*
|
|
83
|
+
* Usage:
|
|
84
|
+
* pulumi up
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
// import {
|
|
88
|
+
// createNetwork,
|
|
89
|
+
// createCluster,
|
|
90
|
+
// createDns,
|
|
91
|
+
// createSecrets,
|
|
92
|
+
// createStateBackend,
|
|
93
|
+
// createPlatformStack,
|
|
94
|
+
// } from "@reyemtech/nimbus";
|
|
95
|
+
// import type { INetwork, ICluster, IDns, ISecrets, IStateBackend } from "@reyemtech/nimbus";
|
|
96
|
+
|
|
97
|
+
// TODO: Define your cloud target
|
|
98
|
+
// const cloud = "aws";
|
|
99
|
+
|
|
100
|
+
// TODO: Create resources
|
|
101
|
+
// const network = createNetwork("${name}", { cloud, cidr: "10.0.0.0/16" });
|
|
102
|
+
|
|
103
|
+
// TODO: Export outputs
|
|
104
|
+
// export const output = "replace-me";
|
|
105
|
+
`;
|
|
106
|
+
const readmeMd = `# ${name}
|
|
107
|
+
|
|
108
|
+
Nimbus infrastructure project.
|
|
109
|
+
|
|
110
|
+
## Getting Started
|
|
111
|
+
|
|
112
|
+
Edit \`index.ts\` to define your cloud resources, then deploy.
|
|
113
|
+
|
|
114
|
+
${OPERATIONS_SECTION}
|
|
115
|
+
## Resources
|
|
116
|
+
|
|
117
|
+
- [Nimbus Documentation](https://github.com/reyemtech/nimbus)
|
|
118
|
+
- [Pulumi Documentation](https://www.pulumi.com/docs/)
|
|
119
|
+
`;
|
|
120
|
+
return { indexTs, readmeMd };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Minimal AWS template — state backend + Secrets Manager, no cluster.
|
|
124
|
+
*
|
|
125
|
+
* @param name - Project name substituted into resource names
|
|
126
|
+
* @returns Template files
|
|
127
|
+
*/
|
|
128
|
+
function minimalAwsTemplate(name) {
|
|
129
|
+
const indexTs = `/**
|
|
130
|
+
* ${name} — Minimal AWS infrastructure.
|
|
131
|
+
*
|
|
132
|
+
* Deploys: S3 state backend + AWS Secrets Manager
|
|
133
|
+
*
|
|
134
|
+
* Usage:
|
|
135
|
+
* pulumi up
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
import { createStateBackend, createSecrets } from "@reyemtech/nimbus";
|
|
139
|
+
import type { IStateBackend, ISecrets } from "@reyemtech/nimbus";
|
|
140
|
+
|
|
141
|
+
// 1. State Backend — S3 with versioning, encryption, and DynamoDB locking
|
|
142
|
+
const backend = createStateBackend("${name}", {
|
|
143
|
+
cloud: "aws",
|
|
144
|
+
versioning: true,
|
|
145
|
+
encryption: true,
|
|
146
|
+
locking: { enabled: true },
|
|
147
|
+
tags: { environment: "production" },
|
|
148
|
+
}) as IStateBackend;
|
|
149
|
+
|
|
150
|
+
// 2. Secrets — AWS Secrets Manager
|
|
151
|
+
const secrets = createSecrets("${name}", {
|
|
152
|
+
cloud: "aws",
|
|
153
|
+
backend: "aws-secrets-manager",
|
|
154
|
+
tags: { environment: "production" },
|
|
155
|
+
}) as ISecrets;
|
|
156
|
+
|
|
157
|
+
secrets.putSecret("database", {
|
|
158
|
+
host: "db.internal.example.com",
|
|
159
|
+
password: "change-me-in-pulumi-config",
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Exports
|
|
163
|
+
export const backendUrl = backend.backendUrl;
|
|
164
|
+
export const bucketName = backend.bucketName;
|
|
165
|
+
`;
|
|
166
|
+
const readmeMd = `# ${name}
|
|
167
|
+
|
|
168
|
+
Minimal AWS infrastructure — state backend + secrets, no cluster required.
|
|
169
|
+
|
|
170
|
+
## Components
|
|
171
|
+
|
|
172
|
+
- **State Backend** — S3 bucket with versioning, encryption, and DynamoDB locking
|
|
173
|
+
- **Secrets** — AWS Secrets Manager for sensitive configuration
|
|
174
|
+
|
|
175
|
+
## Architecture
|
|
176
|
+
|
|
177
|
+
\`\`\`mermaid
|
|
178
|
+
graph LR
|
|
179
|
+
subgraph AWS["AWS"]
|
|
180
|
+
S3[S3 State Backend]
|
|
181
|
+
DDB[DynamoDB Lock Table]
|
|
182
|
+
SM[Secrets Manager]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
S3 --> DDB
|
|
186
|
+
\`\`\`
|
|
187
|
+
|
|
188
|
+
${OPERATIONS_SECTION}
|
|
189
|
+
`;
|
|
190
|
+
return { indexTs, readmeMd };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Minimal Azure template — state backend + Key Vault, no cluster.
|
|
194
|
+
*
|
|
195
|
+
* @param name - Project name substituted into resource names
|
|
196
|
+
* @returns Template files
|
|
197
|
+
*/
|
|
198
|
+
function minimalAzureTemplate(name) {
|
|
199
|
+
const indexTs = `/**
|
|
200
|
+
* ${name} — Minimal Azure infrastructure.
|
|
201
|
+
*
|
|
202
|
+
* Deploys: Azure Blob state backend + Key Vault
|
|
203
|
+
*
|
|
204
|
+
* Usage:
|
|
205
|
+
* pulumi up
|
|
206
|
+
*/
|
|
207
|
+
|
|
208
|
+
import { createStateBackend, createSecrets } from "@reyemtech/nimbus";
|
|
209
|
+
import type { IStateBackend, ISecrets } from "@reyemtech/nimbus";
|
|
210
|
+
|
|
211
|
+
const resourceGroupName = "rg-${name}-canadacentral";
|
|
212
|
+
|
|
213
|
+
const azureOptions = {
|
|
214
|
+
azure: { resourceGroupName },
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// 1. State Backend — Azure Blob Storage with versioning and encryption
|
|
218
|
+
const backend = createStateBackend("${name}", {
|
|
219
|
+
cloud: "azure",
|
|
220
|
+
versioning: true,
|
|
221
|
+
encryption: true,
|
|
222
|
+
tags: { environment: "production" },
|
|
223
|
+
providerOptions: azureOptions,
|
|
224
|
+
}) as IStateBackend;
|
|
225
|
+
|
|
226
|
+
// 2. Secrets — Azure Key Vault
|
|
227
|
+
const secrets = createSecrets("${name}", {
|
|
228
|
+
cloud: "azure",
|
|
229
|
+
backend: "azure-key-vault",
|
|
230
|
+
tags: { environment: "production" },
|
|
231
|
+
providerOptions: azureOptions,
|
|
232
|
+
}) as ISecrets;
|
|
233
|
+
|
|
234
|
+
secrets.putSecret("database", {
|
|
235
|
+
host: "db.internal.example.com",
|
|
236
|
+
password: "change-me-in-pulumi-config",
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// Exports
|
|
240
|
+
export const backendUrl = backend.backendUrl;
|
|
241
|
+
export const storageAccountName = backend.storageAccountName;
|
|
242
|
+
`;
|
|
243
|
+
const readmeMd = `# ${name}
|
|
244
|
+
|
|
245
|
+
Minimal Azure infrastructure — state backend + secrets, no cluster required.
|
|
246
|
+
|
|
247
|
+
## Components
|
|
248
|
+
|
|
249
|
+
- **State Backend** — Azure Blob Storage with versioning and encryption
|
|
250
|
+
- **Secrets** — Azure Key Vault for sensitive configuration
|
|
251
|
+
|
|
252
|
+
## Architecture
|
|
253
|
+
|
|
254
|
+
\`\`\`mermaid
|
|
255
|
+
graph LR
|
|
256
|
+
subgraph Azure["Azure"]
|
|
257
|
+
SA[Storage Account]
|
|
258
|
+
BC[Blob Container]
|
|
259
|
+
KV[Key Vault]
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
SA --> BC
|
|
263
|
+
\`\`\`
|
|
264
|
+
|
|
265
|
+
${OPERATIONS_SECTION}
|
|
266
|
+
`;
|
|
267
|
+
return { indexTs, readmeMd };
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Full AWS stack — VPC + EKS + Route 53 + Secrets + Platform.
|
|
271
|
+
*
|
|
272
|
+
* @param name - Project name substituted into resource names
|
|
273
|
+
* @returns Template files
|
|
274
|
+
*/
|
|
275
|
+
function awsTemplate(name) {
|
|
276
|
+
const indexTs = `/**
|
|
277
|
+
* ${name} — Full AWS infrastructure stack.
|
|
278
|
+
*
|
|
279
|
+
* Deploys: VPC + EKS + Route 53 + Secrets Manager + Platform Stack
|
|
280
|
+
*
|
|
281
|
+
* Usage:
|
|
282
|
+
* pulumi up
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
import {
|
|
286
|
+
createNetwork,
|
|
287
|
+
createCluster,
|
|
288
|
+
createDns,
|
|
289
|
+
createSecrets,
|
|
290
|
+
createPlatformStack,
|
|
291
|
+
} from "@reyemtech/nimbus";
|
|
292
|
+
import type { INetwork, ICluster, IDns, ISecrets } from "@reyemtech/nimbus";
|
|
293
|
+
|
|
294
|
+
// 1. Network — VPC with fck-nat (~$3/mo vs $32/mo managed NAT)
|
|
295
|
+
const network = createNetwork("${name}", {
|
|
296
|
+
cloud: "aws",
|
|
297
|
+
cidr: "10.0.0.0/16",
|
|
298
|
+
natStrategy: "fck-nat",
|
|
299
|
+
tags: { environment: "production", client: "acme" },
|
|
300
|
+
providerOptions: {
|
|
301
|
+
aws: { fckNatInstanceType: "t4g.nano", availabilityZoneCount: 2 },
|
|
302
|
+
},
|
|
303
|
+
}) as INetwork;
|
|
304
|
+
|
|
305
|
+
// 2. Cluster — EKS with Auto Mode
|
|
306
|
+
const cluster = createCluster(
|
|
307
|
+
"${name}",
|
|
308
|
+
{
|
|
309
|
+
cloud: "aws",
|
|
310
|
+
version: "1.32",
|
|
311
|
+
nodePools: [
|
|
312
|
+
{ name: "system", instanceType: "t4g.small", minNodes: 2, maxNodes: 3 },
|
|
313
|
+
{
|
|
314
|
+
name: "workers",
|
|
315
|
+
instanceType: "c6a.large",
|
|
316
|
+
minNodes: 1,
|
|
317
|
+
maxNodes: 10,
|
|
318
|
+
spot: true,
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
tags: { environment: "production", client: "acme" },
|
|
322
|
+
providerOptions: { aws: { autoMode: true } },
|
|
323
|
+
},
|
|
324
|
+
network,
|
|
325
|
+
) as ICluster;
|
|
326
|
+
|
|
327
|
+
// 3. DNS — Route 53 hosted zone
|
|
328
|
+
const dns = createDns("${name}", {
|
|
329
|
+
cloud: "aws",
|
|
330
|
+
zoneName: "example.com",
|
|
331
|
+
records: [
|
|
332
|
+
{ name: "app", type: "A", values: ["1.2.3.4"], ttl: 300 },
|
|
333
|
+
{ name: "www", type: "CNAME", values: ["app.example.com"], ttl: 300 },
|
|
334
|
+
],
|
|
335
|
+
}) as IDns;
|
|
336
|
+
|
|
337
|
+
// 4. Secrets — AWS Secrets Manager
|
|
338
|
+
const secrets = createSecrets("${name}", {
|
|
339
|
+
cloud: "aws",
|
|
340
|
+
backend: "aws-secrets-manager",
|
|
341
|
+
tags: { environment: "production" },
|
|
342
|
+
}) as ISecrets;
|
|
343
|
+
|
|
344
|
+
secrets.putSecret("database", {
|
|
345
|
+
host: "db.internal.example.com",
|
|
346
|
+
password: "change-me-in-pulumi-config",
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// 5. Platform — Helm components on the cluster
|
|
350
|
+
const platform = createPlatformStack("${name}", {
|
|
351
|
+
cluster,
|
|
352
|
+
domain: "example.com",
|
|
353
|
+
externalDns: {
|
|
354
|
+
dnsProvider: "route53",
|
|
355
|
+
domainFilters: ["example.com"],
|
|
356
|
+
},
|
|
357
|
+
vault: { enabled: true, ingressHost: "vault.example.com" },
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// Exports
|
|
361
|
+
export const vpcId = network.vpcId;
|
|
362
|
+
export const clusterEndpoint = cluster.endpoint;
|
|
363
|
+
export const zoneId = dns.zoneId;
|
|
364
|
+
export const nameServers = dns.nameServers;
|
|
365
|
+
export const platformName = Array.isArray(platform) ? platform[0]?.name : platform.name;
|
|
366
|
+
`;
|
|
367
|
+
const readmeMd = `# ${name}
|
|
368
|
+
|
|
369
|
+
Full AWS infrastructure stack using the nimbus factory API.
|
|
370
|
+
|
|
371
|
+
## Components
|
|
372
|
+
|
|
373
|
+
- **Network** — VPC with public/private subnets and fck-nat (~$3/mo)
|
|
374
|
+
- **Cluster** — EKS with Auto Mode, system + spot worker pools
|
|
375
|
+
- **DNS** — Route 53 hosted zone with A and CNAME records
|
|
376
|
+
- **Secrets** — AWS Secrets Manager for database credentials
|
|
377
|
+
- **Platform** — Traefik, cert-manager, External DNS, Vault via Helm
|
|
378
|
+
|
|
379
|
+
## Architecture
|
|
380
|
+
|
|
381
|
+
\`\`\`mermaid
|
|
382
|
+
graph LR
|
|
383
|
+
Internet((Internet))
|
|
384
|
+
|
|
385
|
+
subgraph AWS["AWS"]
|
|
386
|
+
R53[Route 53]
|
|
387
|
+
SM[Secrets Manager]
|
|
388
|
+
|
|
389
|
+
subgraph VPC["VPC 10.0.0.0/16"]
|
|
390
|
+
NAT[fck-nat]
|
|
391
|
+
|
|
392
|
+
subgraph EKS["EKS v1.32"]
|
|
393
|
+
SYS[System Pool]
|
|
394
|
+
WORK[Worker Pool spot]
|
|
395
|
+
|
|
396
|
+
subgraph Platform["Platform Stack"]
|
|
397
|
+
TRF[Traefik]
|
|
398
|
+
CM[cert-manager]
|
|
399
|
+
EDNS[External DNS]
|
|
400
|
+
VLT[Vault]
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
Internet --> TRF --> WORK
|
|
407
|
+
EDNS --> R53
|
|
408
|
+
VLT --> SM
|
|
409
|
+
VPC --> NAT --> Internet
|
|
410
|
+
\`\`\`
|
|
411
|
+
|
|
412
|
+
${OPERATIONS_SECTION}
|
|
413
|
+
`;
|
|
414
|
+
return { indexTs, readmeMd };
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Full Azure stack — VNet + AKS + Azure DNS + Key Vault + Platform.
|
|
418
|
+
*
|
|
419
|
+
* @param name - Project name substituted into resource names
|
|
420
|
+
* @returns Template files
|
|
421
|
+
*/
|
|
422
|
+
function azureTemplate(name) {
|
|
423
|
+
const indexTs = `/**
|
|
424
|
+
* ${name} — Full Azure infrastructure stack.
|
|
425
|
+
*
|
|
426
|
+
* Deploys: VNet + AKS + Azure DNS + Key Vault + Platform Stack
|
|
427
|
+
*
|
|
428
|
+
* Usage:
|
|
429
|
+
* pulumi up
|
|
430
|
+
*/
|
|
431
|
+
|
|
432
|
+
import {
|
|
433
|
+
createNetwork,
|
|
434
|
+
createCluster,
|
|
435
|
+
createDns,
|
|
436
|
+
createSecrets,
|
|
437
|
+
createPlatformStack,
|
|
438
|
+
} from "@reyemtech/nimbus";
|
|
439
|
+
import type { INetwork, ICluster, IDns, ISecrets } from "@reyemtech/nimbus";
|
|
440
|
+
|
|
441
|
+
const resourceGroupName = "rg-${name}-canadacentral";
|
|
442
|
+
|
|
443
|
+
const azureOptions = {
|
|
444
|
+
azure: {
|
|
445
|
+
resourceGroupName,
|
|
446
|
+
tenantId: "your-tenant-id",
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
// 1. Network — VNet with NAT Gateway
|
|
451
|
+
const network = createNetwork("${name}", {
|
|
452
|
+
cloud: "azure",
|
|
453
|
+
cidr: "10.1.0.0/16",
|
|
454
|
+
natStrategy: "managed",
|
|
455
|
+
tags: { environment: "production", client: "acme" },
|
|
456
|
+
providerOptions: azureOptions,
|
|
457
|
+
}) as INetwork;
|
|
458
|
+
|
|
459
|
+
// 2. Cluster — AKS with system + user node pools
|
|
460
|
+
const cluster = createCluster(
|
|
461
|
+
"${name}",
|
|
462
|
+
{
|
|
463
|
+
cloud: "azure",
|
|
464
|
+
version: "1.32",
|
|
465
|
+
nodePools: [
|
|
466
|
+
{
|
|
467
|
+
name: "system",
|
|
468
|
+
instanceType: "Standard_D2s_v5",
|
|
469
|
+
minNodes: 2,
|
|
470
|
+
maxNodes: 3,
|
|
471
|
+
mode: "system",
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
name: "workers",
|
|
475
|
+
instanceType: "Standard_D4s_v5",
|
|
476
|
+
minNodes: 1,
|
|
477
|
+
maxNodes: 10,
|
|
478
|
+
spot: true,
|
|
479
|
+
mode: "user",
|
|
480
|
+
},
|
|
481
|
+
],
|
|
482
|
+
virtualNodes: true,
|
|
483
|
+
tags: { environment: "production", client: "acme" },
|
|
484
|
+
providerOptions: azureOptions,
|
|
485
|
+
},
|
|
486
|
+
network,
|
|
487
|
+
) as ICluster;
|
|
488
|
+
|
|
489
|
+
// 3. DNS — Azure DNS Zone
|
|
490
|
+
const dns = createDns("${name}", {
|
|
491
|
+
cloud: "azure",
|
|
492
|
+
zoneName: "example.com",
|
|
493
|
+
records: [
|
|
494
|
+
{ name: "app", type: "A", values: ["1.2.3.4"], ttl: 300 },
|
|
495
|
+
{ name: "www", type: "CNAME", values: ["app.example.com"], ttl: 300 },
|
|
496
|
+
],
|
|
497
|
+
providerOptions: azureOptions,
|
|
498
|
+
}) as IDns;
|
|
499
|
+
|
|
500
|
+
// 4. Secrets — Azure Key Vault
|
|
501
|
+
const secrets = createSecrets("${name}", {
|
|
502
|
+
cloud: "azure",
|
|
503
|
+
backend: "azure-key-vault",
|
|
504
|
+
tags: { environment: "production" },
|
|
505
|
+
providerOptions: azureOptions,
|
|
506
|
+
}) as ISecrets;
|
|
507
|
+
|
|
508
|
+
secrets.putSecret("database", {
|
|
509
|
+
host: "db.internal.example.com",
|
|
510
|
+
password: "change-me-in-pulumi-config",
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
// 5. Platform — Helm components on the cluster
|
|
514
|
+
const platform = createPlatformStack("${name}", {
|
|
515
|
+
cluster,
|
|
516
|
+
domain: "example.com",
|
|
517
|
+
externalDns: {
|
|
518
|
+
dnsProvider: "azure-dns",
|
|
519
|
+
domainFilters: ["example.com"],
|
|
520
|
+
},
|
|
521
|
+
vault: { enabled: true, ingressHost: "vault.example.com" },
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
// Exports
|
|
525
|
+
export const vnetId = network.vpcId;
|
|
526
|
+
export const clusterEndpoint = cluster.endpoint;
|
|
527
|
+
export const zoneId = dns.zoneId;
|
|
528
|
+
export const nameServers = dns.nameServers;
|
|
529
|
+
export const platformName = Array.isArray(platform) ? platform[0]?.name : platform.name;
|
|
530
|
+
`;
|
|
531
|
+
const readmeMd = `# ${name}
|
|
532
|
+
|
|
533
|
+
Full Azure infrastructure stack using the nimbus factory API.
|
|
534
|
+
|
|
535
|
+
## Components
|
|
536
|
+
|
|
537
|
+
- **Network** — VNet with NAT Gateway
|
|
538
|
+
- **Cluster** — AKS with system + spot user node pools and virtual nodes
|
|
539
|
+
- **DNS** — Azure DNS zone with A and CNAME records
|
|
540
|
+
- **Secrets** — Azure Key Vault for database credentials
|
|
541
|
+
- **Platform** — Traefik, cert-manager, External DNS, Vault via Helm
|
|
542
|
+
|
|
543
|
+
## Architecture
|
|
544
|
+
|
|
545
|
+
\`\`\`mermaid
|
|
546
|
+
graph LR
|
|
547
|
+
Internet((Internet))
|
|
548
|
+
|
|
549
|
+
subgraph Azure["Azure"]
|
|
550
|
+
ADNS[Azure DNS]
|
|
551
|
+
KV[Key Vault]
|
|
552
|
+
|
|
553
|
+
subgraph VNet["VNet 10.1.0.0/16"]
|
|
554
|
+
NAT[NAT Gateway]
|
|
555
|
+
|
|
556
|
+
subgraph AKS["AKS v1.32"]
|
|
557
|
+
SYS[System Pool]
|
|
558
|
+
WORK[Worker Pool spot]
|
|
559
|
+
|
|
560
|
+
subgraph Platform["Platform Stack"]
|
|
561
|
+
TRF[Traefik]
|
|
562
|
+
CM[cert-manager]
|
|
563
|
+
EDNS[External DNS]
|
|
564
|
+
VLT[Vault]
|
|
565
|
+
end
|
|
566
|
+
end
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
Internet --> TRF --> WORK
|
|
571
|
+
EDNS --> ADNS
|
|
572
|
+
VLT --> KV
|
|
573
|
+
VNet --> NAT --> Internet
|
|
574
|
+
\`\`\`
|
|
575
|
+
|
|
576
|
+
${OPERATIONS_SECTION}
|
|
577
|
+
`;
|
|
578
|
+
return { indexTs, readmeMd };
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Multi-cloud template — AWS + Azure active-active with GLB.
|
|
582
|
+
*
|
|
583
|
+
* @param name - Project name substituted into resource names
|
|
584
|
+
* @returns Template files
|
|
585
|
+
*/
|
|
586
|
+
function multiCloudTemplate(name) {
|
|
587
|
+
const indexTs = `/**
|
|
588
|
+
* ${name} — Multi-cloud AWS + Azure active-active deployment.
|
|
589
|
+
*
|
|
590
|
+
* Deploys: Dual VPC/VNet + EKS/AKS + DNS + Platform + Global Load Balancer
|
|
591
|
+
*
|
|
592
|
+
* Usage:
|
|
593
|
+
* pulumi up
|
|
594
|
+
*/
|
|
595
|
+
|
|
596
|
+
import {
|
|
597
|
+
createNetwork,
|
|
598
|
+
createCluster,
|
|
599
|
+
createDns,
|
|
600
|
+
createPlatformStack,
|
|
601
|
+
createGlobalLoadBalancer,
|
|
602
|
+
} from "@reyemtech/nimbus";
|
|
603
|
+
import type { INetwork, ICluster, IDns } from "@reyemtech/nimbus";
|
|
604
|
+
|
|
605
|
+
const resourceGroupName = "rg-${name}-canadacentral";
|
|
606
|
+
|
|
607
|
+
// Shared provider options
|
|
608
|
+
const providerOptions = {
|
|
609
|
+
aws: { autoMode: true },
|
|
610
|
+
azure: { resourceGroupName },
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
// 1. Networks — Auto-offset CIDRs: AWS gets 10.0.0.0/16, Azure gets 10.1.0.0/16
|
|
614
|
+
const networks = createNetwork("${name}", {
|
|
615
|
+
cloud: [
|
|
616
|
+
{ provider: "aws", region: "us-east-1" },
|
|
617
|
+
{ provider: "azure", region: "canadacentral" },
|
|
618
|
+
],
|
|
619
|
+
cidr: "10.0.0.0/16",
|
|
620
|
+
natStrategy: "fck-nat",
|
|
621
|
+
providerOptions,
|
|
622
|
+
}) as INetwork[];
|
|
623
|
+
|
|
624
|
+
// 2. Clusters — EKS + AKS, auto-matched to networks by provider
|
|
625
|
+
const clusters = createCluster(
|
|
626
|
+
"${name}",
|
|
627
|
+
{
|
|
628
|
+
cloud: [
|
|
629
|
+
{ provider: "aws", region: "us-east-1" },
|
|
630
|
+
{ provider: "azure", region: "canadacentral" },
|
|
631
|
+
],
|
|
632
|
+
version: "1.32",
|
|
633
|
+
nodePools: [
|
|
634
|
+
{ name: "system", instanceType: "t4g.small", minNodes: 2, maxNodes: 3 },
|
|
635
|
+
{
|
|
636
|
+
name: "workers",
|
|
637
|
+
instanceType: "c6a.large",
|
|
638
|
+
minNodes: 2,
|
|
639
|
+
maxNodes: 8,
|
|
640
|
+
spot: true,
|
|
641
|
+
},
|
|
642
|
+
],
|
|
643
|
+
providerOptions,
|
|
644
|
+
},
|
|
645
|
+
networks,
|
|
646
|
+
) as ICluster[];
|
|
647
|
+
|
|
648
|
+
// 3. DNS — Route 53 hosted zone
|
|
649
|
+
const dns = createDns("${name}", {
|
|
650
|
+
cloud: "aws",
|
|
651
|
+
zoneName: "example.com",
|
|
652
|
+
}) as IDns;
|
|
653
|
+
|
|
654
|
+
// 4. Platform — Deploy to both clusters
|
|
655
|
+
createPlatformStack("${name}", {
|
|
656
|
+
cluster: clusters,
|
|
657
|
+
domain: "example.com",
|
|
658
|
+
externalDns: {
|
|
659
|
+
dnsProvider: "route53",
|
|
660
|
+
domainFilters: ["example.com"],
|
|
661
|
+
},
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
// 5. Global Load Balancer — Active-active across both clouds
|
|
665
|
+
const glb = createGlobalLoadBalancer("${name}", {
|
|
666
|
+
strategy: "active-active",
|
|
667
|
+
clusters,
|
|
668
|
+
domain: "app.example.com",
|
|
669
|
+
healthCheck: {
|
|
670
|
+
path: "/health",
|
|
671
|
+
port: 443,
|
|
672
|
+
protocol: "HTTPS",
|
|
673
|
+
intervalSeconds: 30,
|
|
674
|
+
unhealthyThreshold: 3,
|
|
675
|
+
},
|
|
676
|
+
dnsProvider: "route53",
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
// Exports
|
|
680
|
+
export const awsVpcId = networks[0]?.vpcId;
|
|
681
|
+
export const azureVnetId = networks[1]?.vpcId;
|
|
682
|
+
export const awsEndpoint = clusters[0]?.endpoint;
|
|
683
|
+
export const azureEndpoint = clusters[1]?.endpoint;
|
|
684
|
+
export const glbEndpoint = glb.endpoint;
|
|
685
|
+
export const glbStrategy = glb.strategy;
|
|
686
|
+
export const dnsZoneId = dns.zoneId;
|
|
687
|
+
`;
|
|
688
|
+
const readmeMd = `# ${name}
|
|
689
|
+
|
|
690
|
+
Multi-cloud AWS + Azure active-active deployment with Global Load Balancer.
|
|
691
|
+
|
|
692
|
+
## Components
|
|
693
|
+
|
|
694
|
+
- **Networks** — Auto-offset CIDRs (AWS: 10.0.0.0/16, Azure: 10.1.0.0/16)
|
|
695
|
+
- **Clusters** — EKS + AKS, same config, auto-matched to networks by provider
|
|
696
|
+
- **DNS** — Route 53 hosted zone
|
|
697
|
+
- **Platform** — Identical Helm stack deployed to both clusters
|
|
698
|
+
- **GLB** — Route 53 weighted routing with health checks across both clusters
|
|
699
|
+
|
|
700
|
+
## Architecture
|
|
701
|
+
|
|
702
|
+
\`\`\`mermaid
|
|
703
|
+
graph LR
|
|
704
|
+
Internet((Internet))
|
|
705
|
+
|
|
706
|
+
subgraph GLB["Global Load Balancer"]
|
|
707
|
+
R53GLB[Route 53 GLB]
|
|
708
|
+
HC1[Health Check AWS]
|
|
709
|
+
HC2[Health Check Azure]
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
subgraph AWS["AWS (us-east-1)"]
|
|
713
|
+
subgraph AWSVPC["VPC 10.0.0.0/16"]
|
|
714
|
+
subgraph AWSEKS["EKS v1.32"]
|
|
715
|
+
AWSTRF[Traefik]
|
|
716
|
+
AWSWORK[Workers spot]
|
|
717
|
+
AWSEDNS[External DNS]
|
|
718
|
+
end
|
|
719
|
+
end
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
subgraph AZ["Azure (canadacentral)"]
|
|
723
|
+
subgraph AZVN["VNet 10.1.0.0/16"]
|
|
724
|
+
subgraph AZAKS["AKS v1.32"]
|
|
725
|
+
AZTRF[Traefik]
|
|
726
|
+
AZWORK[Workers spot]
|
|
727
|
+
AZEDNS[External DNS]
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
DNS[Route 53 DNS]
|
|
733
|
+
|
|
734
|
+
Internet --> R53GLB
|
|
735
|
+
R53GLB --> HC1 --> AWSTRF --> AWSWORK
|
|
736
|
+
R53GLB --> HC2 --> AZTRF --> AZWORK
|
|
737
|
+
AWSEDNS --> DNS
|
|
738
|
+
AZEDNS --> DNS
|
|
739
|
+
\`\`\`
|
|
740
|
+
|
|
741
|
+
## How It Works
|
|
742
|
+
|
|
743
|
+
1. **Factory dispatch** — \`createNetwork("${name}", { cloud: ["aws", "azure"] })\` creates both VPC and VNet
|
|
744
|
+
2. **CIDR auto-offset** — Second cloud auto-increments to \`10.1.0.0/16\` to avoid overlaps
|
|
745
|
+
3. **Provider matching** — \`createCluster(...)\` matches each cluster to its network by provider
|
|
746
|
+
4. **GLB** — Route 53 weighted records distribute traffic 50/50, health checks failover automatically
|
|
747
|
+
|
|
748
|
+
${OPERATIONS_SECTION}
|
|
749
|
+
`;
|
|
750
|
+
return { indexTs, readmeMd };
|
|
751
|
+
}
|
|
752
|
+
//# sourceMappingURL=templates.js.map
|