Skip to content
Snippets Groups Projects
Commit e1a4ce85 authored by Edouard DE BRYE's avatar Edouard DE BRYE
Browse files

refactor apigw.js and slack.py

parent 0207c962
No related branches found
No related tags found
No related merge requests found
......@@ -42,3 +42,23 @@ provider "registry.terraform.io/hashicorp/aws" {
"zh:f2b292e813844d6d611db89017fc420ac05f2e3b25324e3c893481d375e23396",
]
}
provider "registry.terraform.io/hashicorp/null" {
version = "3.1.0"
hashes = [
"h1:SFT7X3zY18CLWjoH2GfQyapxsRv6GDKsy9cF1aRwncc=",
"h1:vpC6bgUQoJ0znqIKVFevOdq+YQw42bRq0u+H3nto8nA=",
"h1:xhbHC6in3nQryvTQBWKxebi3inG5OCgHgc4fRxL0ymc=",
"zh:02a1675fd8de126a00460942aaae242e65ca3380b5bb192e8773ef3da9073fd2",
"zh:53e30545ff8926a8e30ad30648991ca8b93b6fa496272cd23b26763c8ee84515",
"zh:5f9200bf708913621d0f6514179d89700e9aa3097c77dac730e8ba6e5901d521",
"zh:9ebf4d9704faba06b3ec7242c773c0fbfe12d62db7d00356d4f55385fc69bfb2",
"zh:a6576c81adc70326e4e1c999c04ad9ca37113a6e925aefab4765e5a5198efa7e",
"zh:a8a42d13346347aff6c63a37cda9b2c6aa5cc384a55b2fe6d6adfa390e609c53",
"zh:c797744d08a5307d50210e0454f91ca4d1c7621c68740441cf4579390452321d",
"zh:cecb6a304046df34c11229f20a80b24b1603960b794d68361a67c5efe58e62b8",
"zh:e1371aa1e502000d9974cfaff5be4cfa02f47b17400005a16f14d2ef30dc2a70",
"zh:fc39cc1fe71234a0b0369d5c5c7f876c71b956d23d7d6f518289737a001ba69b",
"zh:fea4227271ebf7d9e2b61b89ce2328c7262acd9fd190e1fd6d15a591abfa848e",
]
}
......@@ -114,6 +114,7 @@ resource "aws_api_gateway_stage" "main" {
destination_arn = aws_cloudwatch_log_group.apigw_logs.arn
}
}
output "api_endpoint" {
value = aws_api_gateway_stage.main.invoke_url
}
......
......@@ -22,13 +22,8 @@ resource "aws_lambda_function" "apigw_logs" {
resource "aws_cloudwatch_log_subscription_filter" "lambdafunction_logfilter" {
name = "${local.prefix}-lambdafunction-subscription"
log_group_name = aws_cloudwatch_log_group.apigw_logs.name
filter_pattern = " "
filter_pattern = "{$.resourcePath = \"${aws_api_gateway_resource.access.path}\"}"
destination_arn = aws_lambda_function.apigw_logs.arn
lifecycle {
ignore_changes = [
filter_pattern
]
}
}
resource "aws_lambda_permission" "log_subscription" {
......@@ -39,6 +34,18 @@ resource "aws_lambda_permission" "log_subscription" {
source_arn = "${aws_cloudwatch_log_group.apigw_logs.arn}:*"
}
resource "null_resource" "lambda_logs_dependencies" {
provisioner "local-exec" {
command = "cd ${local.lambda_loc}/apigw_metrics && npm install"
}
triggers = {
package = base64sha256(file("${local.lambda_loc}/apigw_metrics/package.json"))
lock = base64sha256(file("${local.lambda_loc}/apigw_metrics/package-lock.json"))
node = base64sha256(join("", fileset(local.lambda_loc, "apigw_metrics/**/*.js")))
}
}
data "archive_file" "lambda_logs" {
type = "zip"
output_path = "${local.lambda_loc}/zip/apigw_metrics.zip"
......
......@@ -83,8 +83,22 @@ resource "aws_iam_role_policy_attachment" "lambda_insights" {
#########
# Files #
#########
resource "null_resource" "lambda_dependencies" {
provisioner "local-exec" {
command = "cd ${local.lambda_loc}/src && npm install"
}
triggers = {
package = base64sha256(file("${local.lambda_loc}/src/package.json"))
lock = base64sha256(file("${local.lambda_loc}/src/package-lock.json"))
node = base64sha256(join("", fileset(local.lambda_loc, "src/**/*.js")))
}
}
data "archive_file" "lambda_file" {
depends_on = [
null_resource.lambda_dependencies
]
type = "zip"
output_path = "${local.lambda_loc}/zip/lambda.zip"
source_dir = "${local.lambda_loc}/src"
......
......@@ -4,7 +4,7 @@ const CW = new AWS.CloudWatch()
const APIGW = new AWS.APIGateway()
exports.handler = async function(event,context){
return new Promise((resolve,reject)=>{
return new Promise((resolve,reject) => {
console.log("Event: "+JSON.stringify(event))
var payload = Buffer.from(event.awslogs.data, 'base64');
......@@ -31,7 +31,7 @@ exports.handler = async function(event,context){
MetricName: '400 Errors',
Dimensions: [
{
Name: 'API/REST',
Name: 'ApiName',
Value: data.name
},
{
......@@ -59,7 +59,7 @@ exports.handler = async function(event,context){
});
//when all logs are processed, send the PutMetricData request
Promise.all(promises).then(metrics=>{ //if all the promises (cf line 26) succed (equivalent to all the getRestApiPromise)
Promise.all(promises).then(metrics => { //if all the promises (cf line 26) succeed (equivalent to all the getRestApiPromise)
const params = {
MetricData:metrics,
Namespace: "APIGW/custom"
......
......@@ -2,19 +2,26 @@
import urllib3
import json
import os
from string import Template
http = urllib3.PoolManager()
def lambda_handler(event, context):
url = os.getenv("SLACK_WEBHOOK_URL")
print(json.dumps(event))
messages = [json.loads(i.get('Sns',{}).get('Message',"")) for i in event.get('Records',[])]
text=[]
for m in messages:
text.append("ALARM - Details :\n"+ \
"\t- Name : "+m.get('AlarmName')+"\n"+ \
"\t- Description : "+m.get('AlarmDescription')+"\n"+ \
"\t- New State Value : "+m.get('NewStateValue')+"\n"+ \
"\t- New State Reason : "+m.get('NewStateReason')+"\n"+ \
"\t- New State Time : "+m.get('StateChangeTime')+"\n")
#get all messages in dict format
messages = [json.loads(r.get('Sns',{}).get('Message','{}')) for r in event.get('Records',[])]
text = []
template = Template("\
ALARM - Details :\n\
\t- Name : $AlarmName \n\
\t- Description : $AlarmDescription \n\
\t- New State : $NewStateValue \n\
\t- Reason : $NewStateReason \n\
\t- Time : $StateChangeTime \n")
for message in messages:
text.append(template.substitute(message))
print("Number of messages : " +str(len(text)))
msg = {
"text": "\n-------\n".join(text)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment