diff --git a/packages/nodes-base/nodes/Aws/AwsLambda.node.ts b/packages/nodes-base/nodes/Aws/AwsLambda.node.ts new file mode 100644 index 0000000000..bcbbca63a2 --- /dev/null +++ b/packages/nodes-base/nodes/Aws/AwsLambda.node.ts @@ -0,0 +1,145 @@ +import { IExecuteFunctions } from 'n8n-core'; +import { + INodeTypeDescription, + INodeExecutionData, + INodeType, + INodePropertyOptions, + ILoadOptionsFunctions, + IDataObject +} from 'n8n-workflow'; + +import { awsConfigCredentials } from './GenericFunctions'; + +import { Lambda } from 'aws-sdk'; + +export class AwsLambda implements INodeType { + description: INodeTypeDescription = { + displayName: 'AWS Lambda', + name: 'awsLambda', + icon: 'file:lambda.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["function"]}}', + description: 'Invoke functions on AWS Lambda', + defaults: { + name: 'AWS Lambda', + color: '#FF9900', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'aws', + required: true, + } + ], + properties: [ + { + displayName: 'Function', + name: 'function', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getFunctions', + }, + options: [], + default: '', + required: true, + description: 'The function you want to invoke', + }, + { + displayName: 'Qualifier', + name: 'qualifier', + type: 'string', + required: true, + default: '$LATEST', + description: 'Specify a version or alias to invoke a published version of the function', + }, + { + displayName: 'Invocation Type', + name: 'invocationType', + type: 'options', + options: [ + { + name: 'Wait for results', + value: 'RequestResponse', + description: 'Invoke the function synchronously and wait for the response', + }, + { + name: 'Continue workflow', + value: 'Event', + description: 'Invoke the function and immediately continue the workflow', + }, + ], + default: 'RequestResponse', + description: 'Specify if the workflow should wait for the function to return the results', + }, + { + displayName: 'JSON Input', + name: 'payload', + type: 'string', + default: '', + description: 'The JSON that you want to provide to your Lambda function as input', + typeOptions: { + alwaysOpenEditWindow: true, + }, + }, + ], + }; + + methods = { + loadOptions: { + async getFunctions(this: ILoadOptionsFunctions): Promise { + await awsConfigCredentials.call(this); + + const returnData: INodePropertyOptions[] = []; + + let lambda = new Lambda(); + try { + var data = await lambda.listFunctions({}).promise(); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + + for (let func of data.Functions!) { + returnData.push({ + name: func.FunctionName as string, + value: func.FunctionArn as string, + }); + } + return returnData; + } + }, + }; + + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + await awsConfigCredentials.call(this); + const lambda = new Lambda(); + + for (let i = 0; i < items.length; i++) { + const params = { + FunctionName: this.getNodeParameter('function', i) as string, + InvocationType: this.getNodeParameter('invocationType', i) as string, + Payload: this.getNodeParameter('payload', i) as string, + Qualifier: this.getNodeParameter('qualifier', i) as string, + }; + + try { + var responseData = await lambda.invoke(params).promise(); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + + returnData.push({ + StatusCode: responseData.StatusCode, + Result: responseData.Payload, + Error: responseData.FunctionError, + } as IDataObject); + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Aws/lambda.png b/packages/nodes-base/nodes/Aws/lambda.png new file mode 100644 index 0000000000..d98d8f3cdc Binary files /dev/null and b/packages/nodes-base/nodes/Aws/lambda.png differ