--- AWSTemplateFormatVersion: '2010-09-09' Parameters: SlackChannel: Type: String Description: 'Please enter your Slack channel name:' HookURL: Type: String Description: 'Please enter the web hook url from Slack:' NoEcho: true Resources: LambdaFunctionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: "/" LambdaRolePolicies: Type: AWS::IAM::Policy Properties: PolicyName: LambdaPolicy PolicyDocument: Version: '2012-10-17' Statement: - Sid: Stmt12349896368829 Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Effect: Allow Resource: arn:aws:logs:*:*:* Roles: - Ref: LambdaFunctionRole SlackNotifierLambdaFn: Type: AWS::Lambda::Function Properties: Description: 'AWS PHD Slack Notifier' Handler: index.handler Role: Fn::GetAtt: - LambdaFunctionRole - Arn Code: ZipFile: Fn::Sub: | # Sample Lambda Function to post notifications to a slack channel when an AWS Health event happens from __future__ import print_function import boto3 import json import logging import os from urllib.request import Request, urlopen, URLError, HTTPError from urllib.parse import urlencode # Setting up logging logger = logging.getLogger() logger.setLevel(logging.INFO) # main function def handler(event, context): message = str( event['detail']['eventDescription'][0]['latestDescription'] + "\n\n for details." ) json.dumps(message) slack_message = { "channel": "${SlackChannel}", "text": message, "username": "AWS - Personal Health Updates" } logger.info(str(slack_message)) req = Request( "${HookURL}", data=json.dumps(slack_message).encode("utf-8"), headers={"content-type": "application/json"} ) try: response = urlopen(req) response.read() logger.info("Message posted to: %s", slack_message['channel']) except HTTPError as e: logger.error("Request failed : %d %s", e.code, e.reason) except URLError as e: logger.error("Server connection failed: %s", e.reason) Runtime: python3.7 Timeout: '60' LambdaInvokePermission: Type: AWS::Lambda::Permission Properties: FunctionName: Fn::GetAtt: - SlackNotifierLambdaFn - Arn Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: Fn::GetAtt: - CloudWatchEventRule - Arn CloudWatchEventRule: Type: AWS::Events::Rule Properties: Description: EventRule EventPattern: source: - aws.health State: ENABLED Targets: - Arn: Fn::GetAtt: - SlackNotifierLambdaFn - Arn Id: SlackNotifierLambdaFn