mirror of
https://github.com/serverless/serverless.git
synced 2026-01-25 15:07:39 +00:00
115 lines
3.9 KiB
JavaScript
115 lines
3.9 KiB
JavaScript
'use strict';
|
|
|
|
const _ = require('lodash');
|
|
|
|
class AwsCompileIoTEvents {
|
|
constructor(serverless) {
|
|
this.serverless = serverless;
|
|
this.provider = this.serverless.getProvider('aws');
|
|
|
|
this.hooks = {
|
|
'package:compileEvents': this.compileIoTEvents.bind(this),
|
|
};
|
|
}
|
|
|
|
compileIoTEvents() {
|
|
this.serverless.service.getAllFunctions().forEach((functionName) => {
|
|
const functionObj = this.serverless.service.getFunction(functionName);
|
|
let iotNumberInFunction = 0;
|
|
|
|
if (functionObj.events) {
|
|
functionObj.events.forEach(event => {
|
|
if (event.iot) {
|
|
iotNumberInFunction++;
|
|
let RuleName;
|
|
let AwsIotSqlVersion;
|
|
let Description;
|
|
let RuleDisabled;
|
|
let Sql;
|
|
|
|
if (typeof event.iot === 'object') {
|
|
RuleName = event.iot.name;
|
|
AwsIotSqlVersion = event.iot.sqlVersion;
|
|
Description = event.iot.description;
|
|
RuleDisabled = false;
|
|
if (event.iot.enabled === false) {
|
|
RuleDisabled = true;
|
|
}
|
|
Sql = event.iot.sql;
|
|
} else {
|
|
const errorMessage = [
|
|
`IoT event of function "${functionName}" is not an object`,
|
|
' Please check the docs for more info.',
|
|
].join('');
|
|
throw new this.serverless.classes
|
|
.Error(errorMessage);
|
|
}
|
|
|
|
const lambdaLogicalId = this.provider.naming
|
|
.getLambdaLogicalId(functionName);
|
|
const iotLogicalId = this.provider.naming
|
|
.getIotLogicalId(functionName, iotNumberInFunction);
|
|
const lambdaPermissionLogicalId = this.provider.naming
|
|
.getLambdaIotPermissionLogicalId(functionName, iotNumberInFunction);
|
|
const iotTemplate = `
|
|
{
|
|
"Type": "AWS::IoT::TopicRule",
|
|
"Properties": {
|
|
${RuleName ? `"RuleName": "${RuleName.replace(/\r?\n/g, '')}",` : ''}
|
|
"TopicRulePayload": {
|
|
${AwsIotSqlVersion ? `"AwsIotSqlVersion":
|
|
"${AwsIotSqlVersion.replace(/\r?\n/g, '')}",` : ''}
|
|
${Description ? `"Description": "${Description.replace(/\r?\n/g, '')}",` : ''}
|
|
"RuleDisabled": "${RuleDisabled}",
|
|
"Sql": "${Sql.replace(/\r?\n/g, '')}",
|
|
"Actions": [
|
|
{
|
|
"Lambda": {
|
|
"FunctionArn": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] }
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
const permissionTemplate = `
|
|
{
|
|
"Type": "AWS::Lambda::Permission",
|
|
"Properties": {
|
|
"FunctionName": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] },
|
|
"Action": "lambda:InvokeFunction",
|
|
"Principal": "iot.amazonaws.com",
|
|
"SourceArn": { "Fn::Join": ["",
|
|
[
|
|
"arn:aws:iot:",
|
|
{ "Ref": "AWS::Region" },
|
|
":",
|
|
{ "Ref": "AWS::AccountId" },
|
|
":rule/",
|
|
{ "Ref": "${iotLogicalId}"}
|
|
]
|
|
] }
|
|
}
|
|
}
|
|
`;
|
|
|
|
const newIotObject = {
|
|
[iotLogicalId]: JSON.parse(iotTemplate),
|
|
};
|
|
|
|
const newPermissionObject = {
|
|
[lambdaPermissionLogicalId]: JSON.parse(permissionTemplate),
|
|
};
|
|
|
|
_.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources,
|
|
newIotObject, newPermissionObject);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
module.exports = AwsCompileIoTEvents;
|