@geek-fun/serverlessinsight 0.0.6 → 0.1.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/dist/package.json +22 -14
- package/dist/src/commands/deploy.js +2 -1
- package/dist/src/commands/destroy.js +10 -0
- package/dist/src/commands/index.js +28 -13
- package/dist/src/commands/template.js +26 -0
- package/dist/src/commands/validate.js +4 -5
- package/dist/src/common/actionContext.js +13 -7
- package/dist/src/common/constants.js +4 -0
- package/dist/src/common/iacHelper.js +48 -12
- package/dist/src/common/imsClient.js +52 -0
- package/dist/src/common/index.d.ts +3 -1
- package/dist/src/common/index.js +3 -1
- package/dist/src/common/providerEnum.js +11 -0
- package/dist/src/common/rosClient.js +92 -9
- package/dist/src/parser/databaseParser.js +27 -0
- package/dist/src/parser/eventParser.js +15 -0
- package/dist/src/parser/functionParser.js +20 -0
- package/dist/src/parser/index.d.ts +2 -0
- package/dist/src/parser/index.js +36 -0
- package/dist/src/parser/tagParser.js +10 -0
- package/dist/src/stack/deploy.js +57 -13
- package/dist/src/stack/index.d.ts +0 -2
- package/dist/src/stack/index.js +0 -16
- package/dist/src/stack/rfsStack/function.js +32 -0
- package/dist/src/stack/rfsStack/index.d.ts +9 -0
- package/dist/src/stack/rfsStack/index.js +39 -0
- package/dist/src/stack/rosStack/bootstrap.js +40 -0
- package/dist/src/stack/rosStack/database.js +78 -0
- package/dist/src/stack/rosStack/event.js +127 -0
- package/dist/src/stack/rosStack/function.js +88 -0
- package/dist/src/stack/rosStack/index.d.ts +7 -0
- package/dist/src/stack/rosStack/index.js +69 -0
- package/dist/src/stack/rosStack/rosStack.js +1 -0
- package/dist/src/stack/rosStack/stage.js +46 -0
- package/dist/src/stack/rosStack/tag.js +11 -0
- package/dist/src/stack/rosStack/vars.js +49 -0
- package/dist/src/types/assets.js +2 -0
- package/dist/src/types/domains/context.js +8 -0
- package/dist/src/types/domains/database.js +12 -0
- package/dist/src/types/domains/function.js +2 -0
- package/dist/src/types/domains/provider.js +2 -0
- package/dist/src/types/domains/tag.js +2 -0
- package/dist/src/types/domains/vars.js +2 -0
- package/dist/src/types/index.d.ts +44 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/validator/databaseSchema.js +41 -0
- package/dist/src/validator/eventSchema.js +41 -0
- package/dist/src/validator/functionSchema.js +45 -0
- package/dist/src/validator/iacSchema.js +42 -0
- package/dist/src/validator/index.d.ts +1 -0
- package/dist/src/validator/index.js +5 -0
- package/dist/src/validator/rootSchema.js +52 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +22 -14
- package/dist/src/common/provider.js +0 -11
- package/dist/src/stack/iacSchema.js +0 -145
- package/dist/src/stack/iacStack.js +0 -146
- package/dist/src/stack/parse.js +0 -46
- /package/dist/src/{types.js → types/domains/event.js} +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseYaml = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const functionParser_1 = require("./functionParser");
|
|
6
|
+
const eventParser_1 = require("./eventParser");
|
|
7
|
+
const databaseParser_1 = require("./databaseParser");
|
|
8
|
+
const tagParser_1 = require("./tagParser");
|
|
9
|
+
const yaml_1 = require("yaml");
|
|
10
|
+
const validator_1 = require("../validator");
|
|
11
|
+
const validateExistence = (path) => {
|
|
12
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
13
|
+
throw new Error(`File does not exist at path: ${path}`);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const transformYaml = (iacJson) => {
|
|
17
|
+
return {
|
|
18
|
+
service: iacJson.service,
|
|
19
|
+
version: iacJson.version,
|
|
20
|
+
provider: iacJson.provider,
|
|
21
|
+
vars: iacJson.vars,
|
|
22
|
+
stages: iacJson.stages,
|
|
23
|
+
functions: (0, functionParser_1.parseFunction)(iacJson.functions),
|
|
24
|
+
events: (0, eventParser_1.parseEvent)(iacJson.events),
|
|
25
|
+
databases: (0, databaseParser_1.parseDatabase)(iacJson.databases),
|
|
26
|
+
tags: (0, tagParser_1.parseTag)(iacJson.tags),
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const parseYaml = (iacLocation) => {
|
|
30
|
+
validateExistence(iacLocation);
|
|
31
|
+
const yamlContent = (0, node_fs_1.readFileSync)(iacLocation, 'utf8');
|
|
32
|
+
const iacJson = (0, yaml_1.parse)(yamlContent);
|
|
33
|
+
(0, validator_1.validateYaml)(iacJson);
|
|
34
|
+
return transformYaml(iacJson);
|
|
35
|
+
};
|
|
36
|
+
exports.parseYaml = parseYaml;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseTag = void 0;
|
|
4
|
+
const parseTag = (tags) => {
|
|
5
|
+
return [
|
|
6
|
+
{ key: 'iac-provider', value: 'ServerlessInsight' },
|
|
7
|
+
...Object.entries(tags ?? {}).map(([key, value]) => ({ key, value })),
|
|
8
|
+
];
|
|
9
|
+
};
|
|
10
|
+
exports.parseTag = parseTag;
|
package/dist/src/stack/deploy.js
CHANGED
|
@@ -15,28 +15,72 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
37
|
};
|
|
25
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.deployStack = void 0;
|
|
39
|
+
exports.generateStackTemplate = exports.deployStack = exports.generateRfsStackTemplate = exports.generateRosStackTemplate = void 0;
|
|
27
40
|
const ros = __importStar(require("@alicloud/ros-cdk-core"));
|
|
41
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
28
42
|
const common_1 = require("../common");
|
|
29
|
-
const
|
|
30
|
-
const
|
|
43
|
+
const rosStack_1 = require("./rosStack");
|
|
44
|
+
const rfsStack_1 = require("./rfsStack");
|
|
45
|
+
const lodash_1 = require("lodash");
|
|
46
|
+
const generateRosStackTemplate = (stackName, iac, context) => {
|
|
31
47
|
const app = new ros.App();
|
|
32
|
-
new
|
|
48
|
+
new rosStack_1.RosStack(app, iac, context);
|
|
33
49
|
const assembly = app.synth();
|
|
34
|
-
const
|
|
35
|
-
|
|
50
|
+
const { template } = assembly.getStackByName(stackName);
|
|
51
|
+
const assetFolderPath = (0, lodash_1.get)(assembly.tryGetArtifact(`${stackName}.assets`), 'file', '');
|
|
52
|
+
const assetsFileBody = node_fs_1.default.readFileSync(assetFolderPath);
|
|
53
|
+
const assets = {
|
|
54
|
+
rootPath: assembly.directory,
|
|
55
|
+
...JSON.parse(assetsFileBody.toString('utf-8').trim()),
|
|
56
|
+
};
|
|
57
|
+
return { template, assets };
|
|
58
|
+
};
|
|
59
|
+
exports.generateRosStackTemplate = generateRosStackTemplate;
|
|
60
|
+
const generateRfsStackTemplate = (stackName, iac, context) => {
|
|
61
|
+
const stack = new rfsStack_1.RfsStack(iac, context);
|
|
62
|
+
const hcl = stack.toHclTerraform();
|
|
63
|
+
console.log('HCL:', hcl);
|
|
64
|
+
return { template: hcl };
|
|
36
65
|
};
|
|
66
|
+
exports.generateRfsStackTemplate = generateRfsStackTemplate;
|
|
37
67
|
const deployStack = async (stackName, iac, context) => {
|
|
38
|
-
const { template } =
|
|
68
|
+
const { template, assets } = (0, exports.generateRosStackTemplate)(stackName, iac, context);
|
|
69
|
+
await (0, rosStack_1.prepareBootstrapStack)(context);
|
|
70
|
+
common_1.logger.info(`Deploying stack, publishing assets...`);
|
|
71
|
+
await (0, common_1.publishAssets)(assets, context);
|
|
72
|
+
common_1.logger.info(`Assets published! 🎉`);
|
|
39
73
|
await (0, common_1.rosStackDeploy)(stackName, template, context);
|
|
40
74
|
common_1.logger.info(`Stack deployed! 🎉`);
|
|
41
75
|
};
|
|
42
76
|
exports.deployStack = deployStack;
|
|
77
|
+
const generateStackTemplate = (stackName, iac, context) => {
|
|
78
|
+
if (iac.provider.name === common_1.ProviderEnum.ALIYUN) {
|
|
79
|
+
return (0, exports.generateRosStackTemplate)(stackName, iac, context);
|
|
80
|
+
}
|
|
81
|
+
else if (iac.provider.name === common_1.ProviderEnum.HUAWEI) {
|
|
82
|
+
return (0, exports.generateRfsStackTemplate)(stackName, iac, context);
|
|
83
|
+
}
|
|
84
|
+
return { template: '' };
|
|
85
|
+
};
|
|
86
|
+
exports.generateStackTemplate = generateStackTemplate;
|
package/dist/src/stack/index.js
CHANGED
|
@@ -1,21 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
3
|
exports.deployStack = void 0;
|
|
18
4
|
var deploy_1 = require("./deploy");
|
|
19
5
|
Object.defineProperty(exports, "deployStack", { enumerable: true, get: function () { return deploy_1.deployStack; } });
|
|
20
|
-
__exportStar(require("./parse"), exports);
|
|
21
|
-
__exportStar(require("./iacSchema"), exports);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveFunction = void 0;
|
|
4
|
+
const common_1 = require("../../common");
|
|
5
|
+
const fgsApplication = (context, service) => `
|
|
6
|
+
resource "huaweicloud_fgs_application" "${service}_app" {
|
|
7
|
+
name = "${service}-app"
|
|
8
|
+
description = "${service} application"
|
|
9
|
+
package_type = "event"
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
const fgsFunction = (fn, context, service) => `
|
|
13
|
+
resource "huaweicloud_fgs_function" "${fn.key}" {
|
|
14
|
+
name = "${fn.name}"
|
|
15
|
+
handler = "${fn.handler}"
|
|
16
|
+
runtime = "${fn.runtime}"
|
|
17
|
+
memory_size = ${fn.memory}
|
|
18
|
+
timeout = ${fn.timeout}
|
|
19
|
+
environment = ${JSON.stringify(fn.environment)}
|
|
20
|
+
code_type = "inline"
|
|
21
|
+
func_code = "${(0, common_1.resolveCode)(fn.code)}"
|
|
22
|
+
app = "huaweicloud_fgs_application.${service}_app.id"
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const resolveFunction = (stack, functions, context, service) => {
|
|
26
|
+
if (!functions) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const app = fgsApplication(context, service);
|
|
30
|
+
stack.appendHcl(app + '\n' + functions.map((fn) => fgsFunction(fn, context, service)).join('\n'));
|
|
31
|
+
};
|
|
32
|
+
exports.resolveFunction = resolveFunction;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ActionContext, ServerlessIac } from '../../types';
|
|
2
|
+
export declare class RfsStack {
|
|
3
|
+
private readonly iac;
|
|
4
|
+
private readonly context;
|
|
5
|
+
private hcl;
|
|
6
|
+
constructor(iac: ServerlessIac, context: ActionContext);
|
|
7
|
+
toHclTerraform(): string;
|
|
8
|
+
appendHcl(hcl: string): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RfsStack = void 0;
|
|
4
|
+
const function_1 = require("./function");
|
|
5
|
+
const provider = (stack, context) => {
|
|
6
|
+
const hcl = `
|
|
7
|
+
terraform {
|
|
8
|
+
required_providers {
|
|
9
|
+
huaweicloud = {
|
|
10
|
+
source = "huaweicloud/huaweicloud"
|
|
11
|
+
version = ">= 1.67.1"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
provider "huaweicloud" {
|
|
17
|
+
region = "${context.region}"
|
|
18
|
+
access_key = "${context.accessKeyId}"
|
|
19
|
+
secret_key = "${context.accessKeySecret}"
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
stack.appendHcl(hcl);
|
|
23
|
+
};
|
|
24
|
+
class RfsStack {
|
|
25
|
+
constructor(iac, context) {
|
|
26
|
+
this.iac = iac;
|
|
27
|
+
this.context = context;
|
|
28
|
+
this.hcl = '';
|
|
29
|
+
provider(this, context);
|
|
30
|
+
(0, function_1.resolveFunction)(this, iac.functions, context, iac.service);
|
|
31
|
+
}
|
|
32
|
+
toHclTerraform() {
|
|
33
|
+
return this.hcl;
|
|
34
|
+
}
|
|
35
|
+
appendHcl(hcl) {
|
|
36
|
+
this.hcl += hcl;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.RfsStack = RfsStack;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareBootstrapStack = void 0;
|
|
4
|
+
const common_1 = require("../../common");
|
|
5
|
+
const getBootstrapTemplate = async (context) => {
|
|
6
|
+
const iamInfo = await (0, common_1.getIamInfo)(context);
|
|
7
|
+
const stackName = `serverlessInsight-bootstrap-${iamInfo?.accountId}-${context.region}`;
|
|
8
|
+
const template = {
|
|
9
|
+
Description: 'ServerlessInsight Bootstrap Stack',
|
|
10
|
+
Metadata: {
|
|
11
|
+
'ALIYUN::ROS::Interface': {
|
|
12
|
+
TemplateTags: ['Bootstrap stack created by ServerlessInsight'],
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
ROSTemplateFormatVersion: '2015-09-01',
|
|
16
|
+
Resources: {
|
|
17
|
+
ServerlessInsight_artifacts_bucket: {
|
|
18
|
+
Type: 'ALIYUN::OSS::Bucket',
|
|
19
|
+
Properties: {
|
|
20
|
+
BucketName: {
|
|
21
|
+
'Fn::Sub': 'si-bootstrap-artifacts-${ALIYUN::AccountId}-${ALIYUN::Region}',
|
|
22
|
+
},
|
|
23
|
+
AccessControl: 'private',
|
|
24
|
+
DeletionForce: false,
|
|
25
|
+
EnableOssHdfsService: false,
|
|
26
|
+
RedundancyType: 'LRS',
|
|
27
|
+
ServerSideEncryptionConfiguration: {
|
|
28
|
+
SSEAlgorithm: 'KMS',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
return { stackName, template };
|
|
35
|
+
};
|
|
36
|
+
const prepareBootstrapStack = async (context) => {
|
|
37
|
+
const { stackName, template } = await getBootstrapTemplate(context);
|
|
38
|
+
await (0, common_1.rosStackDeploy)(stackName, template, context);
|
|
39
|
+
};
|
|
40
|
+
exports.prepareBootstrapStack = prepareBootstrapStack;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveDatabases = void 0;
|
|
37
|
+
const common_1 = require("../../common");
|
|
38
|
+
const types_1 = require("../../types");
|
|
39
|
+
const lodash_1 = require("lodash");
|
|
40
|
+
const esServerless = __importStar(require("@alicloud/ros-cdk-elasticsearchserverless"));
|
|
41
|
+
const resolveDatabases = (scope, databases, context) => {
|
|
42
|
+
if ((0, lodash_1.isEmpty)(databases)) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
databases.forEach((db) => {
|
|
46
|
+
if ([types_1.DatabaseEnum.ELASTICSEARCH_SERVERLESS].includes(db.type)) {
|
|
47
|
+
new esServerless.App(scope, (0, common_1.replaceReference)(db.key, context), {
|
|
48
|
+
appName: (0, common_1.replaceReference)(db.name, context),
|
|
49
|
+
appVersion: db.version,
|
|
50
|
+
authentication: {
|
|
51
|
+
basicAuth: [
|
|
52
|
+
{
|
|
53
|
+
password: (0, common_1.replaceReference)(db.security.basicAuth.password, context),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
quotaInfo: {
|
|
58
|
+
cu: db.cu,
|
|
59
|
+
storage: db.storageSize,
|
|
60
|
+
appType: db.engineMode === types_1.DatabaseEngineMode.TIMESERIES ? 'TRIAL' : 'STANDARD',
|
|
61
|
+
},
|
|
62
|
+
// network: [
|
|
63
|
+
// {
|
|
64
|
+
// type: 'PUBLIC_KIBANA',
|
|
65
|
+
// enabled: true,
|
|
66
|
+
// whiteIpGroup: [{ groupName: 'default', ips: ['0.0.0.0/24'] }],
|
|
67
|
+
// },
|
|
68
|
+
// {
|
|
69
|
+
// type: 'PUBLIC_ES',
|
|
70
|
+
// enabled: true,
|
|
71
|
+
// whiteIpGroup: [{ groupName: 'default', ips: ['0.0.0.0/24'] }],
|
|
72
|
+
// },
|
|
73
|
+
// ],
|
|
74
|
+
}, true);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
exports.resolveDatabases = resolveDatabases;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveEvents = void 0;
|
|
37
|
+
const types_1 = require("../../types");
|
|
38
|
+
const ram = __importStar(require("@alicloud/ros-cdk-ram"));
|
|
39
|
+
const common_1 = require("../../common");
|
|
40
|
+
const agw = __importStar(require("@alicloud/ros-cdk-apigateway"));
|
|
41
|
+
const lodash_1 = require("lodash");
|
|
42
|
+
const resolveEvents = (scope, events, tags, context, service) => {
|
|
43
|
+
if ((0, lodash_1.isEmpty)(events)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const apiGateway = events.filter((event) => event.type === types_1.EventTypes.API_GATEWAY);
|
|
47
|
+
if (apiGateway?.length) {
|
|
48
|
+
const gatewayAccessRole = new ram.RosRole(scope, (0, common_1.replaceReference)(`${service}_role`, context), {
|
|
49
|
+
roleName: (0, common_1.replaceReference)(`${service}-gateway-access-role`, context),
|
|
50
|
+
description: (0, common_1.replaceReference)(`${service} role`, context),
|
|
51
|
+
assumeRolePolicyDocument: {
|
|
52
|
+
version: '1',
|
|
53
|
+
statement: [
|
|
54
|
+
{
|
|
55
|
+
action: 'sts:AssumeRole',
|
|
56
|
+
effect: 'Allow',
|
|
57
|
+
principal: {
|
|
58
|
+
service: ['apigateway.aliyuncs.com'],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
policies: [
|
|
64
|
+
{
|
|
65
|
+
policyName: (0, common_1.replaceReference)(`${service}-policy`, context),
|
|
66
|
+
policyDocument: {
|
|
67
|
+
version: '1',
|
|
68
|
+
statement: [
|
|
69
|
+
{
|
|
70
|
+
action: ['fc:InvokeFunction'],
|
|
71
|
+
effect: 'Allow',
|
|
72
|
+
// @TODO implement at least permission granting
|
|
73
|
+
resource: ['*'],
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
}, true);
|
|
80
|
+
const apiGatewayGroup = new agw.RosGroup(scope, (0, common_1.replaceReference)(`${service}_apigroup`, context), {
|
|
81
|
+
groupName: (0, common_1.replaceReference)(`${service}_apigroup`, context),
|
|
82
|
+
tags: (0, common_1.replaceReference)(tags, context),
|
|
83
|
+
}, true);
|
|
84
|
+
// new agw.RosCustomDomain(
|
|
85
|
+
// this,
|
|
86
|
+
// 'customDomain',
|
|
87
|
+
// {
|
|
88
|
+
// domainName: 'example.com',
|
|
89
|
+
// certificateName: 'example.com',
|
|
90
|
+
// certificateBody: 'example.com',
|
|
91
|
+
// certificatePrivateKey: 'example.com',
|
|
92
|
+
// groupId: apiGatewayGroup.attrGroupId,
|
|
93
|
+
// },
|
|
94
|
+
// true,
|
|
95
|
+
// );
|
|
96
|
+
apiGateway.forEach((event) => {
|
|
97
|
+
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), {
|
|
100
|
+
apiName: (0, common_1.replaceReference)(`${event.name}_api_${key}`, context),
|
|
101
|
+
groupId: apiGatewayGroup.attrGroupId,
|
|
102
|
+
visibility: 'PRIVATE',
|
|
103
|
+
requestConfig: {
|
|
104
|
+
requestProtocol: 'HTTP',
|
|
105
|
+
requestHttpMethod: (0, common_1.replaceReference)(trigger.method, context),
|
|
106
|
+
requestPath: (0, common_1.replaceReference)(trigger.path, context),
|
|
107
|
+
requestMode: 'PASSTHROUGH',
|
|
108
|
+
},
|
|
109
|
+
serviceConfig: {
|
|
110
|
+
serviceProtocol: 'FunctionCompute',
|
|
111
|
+
functionComputeConfig: {
|
|
112
|
+
fcRegionId: context.region,
|
|
113
|
+
functionName: (0, common_1.replaceReference)(trigger.backend, context),
|
|
114
|
+
roleArn: gatewayAccessRole.attrArn,
|
|
115
|
+
fcVersion: '3.0',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
resultSample: 'ServerlessInsight resultSample',
|
|
119
|
+
resultType: 'JSON',
|
|
120
|
+
tags: (0, common_1.replaceReference)(tags, context),
|
|
121
|
+
}, true);
|
|
122
|
+
api.addDependsOn(apiGatewayGroup);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
exports.resolveEvents = resolveEvents;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveFunctions = void 0;
|
|
37
|
+
const common_1 = require("../../common");
|
|
38
|
+
const fc = __importStar(require("@alicloud/ros-cdk-fc3"));
|
|
39
|
+
const lodash_1 = require("lodash");
|
|
40
|
+
const ossDeployment = __importStar(require("@alicloud/ros-cdk-ossdeployment"));
|
|
41
|
+
const ros = __importStar(require("@alicloud/ros-cdk-core"));
|
|
42
|
+
const resolveFunctions = (scope, functions, context, service) => {
|
|
43
|
+
if ((0, lodash_1.isEmpty)(functions)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const fileSources = functions
|
|
47
|
+
?.filter(({ code }) => (0, common_1.readCodeSize)(code) > common_1.CODE_ZIP_SIZE_LIMIT)
|
|
48
|
+
.map(({ code, name }) => {
|
|
49
|
+
const fcName = (0, common_1.replaceReference)(name, context);
|
|
50
|
+
return { fcName, ...(0, common_1.getFileSource)(fcName, code) };
|
|
51
|
+
});
|
|
52
|
+
const destinationBucketName = ros.Fn.sub('si-bootstrap-artifacts-${ALIYUN::AccountId}-${ALIYUN::Region}');
|
|
53
|
+
const ossDeploymentId = `${service}_artifacts_code_deployment`;
|
|
54
|
+
if (!(0, lodash_1.isEmpty)(fileSources)) {
|
|
55
|
+
new ossDeployment.BucketDeployment(scope, ossDeploymentId, {
|
|
56
|
+
sources: fileSources.map(({ source }) => source),
|
|
57
|
+
destinationBucket: destinationBucketName,
|
|
58
|
+
timeout: 3000,
|
|
59
|
+
logMonitoring: false,
|
|
60
|
+
retainOnCreate: false,
|
|
61
|
+
}, true);
|
|
62
|
+
}
|
|
63
|
+
functions?.forEach((fnc) => {
|
|
64
|
+
const storeInBucket = (0, common_1.readCodeSize)(fnc.code) > common_1.CODE_ZIP_SIZE_LIMIT;
|
|
65
|
+
let code = {
|
|
66
|
+
zipFile: (0, common_1.resolveCode)(fnc.code),
|
|
67
|
+
};
|
|
68
|
+
if (storeInBucket) {
|
|
69
|
+
code = {
|
|
70
|
+
ossBucketName: destinationBucketName,
|
|
71
|
+
ossObjectName: fileSources?.find(({ fcName }) => fcName === (0, common_1.replaceReference)(fnc.name, context))?.objectKey,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const fcn = new fc.RosFunction(scope, fnc.key, {
|
|
75
|
+
functionName: (0, common_1.replaceReference)(fnc.name, context),
|
|
76
|
+
handler: (0, common_1.replaceReference)(fnc.handler, context),
|
|
77
|
+
runtime: (0, common_1.replaceReference)(fnc.runtime, context),
|
|
78
|
+
memorySize: (0, common_1.replaceReference)(fnc.memory, context),
|
|
79
|
+
timeout: (0, common_1.replaceReference)(fnc.timeout, context),
|
|
80
|
+
environmentVariables: (0, common_1.replaceReference)(fnc.environment, context),
|
|
81
|
+
code,
|
|
82
|
+
}, true);
|
|
83
|
+
if (storeInBucket) {
|
|
84
|
+
fcn.addRosDependency(`${service}_artifacts_code_deployment`);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
exports.resolveFunctions = resolveFunctions;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as ros from '@alicloud/ros-cdk-core';
|
|
2
|
+
import { ActionContext, ServerlessIac } from '../../types';
|
|
3
|
+
export * from './bootstrap';
|
|
4
|
+
export declare class RosStack extends ros.Stack {
|
|
5
|
+
private readonly service;
|
|
6
|
+
constructor(scope: ros.Construct, iac: ServerlessIac, context: ActionContext);
|
|
7
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.RosStack = void 0;
|
|
40
|
+
const ros = __importStar(require("@alicloud/ros-cdk-core"));
|
|
41
|
+
const common_1 = require("../../common");
|
|
42
|
+
const tag_1 = require("./tag");
|
|
43
|
+
const function_1 = require("./function");
|
|
44
|
+
const stage_1 = require("./stage");
|
|
45
|
+
const vars_1 = require("./vars");
|
|
46
|
+
const database_1 = require("./database");
|
|
47
|
+
const event_1 = require("./event");
|
|
48
|
+
__exportStar(require("./bootstrap"), exports);
|
|
49
|
+
class RosStack extends ros.Stack {
|
|
50
|
+
constructor(scope, iac, context) {
|
|
51
|
+
super(scope, (0, common_1.replaceReference)(iac.service, context), {
|
|
52
|
+
stackName: context.stackName,
|
|
53
|
+
tags: (0, tag_1.resolveTags)(iac.tags, context),
|
|
54
|
+
});
|
|
55
|
+
this.service = (0, common_1.replaceReference)(iac.service, context);
|
|
56
|
+
new ros.RosInfo(this, ros.RosInfo.description, `${this.service} stack`);
|
|
57
|
+
// Define Parameters
|
|
58
|
+
(0, vars_1.resloveVars)(this, iac.vars);
|
|
59
|
+
// Define Mappings
|
|
60
|
+
(0, stage_1.resolveStages)(this, iac.stages, context);
|
|
61
|
+
// Define functions
|
|
62
|
+
(0, function_1.resolveFunctions)(this, iac.functions, context, this.service);
|
|
63
|
+
// Define Events
|
|
64
|
+
(0, event_1.resolveEvents)(this, iac.events, iac.tags, context, this.service);
|
|
65
|
+
// Define Databases
|
|
66
|
+
(0, database_1.resolveDatabases)(this, iac.databases, context);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.RosStack = RosStack;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|