@geek-fun/serverlessinsight 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geek-fun/serverlessinsight",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Full life cycle cross providers serverless application management for your fast-growing business.",
5
5
  "homepage": "https://serverlessinsight.geekfun.club",
6
6
  "main": "dist/src/index.js",
@@ -58,6 +58,8 @@
58
58
  "@alicloud/ros-cdk-oss": "^1.4.0",
59
59
  "@alicloud/ros-cdk-ossdeployment": "^1.4.0",
60
60
  "@alicloud/ros-cdk-ram": "^1.4.0",
61
+ "@alicloud/ros-cdk-rds": "^1.5.0",
62
+ "@alicloud/ros-cdk-sls": "^1.5.0",
61
63
  "@alicloud/ros20190910": "^3.5.2",
62
64
  "ajv": "^8.17.1",
63
65
  "ali-oss": "^6.22.0",
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeBase64 = void 0;
4
+ const encodeBase64 = (str) => Buffer.from(str, 'utf-8').toString('base64');
5
+ exports.encodeBase64 = encodeBase64;
@@ -6,3 +6,4 @@ export * from './actionContext';
6
6
  export * from './iacHelper';
7
7
  export * from './constants';
8
8
  export * from './imsClient';
9
+ export * from './base64';
@@ -22,3 +22,4 @@ __exportStar(require("./actionContext"), exports);
22
22
  __exportStar(require("./iacHelper"), exports);
23
23
  __exportStar(require("./constants"), exports);
24
24
  __exportStar(require("./imsClient"), exports);
25
+ __exportStar(require("./base64"), exports);
@@ -11,16 +11,22 @@ const parseDatabase = (databases) => {
11
11
  name: database.name,
12
12
  type: database.type,
13
13
  version: database.version,
14
- engineMode: database.engine_mode,
15
14
  security: {
16
15
  basicAuth: {
16
+ username: (0, lodash_1.get)(database, 'security.basic_auth.master_user'),
17
17
  password: (0, lodash_1.get)(database, 'security.basic_auth.password'),
18
18
  },
19
19
  },
20
- cu: database.cu,
21
- storageSize: database.storage_size,
22
- network: database.network && {
23
- public: database.network?.public,
20
+ cu: {
21
+ min: database.cu?.min ?? 0,
22
+ max: database.cu?.max ?? 6,
23
+ },
24
+ storage: {
25
+ min: database.storage?.min ?? 20,
26
+ },
27
+ network: {
28
+ type: database.network?.type ?? 'PRIVATE',
29
+ ingressRules: database.network?.ingress_rules ?? ['0.0.0.0/0'],
24
30
  },
25
31
  }));
26
32
  };
@@ -15,6 +15,7 @@ const parseFunction = (functions) => {
15
15
  timeout: func.timeout,
16
16
  environment: func.environment,
17
17
  code: func.code,
18
+ log: func.log,
18
19
  }));
19
20
  };
20
21
  exports.parseFunction = parseFunction;
@@ -34,19 +34,187 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.resolveDatabases = void 0;
37
+ const rds = __importStar(require("@alicloud/ros-cdk-rds"));
37
38
  const common_1 = require("../../common");
38
- const types_1 = require("../../types");
39
39
  const lodash_1 = require("lodash");
40
40
  const esServerless = __importStar(require("@alicloud/ros-cdk-elasticsearchserverless"));
41
+ const rdsEngineMap = new Map([
42
+ [
43
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_5.7" /* DatabaseVersionEnum['MYSQL_5.7'] */}`,
44
+ {
45
+ engine: 'MySQL',
46
+ version: '5.7',
47
+ category: 'serverless_basic',
48
+ dbInstanceClass: 'mysql.n2.serverless.1c',
49
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
50
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: false },
51
+ },
52
+ ],
53
+ [
54
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_8.0" /* DatabaseVersionEnum['MYSQL_8.0'] */}`,
55
+ {
56
+ engine: 'MySQL',
57
+ version: '8.0',
58
+ category: 'serverless_basic',
59
+ dbInstanceClass: 'mysql.n2.serverless.1c',
60
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: false },
61
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: false },
62
+ },
63
+ ],
64
+ [
65
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_5.7" /* DatabaseVersionEnum['MYSQL_HA_5.7'] */}`,
66
+ {
67
+ engine: 'MySQL',
68
+ version: '5.7',
69
+ category: 'serverless_standard',
70
+ dbInstanceClass: 'mysql.n2.serverless.2c',
71
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
72
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: true },
73
+ },
74
+ ],
75
+ [
76
+ `${"RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */}-${"MYSQL_HA_8.0" /* DatabaseVersionEnum['MYSQL_HA_8.0'] */}`,
77
+ {
78
+ engine: 'MySQL',
79
+ version: '8.0',
80
+ category: 'serverless_standard',
81
+ dbInstanceClass: 'mysql.n2.serverless.2c',
82
+ quota: { minCapacity: 0.5, maxCapacity: 32, ha: true },
83
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: true, encryption: true },
84
+ },
85
+ ],
86
+ [
87
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_14" /* DatabaseVersionEnum['PGSQL_14'] */}`,
88
+ {
89
+ engine: 'PostgreSQL',
90
+ version: '14.0',
91
+ category: 'serverless_basic',
92
+ dbInstanceClass: 'pg.n2.serverless.1c',
93
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
94
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
95
+ },
96
+ ],
97
+ [
98
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_15" /* DatabaseVersionEnum['PGSQL_15'] */}`,
99
+ {
100
+ engine: 'PostgreSQL',
101
+ version: '15.0',
102
+ category: 'serverless_basic',
103
+ dbInstanceClass: 'pg.n2.serverless.1c',
104
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
105
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
106
+ },
107
+ ],
108
+ [
109
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_16" /* DatabaseVersionEnum['PGSQL_16'] */}`,
110
+ {
111
+ engine: 'PostgreSQL',
112
+ version: '16.0',
113
+ category: 'serverless_basic',
114
+ dbInstanceClass: 'pg.n2.serverless.1c',
115
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: false },
116
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
117
+ },
118
+ ],
119
+ [
120
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_14" /* DatabaseVersionEnum['PGSQL_HA_14'] */}`,
121
+ {
122
+ engine: 'PostgreSQL',
123
+ version: '14.0',
124
+ category: 'serverless_standard',
125
+ dbInstanceClass: 'pg.n2.serverless.2c',
126
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
127
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
128
+ },
129
+ ],
130
+ [
131
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_15" /* DatabaseVersionEnum['PGSQL_HA_15'] */}`,
132
+ {
133
+ engine: 'PostgreSQL',
134
+ version: '15.0',
135
+ category: 'serverless_standard',
136
+ dbInstanceClass: 'pg.n2.serverless.2c',
137
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
138
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
139
+ },
140
+ ],
141
+ [
142
+ `${"RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */}-${"PGSQL_HA_16" /* DatabaseVersionEnum['PGSQL_HA_16'] */}`,
143
+ {
144
+ engine: 'PostgreSQL',
145
+ version: '16.0',
146
+ category: 'serverless_standard',
147
+ dbInstanceClass: 'pg.n2.serverless.2c',
148
+ quota: { minCapacity: 0.5, maxCapacity: 14, ha: true },
149
+ storage: { type: 'general_essd', bursting: true, optimizedWrites: false, encryption: false },
150
+ },
151
+ ],
152
+ [
153
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2016" /* DatabaseVersionEnum['MSSQL_HA_2016'] */}`,
154
+ {
155
+ engine: 'SQLServer',
156
+ version: '2016_std_sl',
157
+ category: 'serverless_ha',
158
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
159
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
160
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
161
+ },
162
+ ],
163
+ [
164
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2017" /* DatabaseVersionEnum['MSSQL_HA_2017'] */}`,
165
+ {
166
+ engine: 'SQLServer',
167
+ version: '2017_std_sl',
168
+ category: 'serverless_ha',
169
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
170
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
171
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
172
+ },
173
+ ],
174
+ [
175
+ `${"RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */}-${"MSSQL_HA_2019" /* DatabaseVersionEnum['MSSQL_HA_2019'] */}`,
176
+ {
177
+ engine: 'SQLServer',
178
+ version: '2019_std_sl',
179
+ category: 'serverless_ha',
180
+ dbInstanceClass: 'mssql.mem2.serverless.s2',
181
+ quota: { minCapacity: 2, maxCapacity: 8, ha: true },
182
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
183
+ },
184
+ ],
185
+ [
186
+ `${"ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */}-${"ES_SEARCH_7.10" /* DatabaseVersionEnum['ES_SEARCH_7.10'] */}`,
187
+ {
188
+ engine: 'Elasticsearch',
189
+ version: '7.10',
190
+ category: 'STANDARD',
191
+ dbInstanceClass: '',
192
+ quota: { minCapacity: 2, maxCapacity: 8, ha: false },
193
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
194
+ },
195
+ ],
196
+ [
197
+ `${"ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */}-${"ES_TIME_SERIES_7.10" /* DatabaseVersionEnum['ES_TIME_SERIES_7.10'] */}`,
198
+ {
199
+ engine: 'Elasticsearch',
200
+ version: '7.10',
201
+ category: 'TRIAL',
202
+ dbInstanceClass: '',
203
+ quota: { minCapacity: 2, maxCapacity: 8, ha: false },
204
+ storage: { type: 'cloud_essd', bursting: false, optimizedWrites: false, encryption: false },
205
+ },
206
+ ],
207
+ ]);
41
208
  const resolveDatabases = (scope, databases, context) => {
42
209
  if ((0, lodash_1.isEmpty)(databases)) {
43
210
  return undefined;
44
211
  }
45
212
  databases.forEach((db) => {
46
- if ([types_1.DatabaseEnum.ELASTICSEARCH_SERVERLESS].includes(db.type)) {
213
+ const { engine, version, category, dbInstanceClass, quota, storage } = rdsEngineMap.get(`${db.type}-${db.version}`) ?? {};
214
+ if (["ELASTICSEARCH_SERVERLESS" /* DatabaseEnum.ELASTICSEARCH_SERVERLESS */].includes(db.type)) {
47
215
  new esServerless.App(scope, (0, common_1.replaceReference)(db.key, context), {
48
216
  appName: (0, common_1.replaceReference)(db.name, context),
49
- appVersion: db.version,
217
+ appVersion: version,
50
218
  authentication: {
51
219
  basicAuth: [
52
220
  {
@@ -55,9 +223,9 @@ const resolveDatabases = (scope, databases, context) => {
55
223
  ],
56
224
  },
57
225
  quotaInfo: {
58
- cu: db.cu,
59
- storage: db.storageSize,
60
- appType: db.engineMode === types_1.DatabaseEngineMode.TIMESERIES ? 'TRIAL' : 'STANDARD',
226
+ cu: db.cu.min,
227
+ storage: db.storage.min,
228
+ appType: category,
61
229
  },
62
230
  // network: [
63
231
  // {
@@ -73,6 +241,74 @@ const resolveDatabases = (scope, databases, context) => {
73
241
  // ],
74
242
  }, true);
75
243
  }
244
+ if ([
245
+ "RDS_MYSQL_SERVERLESS" /* DatabaseEnum.RDS_MYSQL_SERVERLESS */,
246
+ "RDS_PGSQL_SERVERLESS" /* DatabaseEnum.RDS_PGSQL_SERVERLESS */,
247
+ "RDS_MSSQL_SERVERLESS" /* DatabaseEnum.RDS_MSSQL_SERVERLESS */,
248
+ ].includes(db.type)) {
249
+ new rds.DBInstance(scope, (0, common_1.replaceReference)(db.key, context), {
250
+ engine: engine,
251
+ /**
252
+ * Serverless 实例
253
+ * MySQL:5.7、8.0 - MYSQL_HA_5.7, MYSQL_5.7, MYSQL_HA_8.0, MYSQL_8.0
254
+ * SQL Server:2016_std_sl、2017_std_sl、2019_std_sl - MSSQL_HA_2016, MSSQL_HA_2017, MSSQL_HA_2019
255
+ * PostgreSQL:14.0、15.0、16.0 - PGSQL_HA_14, PGSQL_14 PGSQL_HA_15, PGSQL_15, PGSQL_HA_16,PGSQL_16
256
+ */
257
+ engineVersion: version,
258
+ dbInstanceStorage: (0, common_1.replaceReference)(db.storage.min, context),
259
+ /** Serverless 实例
260
+ * serverless_basic:Serverless 基础系列。(仅适用 MySQL 和 PostgreSQL)
261
+ * serverless_standard:Serverless 高可用系列。(仅适用 MySQL 和 PostgreSQL)
262
+ * serverless_ha:SQL Server Serverless 高可用系列。
263
+ */
264
+ category,
265
+ /**
266
+ * MySQL:
267
+ * MySQL 基础系列:mysql.n2.serverless.1c
268
+ * MySQL 高可用系列:mysql.n2.serverless.2c
269
+ * SQL Server:
270
+ * mssql.mem2.serverless.s2
271
+ * PostgreSQL
272
+ * 基础系列:pg.n2.serverless.1c
273
+ * 高可用系列:pg.n2.serverless.2c
274
+ */
275
+ dbInstanceClass: dbInstanceClass,
276
+ /**
277
+ * 实例存储类型,取值:
278
+ * cloud_essd:ESSD PL1 云盘。
279
+ * general_essd:通用云盘(推荐)。
280
+ */
281
+ dbInstanceStorageType: storage.type,
282
+ burstingEnabled: storage.bursting,
283
+ payType: 'Serverless',
284
+ /**
285
+ * MaxCapacity:
286
+ * MySQL:1~32
287
+ * SQL Server:2~8
288
+ * PostgreSQL:1~14
289
+ * MinCapacity:
290
+ * MySQL:0.5~32
291
+ * SQL Server:2~8(仅支持整数)
292
+ * PostgreSQL:0.5~14
293
+ */
294
+ serverlessConfig: {
295
+ // @TODO db.cu.min should get parameter value when it refer to a parameter
296
+ minCapacity: (0, common_1.replaceReference)(db.cu.min === 0 ? quota.minCapacity : db.cu.min + quota.minCapacity, context),
297
+ maxCapacity: (0, common_1.replaceReference)(db.cu.max + quota.minCapacity <= quota.maxCapacity
298
+ ? db.cu.max + quota.minCapacity
299
+ : quota.maxCapacity, context),
300
+ autoPause: db.cu.min === 0,
301
+ switchForce: false,
302
+ },
303
+ masterUsername: (0, common_1.replaceReference)(db.security.basicAuth.username, context),
304
+ masterUserPassword: (0, common_1.replaceReference)(db.security.basicAuth.password, context),
305
+ masterUserType: 'Super',
306
+ multiAz: quota.ha,
307
+ securityIpList: (0, common_1.replaceReference)(db.network.ingressRules.join(','), context),
308
+ connectionStringType: db.network.type === 'PRIVATE' ? 'Inner' : 'Public',
309
+ dbInstanceNetType: db.network.type === 'PRIVATE' ? 'Intranet' : 'Internet',
310
+ }, true);
311
+ }
76
312
  });
77
313
  };
78
314
  exports.resolveDatabases = resolveDatabases;
@@ -80,6 +80,7 @@ const resolveEvents = (scope, events, tags, context, service) => {
80
80
  const apiGatewayGroup = new agw.RosGroup(scope, (0, common_1.replaceReference)(`${service}_apigroup`, context), {
81
81
  groupName: (0, common_1.replaceReference)(`${service}_apigroup`, context),
82
82
  tags: (0, common_1.replaceReference)(tags, context),
83
+ passthroughHeaders: 'host',
83
84
  }, true);
84
85
  // new agw.RosCustomDomain(
85
86
  // this,
@@ -95,11 +96,12 @@ const resolveEvents = (scope, events, tags, context, service) => {
95
96
  // );
96
97
  apiGateway.forEach((event) => {
97
98
  event.triggers.forEach((trigger) => {
98
- const key = `${trigger.method}_${trigger.path}`.toLowerCase().replace(/\//g, '_');
99
- const api = new agw.RosApi(scope, (0, common_1.replaceReference)(`${event.key}_api_${key}`, context), {
99
+ const key = (0, common_1.encodeBase64)((0, common_1.replaceReference)(`${trigger.method}_${trigger.path}`, context)).replace(/=+$/, '');
100
+ const api = new agw.RosApi(scope, `${event.key}_api_${key}`, {
100
101
  apiName: (0, common_1.replaceReference)(`${event.name}_api_${key}`, context),
101
102
  groupId: apiGatewayGroup.attrGroupId,
102
103
  visibility: 'PRIVATE',
104
+ authType: 'ANONYMOUS',
103
105
  requestConfig: {
104
106
  requestProtocol: 'HTTP',
105
107
  requestHttpMethod: (0, common_1.replaceReference)(trigger.method, context),
@@ -113,13 +115,20 @@ const resolveEvents = (scope, events, tags, context, service) => {
113
115
  functionName: (0, common_1.replaceReference)(trigger.backend, context),
114
116
  roleArn: gatewayAccessRole.attrArn,
115
117
  fcVersion: '3.0',
118
+ method: (0, common_1.replaceReference)(trigger.method, context),
116
119
  },
117
120
  },
118
121
  resultSample: 'ServerlessInsight resultSample',
119
- resultType: 'JSON',
122
+ resultType: 'PASSTHROUGH',
120
123
  tags: (0, common_1.replaceReference)(tags, context),
121
124
  }, true);
122
125
  api.addDependsOn(apiGatewayGroup);
126
+ new agw.Deployment(scope, `${service}_deployment`, {
127
+ apiId: api.attrApiId,
128
+ groupId: apiGatewayGroup.attrGroupId,
129
+ stageName: 'RELEASE',
130
+ description: `${service} Api Gateway deployment`,
131
+ });
123
132
  });
124
133
  });
125
134
  }
@@ -39,10 +39,31 @@ const fc = __importStar(require("@alicloud/ros-cdk-fc3"));
39
39
  const lodash_1 = require("lodash");
40
40
  const ossDeployment = __importStar(require("@alicloud/ros-cdk-ossdeployment"));
41
41
  const ros = __importStar(require("@alicloud/ros-cdk-core"));
42
- const resolveFunctions = (scope, functions, context, service) => {
42
+ const sls = __importStar(require("@alicloud/ros-cdk-sls"));
43
+ const resolveFunctions = (scope, functions, tags, context, service) => {
43
44
  if ((0, lodash_1.isEmpty)(functions)) {
44
45
  return undefined;
45
46
  }
47
+ let logConfig = undefined;
48
+ const enableLog = functions?.some(({ log }) => log);
49
+ const slsService = new sls.Project(scope, `${service}_sls`, { name: `${service}-sls`, tags: (0, common_1.replaceReference)(tags, context) }, true);
50
+ const slsLogstore = new sls.Logstore(scope, `${service}_sls_logstore`, {
51
+ logstoreName: `${service}-sls-logstore`,
52
+ projectName: slsService.attrName,
53
+ ttl: 7,
54
+ }, true);
55
+ new sls.Index(scope, `${service}_sls_index`, {
56
+ projectName: slsService.attrName,
57
+ logstoreName: slsLogstore.attrLogstoreName,
58
+ fullTextIndex: { enable: true },
59
+ }, true);
60
+ if (enableLog) {
61
+ logConfig = {
62
+ project: slsLogstore.attrProjectName,
63
+ logstore: slsLogstore.attrLogstoreName,
64
+ enableRequestMetrics: true,
65
+ };
66
+ }
46
67
  const fileSources = functions
47
68
  ?.filter(({ code }) => (0, common_1.readCodeSize)(code) > common_1.CODE_ZIP_SIZE_LIMIT)
48
69
  .map(({ code, name }) => {
@@ -79,7 +100,13 @@ const resolveFunctions = (scope, functions, context, service) => {
79
100
  timeout: (0, common_1.replaceReference)(fnc.timeout, context),
80
101
  environmentVariables: (0, common_1.replaceReference)(fnc.environment, context),
81
102
  code,
103
+ logConfig,
82
104
  }, true);
105
+ if (enableLog) {
106
+ fcn.addRosDependency(`${service}_sls`);
107
+ fcn.addRosDependency(`${service}_sls_logstore`);
108
+ fcn.addRosDependency(`${service}_sls_index`);
109
+ }
83
110
  if (storeInBucket) {
84
111
  fcn.addRosDependency(`${service}_artifacts_code_deployment`);
85
112
  }
@@ -59,7 +59,7 @@ class RosStack extends ros.Stack {
59
59
  // Define Mappings
60
60
  (0, stage_1.resolveStages)(this, iac.stages, context);
61
61
  // Define functions
62
- (0, function_1.resolveFunctions)(this, iac.functions, context, this.service);
62
+ (0, function_1.resolveFunctions)(this, iac.functions, iac.tags, context, this.service);
63
63
  // Define Events
64
64
  (0, event_1.resolveEvents)(this, iac.events, iac.tags, context, this.service);
65
65
  // Define Databases
@@ -1,12 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DatabaseEnum = exports.DatabaseEngineMode = void 0;
4
- var DatabaseEngineMode;
5
- (function (DatabaseEngineMode) {
6
- DatabaseEngineMode["SEARCH"] = "SEARCH";
7
- DatabaseEngineMode["TIMESERIES"] = "TIMESERIES";
8
- })(DatabaseEngineMode || (exports.DatabaseEngineMode = DatabaseEngineMode = {}));
9
- var DatabaseEnum;
10
- (function (DatabaseEnum) {
11
- DatabaseEnum["ELASTICSEARCH_SERVERLESS"] = "ELASTICSEARCH_SERVERLESS";
12
- })(DatabaseEnum || (exports.DatabaseEnum = DatabaseEnum = {}));
@@ -9,20 +9,57 @@ exports.databaseSchema = {
9
9
  type: 'object',
10
10
  properties: {
11
11
  name: { type: 'string' },
12
- type: { type: 'string', enum: ['ELASTICSEARCH_SERVERLESS'] },
13
- version: { type: 'string' },
14
- engine_mode: { type: 'string', enum: ['SEARCH', 'TIMESERIES'] },
15
- cu: { type: 'number' },
16
- storage_size: { type: 'number' },
12
+ type: {
13
+ type: 'string',
14
+ enum: [
15
+ 'ELASTICSEARCH_SERVERLESS',
16
+ 'RDS_MYSQL_SERVERLESS',
17
+ 'RDS_PGSQL_SERVERLESS',
18
+ 'RDS_MSSQL_SERVERLESS',
19
+ ],
20
+ },
21
+ version: {
22
+ type: 'string',
23
+ enum: [
24
+ 'MYSQL_5.7',
25
+ 'MYSQL_8.0',
26
+ 'MYSQL_HA_5.7',
27
+ 'MYSQL_HA_8.0',
28
+ 'PGSQL_14',
29
+ 'PGSQL_15',
30
+ 'PGSQL_16',
31
+ 'PGSQL_HA_14',
32
+ 'PGSQL_HA_15',
33
+ 'PGSQL_HA_16',
34
+ 'MSSQL_HA_2016',
35
+ 'MSSQL_HA_2017',
36
+ 'MSSQL_HA_2019',
37
+ 'ES_SEARCH_7.10',
38
+ 'ES_TIME_SERIES_7.10',
39
+ ],
40
+ },
41
+ cu: {
42
+ type: 'object',
43
+ properties: {
44
+ min: { type: 'integer', minimum: 0, maximum: 32 },
45
+ max: { type: 'integer', minimum: 1, maximum: 32 },
46
+ },
47
+ },
48
+ storage: {
49
+ type: 'object',
50
+ properties: { min: { type: 'integer', minimum: 20 } },
51
+ required: ['min'],
52
+ },
17
53
  security: {
18
54
  type: 'object',
19
55
  properties: {
20
56
  basic_auth: {
21
57
  type: 'object',
22
58
  properties: {
59
+ master_user: { type: 'string' },
23
60
  password: { type: 'string' },
24
61
  },
25
- required: ['password'],
62
+ required: ['master_user', 'password'],
26
63
  },
27
64
  },
28
65
  required: ['basic_auth'],
@@ -30,11 +67,16 @@ exports.databaseSchema = {
30
67
  network: {
31
68
  type: 'object',
32
69
  properties: {
70
+ type: { type: 'string', enum: ['PUBLIC', 'PRIVATE'] },
71
+ ingress_rules: {
72
+ type: 'array',
73
+ items: { type: 'string' },
74
+ },
33
75
  public: { type: 'boolean' },
34
76
  },
35
77
  },
36
78
  },
37
- required: ['name', 'type', 'version', 'security', 'cu', 'storage_size'],
79
+ required: ['name', 'type', 'version', 'security'],
38
80
  additionalProperties: false,
39
81
  },
40
82
  },
@@ -7,6 +7,7 @@ exports.functionSchema = {
7
7
  patternProperties: {
8
8
  '.*': {
9
9
  type: 'object',
10
+ required: ['name', 'runtime', 'handler', 'code'],
10
11
  properties: {
11
12
  name: { type: 'string' },
12
13
  runtime: {
@@ -32,6 +33,7 @@ exports.functionSchema = {
32
33
  code: { type: 'string' },
33
34
  memory: { type: 'number' },
34
35
  timeout: { type: 'number' },
36
+ log: { type: 'boolean' },
35
37
  environment: {
36
38
  type: 'object',
37
39
  additionalProperties: {
@@ -1 +1 @@
1
- {"root":["../src/index.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/index.ts","../src/commands/template.ts","../src/commands/validate.ts","../src/common/actionContext.ts","../src/common/constants.ts","../src/common/getVersion.ts","../src/common/iacHelper.ts","../src/common/imsClient.ts","../src/common/index.ts","../src/common/logger.ts","../src/common/providerEnum.ts","../src/common/rosClient.ts","../src/lang/index.ts","../src/parser/databaseParser.ts","../src/parser/eventParser.ts","../src/parser/functionParser.ts","../src/parser/index.ts","../src/parser/tagParser.ts","../src/stack/deploy.ts","../src/stack/index.ts","../src/stack/rfsStack/function.ts","../src/stack/rfsStack/index.ts","../src/stack/rosStack/bootstrap.ts","../src/stack/rosStack/database.ts","../src/stack/rosStack/event.ts","../src/stack/rosStack/function.ts","../src/stack/rosStack/index.ts","../src/stack/rosStack/rosStack.ts","../src/stack/rosStack/stage.ts","../src/stack/rosStack/tag.ts","../src/stack/rosStack/vars.ts","../src/types/assets.ts","../src/types/index.ts","../src/types/domains/context.ts","../src/types/domains/database.ts","../src/types/domains/event.ts","../src/types/domains/function.ts","../src/types/domains/provider.ts","../src/types/domains/tag.ts","../src/types/domains/vars.ts","../src/validator/databaseSchema.ts","../src/validator/eventSchema.ts","../src/validator/functionSchema.ts","../src/validator/iacSchema.ts","../src/validator/index.ts","../src/validator/rootSchema.ts"],"version":"5.7.2"}
1
+ {"root":["../src/index.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/index.ts","../src/commands/template.ts","../src/commands/validate.ts","../src/common/actionContext.ts","../src/common/base64.ts","../src/common/constants.ts","../src/common/getVersion.ts","../src/common/iacHelper.ts","../src/common/imsClient.ts","../src/common/index.ts","../src/common/logger.ts","../src/common/providerEnum.ts","../src/common/rosClient.ts","../src/lang/index.ts","../src/parser/databaseParser.ts","../src/parser/eventParser.ts","../src/parser/functionParser.ts","../src/parser/index.ts","../src/parser/tagParser.ts","../src/stack/deploy.ts","../src/stack/index.ts","../src/stack/rfsStack/function.ts","../src/stack/rfsStack/index.ts","../src/stack/rosStack/bootstrap.ts","../src/stack/rosStack/database.ts","../src/stack/rosStack/event.ts","../src/stack/rosStack/function.ts","../src/stack/rosStack/index.ts","../src/stack/rosStack/stage.ts","../src/stack/rosStack/tag.ts","../src/stack/rosStack/vars.ts","../src/types/assets.ts","../src/types/index.ts","../src/types/domains/context.ts","../src/types/domains/database.ts","../src/types/domains/event.ts","../src/types/domains/function.ts","../src/types/domains/provider.ts","../src/types/domains/tag.ts","../src/types/domains/vars.ts","../src/validator/databaseSchema.ts","../src/validator/eventSchema.ts","../src/validator/functionSchema.ts","../src/validator/iacSchema.ts","../src/validator/index.ts","../src/validator/rootSchema.ts"],"version":"5.7.2"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geek-fun/serverlessinsight",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Full life cycle cross providers serverless application management for your fast-growing business.",
5
5
  "homepage": "https://serverlessinsight.geekfun.club",
6
6
  "main": "dist/src/index.js",
@@ -58,6 +58,8 @@
58
58
  "@alicloud/ros-cdk-oss": "^1.4.0",
59
59
  "@alicloud/ros-cdk-ossdeployment": "^1.4.0",
60
60
  "@alicloud/ros-cdk-ram": "^1.4.0",
61
+ "@alicloud/ros-cdk-rds": "^1.5.0",
62
+ "@alicloud/ros-cdk-sls": "^1.5.0",
61
63
  "@alicloud/ros20190910": "^3.5.2",
62
64
  "ajv": "^8.17.1",
63
65
  "ali-oss": "^6.22.0",
@@ -0,0 +1,30 @@
1
+ version: 0.0.1
2
+
3
+ provider:
4
+ name: aliyun
5
+ region: cn-chengdu
6
+
7
+
8
+ service: insight-db-poc
9
+
10
+ tags:
11
+ owner: geek-fun
12
+
13
+ databases:
14
+ # insight_es_db:
15
+ # name: insight-poc-es
16
+ # type: ELASTICSEARCH_SERVERLESS
17
+ # version: '7.10'
18
+ # engine_mode: SEARCH
19
+ # cu: 1
20
+ # storage_size: 20
21
+ # security:
22
+ # basic_auth:
23
+ # password: 'U34I6InQ8elseTgqTWT2t2oFXpoqFg'
24
+ insight_poc_db:
25
+ name: insight-poc-rds
26
+ type: RDS_PGSQL_SERVERLESS
27
+ version: PGSQL_16
28
+ security:
29
+ basic_auth:
30
+ password: 'U34I6InQ8elseTgqTWT2t2oFXpoqFg'
@@ -0,0 +1,60 @@
1
+ version: 0.0.1
2
+ provider:
3
+ name: aliyun
4
+ region: cn-chengdu
5
+
6
+ vars:
7
+ region: cn-hangzhou
8
+ testv: testVarValue
9
+ handler: index.handler
10
+
11
+ stages:
12
+ default:
13
+ region: ${vars.region}
14
+ node_env: default
15
+ dev:
16
+ region: ${vars.region}
17
+ node_env: development
18
+ prod:
19
+ region: cn-shanghai
20
+
21
+ service: insight-poc
22
+
23
+ tags:
24
+ owner: geek-fun
25
+
26
+ functions:
27
+ insight_poc_fn:
28
+ name: insight-poc-fn
29
+ runtime: nodejs18
30
+ handler: ${vars.handler}
31
+ code: tests/fixtures/artifacts/artifact.zip
32
+ memory: 512
33
+ timeout: 10
34
+ environment:
35
+ NODE_ENV: ${stages.node_env}
36
+ TEST_VAR: ${vars.testv}
37
+ TEST_VAR_EXTRA: abcds-${vars.testv}-andyou
38
+
39
+ databases:
40
+ insight_poc_db:
41
+ name: insight-poc-db
42
+ type: RDS_POSTGRESQL_SERVERLESS
43
+ version: '17.0'
44
+ security:
45
+ basic_auth:
46
+ password: 'U34I6InQ8elseTgqTWT2t2oFXpoqFg'
47
+
48
+ events:
49
+ gateway_event:
50
+ type: API_GATEWAY
51
+ name: insight-poc-gateway
52
+ triggers:
53
+ - method: GET
54
+ path: /api/hello
55
+ backend: ${functions.insight_poc_fn}
56
+ # custom_domain:
57
+ # domain_name: test.com
58
+ # certificate_name: test
59
+ # certificate_private_key: test
60
+ # certificate_body: test
@@ -0,0 +1,24 @@
1
+ version: 0.0.1
2
+
3
+ provider:
4
+ name: aliyun
5
+ region: cn-chengdu
6
+
7
+
8
+ service: insight-rds-poc
9
+
10
+ tags:
11
+ owner: geek-fun
12
+
13
+ databases:
14
+ insight_poc_db:
15
+ name: insight-poc-rds
16
+ type: RDS_PGSQL_SERVERLESS
17
+ version: PGSQL_16
18
+ security:
19
+ basic_auth:
20
+ master_user: 'db_root'
21
+ password: 'U34I6InQ8elseTgqTWT2t2oFXpoqFg'
22
+ network:
23
+ type: 'PRIVATE'
24
+
@@ -0,0 +1,60 @@
1
+ version: 0.0.1
2
+ provider:
3
+ name: huawei
4
+ region: cn-north-4
5
+
6
+ vars:
7
+ testv: testVarValue
8
+ handler: index.handler
9
+
10
+ stages:
11
+ default:
12
+ node_env: default
13
+ dev:
14
+ region: ${vars.region}
15
+ node_env: development
16
+ prod:
17
+ node_env: prod
18
+ service: insight-poc
19
+
20
+ tags:
21
+ owner: geek-fun
22
+
23
+ functions:
24
+ insight_poc_fn:
25
+ name: insight-poc-fn
26
+ runtime: nodejs18
27
+ handler: ${vars.handler}
28
+ code: tests/fixtures/artifacts/artifact.zip
29
+ memory: 512
30
+ timeout: 10
31
+ environment:
32
+ NODE_ENV: ${stages.node_env}
33
+ TEST_VAR: ${vars.testv}
34
+ TEST_VAR_EXTRA: abcds-${vars.testv}-andyou
35
+
36
+ #databases:
37
+ # insight_es_db:
38
+ # name: insight-poc-es
39
+ # type: ELASTICSEARCH_SERVERLESS
40
+ # version: 7.10
41
+ # engine_mode: SEARCH
42
+ # security:
43
+ # basic_auth:
44
+ # password: 123456
45
+ # cu: 1
46
+ # storage_size: 20
47
+
48
+ events:
49
+ gateway_event:
50
+ type: API_GATEWAY
51
+ name: insight-poc-gateway
52
+ triggers:
53
+ - method: GET
54
+ path: /api/hello
55
+ backend: ${functions.insight_poc_fn}
56
+ # custom_domain:
57
+ # domain_name: test.com
58
+ # certificate_name: test
59
+ # certificate_private_key: test
60
+ # certificate_body: test
@@ -1 +0,0 @@
1
- "use strict";