Amazon EventBridge - Slack Notification on Event

Amazon EventBridge is the solution to an ever-growing demand for globally managed events as a service. The primary use case for EventBridge, and where most of the hype is; is in the SaaS space, which aims to provide a decoupled way for vendors and customers to share a common event bus. In this example we're only going to cover a simple use case that was already possible with CloudWatch events; I figure it's still useful to give people a basic use case for EventBridge while they get their head around it.
Overview
We're going to be deploying a very simple Slack bot that alerts our channel on a log-in Event from CloudTrail. The code for this exercise is available at waanimalsinc/waanimals-sign-in-event-bridge.
Slack Setup
To start with we need a Slack bot setup that can be used to send messages to our channel. To set up a new Slack App, navigate to https://api.slack.com/apps and create a new app.
 
        Once you've named and selected your Slack group, go to the OAuth scope section of the app setup and ensure chat:write:bot is selected
 
        Then click Install App to Workspace
 
        Finally, make note of the OAuth token you are provided; we'll be using this shortly in our Serverless code
 
        Serverless Lambda Setup
Next, we need to create a simple Lambda function that will be triggered by the Amazon EventBridge. To do this we'll use Serverless.
I recommend pulling down my repository to work with:
git clone https://github.com/waanimalsinc/waanimals-sign-in-event-bridge.gitIf you choose to create a new Serverless project to work with, ensure you have the following:
serverless.yml
service: waanimals-sign-in-event-bridge
custom:
  pythonRequirements:
    dockerizePip: true
  environment: ${file(env.yml):dev}
provider:
  name: aws
  stage: dev
  region: ap-southeast-2
  runtime: python3.7
  environment:
    SLACK_API_TOKEN: ${self:custom.environment.SLACK_API_TOKEN}
    SLACK_CHANNEL_ID: ${self:custom.environment.SLACK_CHANNEL_ID}
functions:
  alert:
    handler: handler.alert
plugins:
  - serverless-python-requirementsrequirements.txtEventBridge Setup 1
requestshandler.py
import json
import requests
import os
slack_token = os.environ['SLACK_API_TOKEN']
slack_channel_id = os.environ['SLACK_CHANNEL_ID']
def alert(event, context):
    account = event['account']
    user = event['detail']['userIdentity']['arn']
    data = {
        "channel": slack_channel_id,
        "text": "Login to account %s with the identity %s" % (account, user)
    }
    resp = requests.post("https://slack.com/api/chat.postMessage", headers={
        'Content-Type': 'application/json;charset=UTF-8', 'Authorization': 'Bearer %s' % slack_token}, json=data)
    return {}env.yml
Replace the SLACK_API_TOKEN with the OAuth token you received when creating the Slack bot.
dev:
  SLACK_API_TOKEN: "xoxp-xxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  SLACK_CHANNEL_ID: "tech_development"Other
Also, ensure that the serverless-python-requirements plugin is installed in the serverless project by running the following:
serverless plugin install -n serverless-python-requirementsServerless Lambda Deploy
Deploy the lambda by running the following command
serverless deploy --stage devEventBridge Setup
Head over to the EventBridge portal and create a new Rule.
 
        Define a new Pattern and ensure you setup an AWS Console Sign-in service event
 
        Finally, select the Lambda function that we just deployed with Serverless
 
        Testing
To test the event, log in to the account you deployed the resources in and you should see a message similar to below
