1
+ # SNS to Slack Alerts Module
2
+ # Provides clean, formatted Slack notifications via Lambda transformer
3
+
4
+ # SNS Topic for alerts
5
+ resource "aws_sns_topic" "alerts" {
6
+ name = " ${ var . prefix } -${ var . severity } -alerts"
7
+
8
+ tags = {
9
+ Name = " ${ var . prefix } -${ var . severity } -alerts"
10
+ Purpose = " ${ var . severity } level alerts via Slack"
11
+ Severity = var.severity
12
+ }
13
+ }
14
+
15
+ # Lambda function to transform SNS messages to Slack format
16
+ resource "aws_lambda_function" "sns_to_slack" {
17
+ function_name = " ${ var . prefix } -${ var . severity } -slack-alert"
18
+ role = aws_iam_role. lambda_execution . arn
19
+ handler = " index.handler"
20
+ runtime = " python3.10"
21
+ timeout = 30
22
+
23
+ filename = data. archive_file . lambda_zip . output_path
24
+ source_code_hash = data. archive_file . lambda_zip . output_base64sha256
25
+
26
+ environment {
27
+ variables = {
28
+ SLACK_WEBHOOK_URL = var.slack_webhook_url
29
+ ALERT_SEVERITY = var.severity
30
+ }
31
+ }
32
+
33
+ tags = {
34
+ Name = " ${ var . prefix } -${ var . severity } -slack-alert"
35
+ Purpose = " Transform SNS alerts to Slack format"
36
+ Severity = var.severity
37
+ }
38
+ }
39
+
40
+ # Lambda source code package
41
+ data "archive_file" "lambda_zip" {
42
+ type = " zip"
43
+ output_path = " /tmp/${ var . prefix } -${ var . severity } -slack-alert.zip"
44
+
45
+ source {
46
+ content = file (" ${ path . module } /slack_alert.py" )
47
+ filename = " index.py"
48
+ }
49
+ }
50
+
51
+ # IAM role for Lambda execution
52
+ resource "aws_iam_role" "lambda_execution" {
53
+ name = " ${ var . prefix } -${ var . severity } -slack-alert-role"
54
+
55
+ assume_role_policy = jsonencode ({
56
+ Version = " 2012-10-17"
57
+ Statement = [
58
+ {
59
+ Action = " sts:AssumeRole"
60
+ Effect = " Allow"
61
+ Principal = {
62
+ Service = " lambda.amazonaws.com"
63
+ }
64
+ }
65
+ ]
66
+ })
67
+ }
68
+
69
+ # Lambda execution policy
70
+ resource "aws_iam_role_policy" "lambda_execution" {
71
+ name = " ${ var . prefix } -${ var . severity } -slack-alert-policy"
72
+ role = aws_iam_role. lambda_execution . id
73
+
74
+ policy = jsonencode ({
75
+ Version = " 2012-10-17"
76
+ Statement = [
77
+ {
78
+ Effect = " Allow"
79
+ Action = [
80
+ " logs:CreateLogGroup" ,
81
+ " logs:CreateLogStream" ,
82
+ " logs:PutLogEvents"
83
+ ]
84
+ Resource = " arn:aws:logs:*:*:*"
85
+ }
86
+ ]
87
+ })
88
+ }
89
+
90
+ # SNS Topic Subscription to Lambda
91
+ resource "aws_sns_topic_subscription" "lambda" {
92
+ topic_arn = aws_sns_topic. alerts . arn
93
+ protocol = " lambda"
94
+ endpoint = aws_lambda_function. sns_to_slack . arn
95
+ }
96
+
97
+ # Allow SNS to invoke Lambda
98
+ resource "aws_lambda_permission" "allow_sns" {
99
+ statement_id = " AllowExecutionFromSNS"
100
+ action = " lambda:InvokeFunction"
101
+ function_name = aws_lambda_function. sns_to_slack . function_name
102
+ principal = " sns.amazonaws.com"
103
+ source_arn = aws_sns_topic. alerts . arn
104
+ }
0 commit comments