This application produces events based on SAP Business ByDesign objects' changes. It works by pulling data, every minute, from OData services and checking if there were changes. It has a serverless, loosely coupled architecture and has been implemented using AWS Serverless Application Model.
- AWS Account (free tier will do it)
- SAM CLI - Install the SAM CLI
- SAP Business ByDesign Tenant
- These ByD Custom Odata Services for Invoices, Customers, Sales Orders and Service Orders
Clone or download this repository:
git clone https://github.com/B1SA/byd-delta-events.git
Update the environment variables located on the template.yaml file. The minimum requirement is the BYD credentials.
From its root folder, build and deploy it to your account.
sam build
sam deploy --guided
For details on how to deploy/test it locally check README-SAM
You can easily enhance this solution to support more SAP Business ByDesign objects or to implement new subscribers that will receive the events
1 - Add the new object OData endpoint details on the env variables for the get-byd-objects functions on template.yaml
NOTE: the OData service must expose at least the Object ID, LastChangeDateTime and CreationDateTime attributes
Environment:
Variables:
#ByD Details
BYD_ODATA: "https://my000000.sapbydesign.com/sap/byd/odata/cust/v1"
BYD_AUTH: "user:password base64 encoded"
BYD_NEWOBJECT: "/newObject/newObjectCollection"
BYD_NEWOBJECT_ID: "ID"
2 - Create a new promise to invoke the new object service in the get-byd-objects function:
let NewObject = function (lastRun) {
return new Promise(function (resolve, reject) {
console.log("Retrieving ByD New Objects")
getBydObject(lastRun, process.env.BYD_NEWOBJECT, process.env.BYD_NEWOBJECT_ID).then((data) => {
console.log(data.length + "ByD New Objects Retrieved")
resolve(data)
})
})
}
3 - Add the call for the NewObject promise to the getBydObjectsPromises array
const getBydObjectsPromises = [ SalesInvoices(data.lastRun.S),
Customers(data.lastRun.S),
SalesOrders(data.lastRun.S),
ServiceOrders(data.lastRun.S),
NewObject(data.lastRun.S)]
A practical example in this commit
To add a new subscriber to to the notification system, do the following on the template.yaml file:
1 - Add the new subscriber details (in this case a new Lambda Function)
#New Subscriber Function
NewSubscriberFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: new-subscriber-function/
Handler: app.lambdaHandler
Runtime: nodejs12.x
2 - Add the new function as a subscriber to the existing SNS topic BydEventTopic
Subscription:
- Protocol: lambda
Endpoint: !GetAtt NewSubscriberFunction.Arn
3 - Define a new invoke permission for the new function
NewSubscriberFunctionInvokePermission:
Type: 'AWS::Lambda::Permission'
Properties:
Action: 'lambda:InvokeFunction'
FunctionName: !Ref NewSubscriberFunction
Principal: sns.amazonaws.com
A practical example of those changes can be found in here
4 - The last step is to implement the New Subscriber's function as shown on this commit
5 - Redeploy the app
This repository is provided "as-is". No support is available. Feel free to open issues or provide pull requests.
Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This project is licensed under the Apache Software License, version 2.0 except as noted otherwise in the LICENSE file.