@geek-fun/serverlessinsight
Version:
Full life cycle cross providers serverless application management for your fast-growing business.
144 lines (143 loc) • 6.71 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveEvents = void 0;
const types_1 = require("../../types");
const ram = __importStar(require("@alicloud/ros-cdk-ram"));
const common_1 = require("../../common");
const agw = __importStar(require("@alicloud/ros-cdk-apigateway"));
const lodash_1 = require("lodash");
const dns = __importStar(require("@alicloud/ros-cdk-dns"));
const resolveEvents = (scope, events, tags, context, service) => {
if ((0, lodash_1.isEmpty)(events)) {
return undefined;
}
const apiGateway = events.filter((event) => event.type === types_1.EventTypes.API_GATEWAY);
if (!apiGateway?.length)
return;
apiGateway.forEach((event) => {
const gatewayAccessRole = new ram.RosRole(scope, (0, common_1.formatRosId)(`${event.key}_agw_role`), {
roleName: (0, common_1.calcRefs)(`${event.name}-agw-access-role`, context),
description: (0, common_1.calcRefs)(`${service} role`, context),
assumeRolePolicyDocument: {
version: '1',
statement: [
{
action: 'sts:AssumeRole',
effect: 'Allow',
principal: {
service: ['apigateway.aliyuncs.com'],
},
},
],
},
policies: [
{
policyName: (0, common_1.calcRefs)(`${service}-${event.name}-policy`, context),
policyDocument: {
version: '1',
statement: [
{
action: ['fc:InvokeFunction'],
effect: 'Allow',
// @TODO implement at least permission granting
resource: ['*'],
},
],
},
},
],
}, true);
const apiGatewayGroup = new agw.RosGroup(scope, (0, common_1.formatRosId)(`${event.key}_agw_group`), {
groupName: (0, common_1.calcRefs)(`${service}-agw-group`, context),
tags: (0, common_1.calcRefs)(tags, context),
passthroughHeaders: 'host',
}, true);
if (event.domain) {
const dnsRecordId = (0, common_1.formatRosId)(`${event.key}_agw_custom_domain_record`);
const { domainName, rr } = (0, common_1.splitDomain)(event.domain?.domain_name);
new dns.DomainRecord(scope, dnsRecordId, {
domainName,
rr,
type: 'CNAME',
value: apiGatewayGroup.attrSubDomain,
});
const agwCustomDomain = new agw.RosCustomDomain(scope, (0, common_1.formatRosId)(`${event.key}_agw_custom_domain`), {
groupId: apiGatewayGroup.attrGroupId,
domainName: event.domain.domain_name,
certificateName: event.domain.certificate_name,
certificateBody: event.domain.certificate_body,
certificatePrivateKey: event.domain.certificate_private_key,
}, true);
agwCustomDomain.addRosDependency(dnsRecordId);
}
event.triggers.forEach((trigger) => {
const key = (0, common_1.formatRosId)((0, common_1.calcValue)(`${trigger.method}_${trigger.path}`, context));
const api = new agw.RosApi(scope, (0, common_1.formatRosId)(`${event.key}_agw_api_${key}`), {
apiName: (0, common_1.calcRefs)(`${event.name}-agw-api-${key.replace(/_/g, '-')}`, context),
groupId: apiGatewayGroup.attrGroupId,
visibility: 'PRIVATE',
authType: 'ANONYMOUS',
requestConfig: {
requestProtocol: 'HTTP',
requestHttpMethod: (0, common_1.calcRefs)(trigger.method, context),
requestPath: (0, common_1.calcRefs)(trigger.path, context),
requestMode: 'PASSTHROUGH',
},
serviceConfig: {
serviceProtocol: 'FunctionCompute',
functionComputeConfig: {
fcRegionId: context.region,
functionName: (0, common_1.calcRefs)(trigger.backend, context),
roleArn: gatewayAccessRole.attrArn,
fcVersion: '3.0',
method: (0, common_1.calcRefs)(trigger.method, context),
},
},
resultSample: 'ServerlessInsight resultSample',
resultType: 'PASSTHROUGH',
tags: (0, common_1.calcRefs)(tags, context),
}, true);
api.addDependsOn(apiGatewayGroup);
new agw.Deployment(scope, (0, common_1.formatRosId)(`${event.key}_agw_api_deployment_${key}`), {
apiId: api.attrApiId,
groupId: apiGatewayGroup.attrGroupId,
stageName: 'RELEASE',
description: (0, common_1.calcRefs)(`${service} Api Gateway deployment for api: ${trigger.method} ${trigger.path}`, context),
});
});
});
};
exports.resolveEvents = resolveEvents;