From e342d934393683c91d2411153ebd06479463708e Mon Sep 17 00:00:00 2001 From: Javier Bravo Date: Fri, 17 Mar 2017 13:09:58 +0000 Subject: [PATCH 1/5] #5 Create metric and alarm to track exception for TaskRunner --- lambda_cron/template.cfn.yml | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lambda_cron/template.cfn.yml b/lambda_cron/template.cfn.yml index 4ca7c9d..b9cfb2d 100644 --- a/lambda_cron/template.cfn.yml +++ b/lambda_cron/template.cfn.yml @@ -120,8 +120,8 @@ Resources: Protocol: "email" TopicName: !Sub LambdaCron-${Environment} - LambdaCronAalarm: - Type: "AWS::CloudWatch::Alarm" + LambdaCronAlarm: + Type: AWS::CloudWatch::Alarm Condition: IsAlarmActive Properties: Namespace: AWS/Lambda @@ -144,6 +144,40 @@ Resources: AlarmDescription: !Sub Errors in LambdaCron ${Environment} ActionsEnabled: True + LambdaCronErrorsMetric: + Type: AWS::Logs::MetricFilter + Properties: + LogGroupName: !Sub /aws/lambda/LambdaCron-${Environment} + FilterPattern: "ERROR" + MetricTransformations: + - MetricValue: '1' + MetricNamespace: !Sub LambdaCron-${Environment}/Errors + MetricName: ErrorsCount + + LambdaCronErrorsAlarm: + Type: AWS::CloudWatch::Alarm + Condition: IsAlarmActive + Properties: + Namespace: !Sub LambdaCron-${Environment}/Errors + MetricName: ErrorsCount + ComparisonOperator: GreaterThanOrEqualToThreshold + Threshold: 1 + Statistic: Sum + Unit: Count + Period: !Ref AlarmPeriod + EvaluationPeriods: '1' + Dimensions: + - Name: FunctionName + Value: + Ref: LambdaCronFunction + - Name: Resource + Value: + Ref: LambdaCronFunction + AlarmActions: + - Ref: LambdaCronSNSTopic + AlarmDescription: !Sub Errors running tasks for LambdaCron ${Environment} + ActionsEnabled: True + Outputs: LambdaCronFunction: Value: !Ref LambdaCronFunction From 49498611b46564e9f2eb6cee9a6845ac715c957d Mon Sep 17 00:00:00 2001 From: Javier Bravo Date: Mon, 20 Mar 2017 11:29:30 +0000 Subject: [PATCH 2/5] #5 Fix template for custom metric and alarm --- lambda_cron/template.cfn.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lambda_cron/template.cfn.yml b/lambda_cron/template.cfn.yml index b9cfb2d..943a635 100644 --- a/lambda_cron/template.cfn.yml +++ b/lambda_cron/template.cfn.yml @@ -163,16 +163,8 @@ Resources: ComparisonOperator: GreaterThanOrEqualToThreshold Threshold: 1 Statistic: Sum - Unit: Count Period: !Ref AlarmPeriod EvaluationPeriods: '1' - Dimensions: - - Name: FunctionName - Value: - Ref: LambdaCronFunction - - Name: Resource - Value: - Ref: LambdaCronFunction AlarmActions: - Ref: LambdaCronSNSTopic AlarmDescription: !Sub Errors running tasks for LambdaCron ${Environment} From 73d55892f94d4bb93cf6857fd968bf910d84c7e9 Mon Sep 17 00:00:00 2001 From: Javier Bravo Date: Sun, 16 Apr 2017 16:42:30 +0100 Subject: [PATCH 3/5] #5 create LogGroup to use for custom metric --- lambda_cron/template.cfn.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lambda_cron/template.cfn.yml b/lambda_cron/template.cfn.yml index 943a635..e12d7cc 100644 --- a/lambda_cron/template.cfn.yml +++ b/lambda_cron/template.cfn.yml @@ -111,7 +111,7 @@ Resources: SourceArn: !GetAtt LambdaCronHourlyEvent.Arn LambdaCronSNSTopic: - Type: "AWS::SNS::Topic" + Type: AWS::SNS::Topic Condition: IsAlarmActive Properties: Subscription: @@ -120,6 +120,12 @@ Resources: Protocol: "email" TopicName: !Sub LambdaCron-${Environment} + LambdaCronLogGroup: + Type: AWS::Logs::LogGroup + Properties: + LogGroupName: !Sub /aws/lambda/LambdaCron-${Environment} + RetentionInDays: 90 + LambdaCronAlarm: Type: AWS::CloudWatch::Alarm Condition: IsAlarmActive @@ -147,7 +153,7 @@ Resources: LambdaCronErrorsMetric: Type: AWS::Logs::MetricFilter Properties: - LogGroupName: !Sub /aws/lambda/LambdaCron-${Environment} + LogGroupName: !Ref LambdaCronLogGroup FilterPattern: "ERROR" MetricTransformations: - MetricValue: '1' From e25774778f360be9047ed4178a3ac8dd1c58a167 Mon Sep 17 00:00:00 2001 From: Javier Bravo Date: Sun, 16 Apr 2017 18:35:37 +0100 Subject: [PATCH 4/5] #5 Update command to create bucket in same region as deployed --- lambda_cron/cli/cli_tool.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lambda_cron/cli/cli_tool.py b/lambda_cron/cli/cli_tool.py index 24a4d4b..d8cda40 100755 --- a/lambda_cron/cli/cli_tool.py +++ b/lambda_cron/cli/cli_tool.py @@ -257,6 +257,9 @@ def bucket_exists(self): command_result = self.exec_aws_command(check_bucket_command) return command_result == 0 + def get_s3_bucket_uri(self): + return "s3://{bucket_name}".format(bucket_name=self.config.bucket) + def check_bucket(self): bucket_exists = self.bucket_exists() if self.cli.create_bucket: @@ -265,7 +268,7 @@ def check_bucket(self): exit(1) else: print "Creating bucket '{}'".format(self.config.bucket) - create_bucket_command = ["aws", "s3api", "create-bucket", "--bucket", self.config.bucket] + create_bucket_command = ["aws", "s3", "mb", self.get_s3_bucket_uri()] self.exec_aws_command(create_bucket_command) else: if not bucket_exists: @@ -298,7 +301,7 @@ def delete(self): self.run_aws_cloudformation_wait_command('delete') if self.cli.delete_bucket: - delete_bucket_command = ["aws", "s3api", "delete-bucket", "--bucket", self.config.bucket] + delete_bucket_command = ["aws", "s3", "rb", self.get_s3_bucket_uri()] self.exec_aws_command(delete_bucket_command) def invoke(self): From 3d3a89a60e27ca6f9eb03b721108d0e6d8a300fa Mon Sep 17 00:00:00 2001 From: Javier Bravo Date: Sun, 16 Apr 2017 19:01:56 +0100 Subject: [PATCH 5/5] #5 Update tests --- tests/test_cli_tool.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/test_cli_tool.py b/tests/test_cli_tool.py index 422ecc2..050cc90 100644 --- a/tests/test_cli_tool.py +++ b/tests/test_cli_tool.py @@ -184,10 +184,9 @@ def test_delete_command_with_delete_bucket(monkeypatch): assert '--profile' not in lambda_cron.commands_list[0] assert 'stack-delete-complete' in lambda_cron.commands_list[1] assert '--profile' not in lambda_cron.commands_list[1] - assert 's3api' in lambda_cron.commands_list[2] - assert 'delete-bucket' in lambda_cron.commands_list[2] - assert '--bucket' in lambda_cron.commands_list[2] - assert 'test-bucket-custom' in lambda_cron.commands_list[2] + assert 's3' in lambda_cron.commands_list[2] + assert 'rb' in lambda_cron.commands_list[2] + assert 's3://test-bucket-custom' in lambda_cron.commands_list[2] def test_add_profile_to_delete_commands(monkeypatch): @@ -472,10 +471,9 @@ def test_check_bucket_need_create_bucket(bucket_exists_mock, monkeypatch): assert len(lambda_cron.commands_list) == 1 assert "aws" in lambda_cron.commands_list[0] - assert "s3api" in lambda_cron.commands_list[0] - assert "create-bucket" in lambda_cron.commands_list[0] - assert "--bucket" in lambda_cron.commands_list[0] - assert "test-bucket-custom" in lambda_cron.commands_list[0] + assert "s3" in lambda_cron.commands_list[0] + assert "mb" in lambda_cron.commands_list[0] + assert "s3://test-bucket-custom" in lambda_cron.commands_list[0] @patch.object(LambdaCronCLISpy, 'bucket_exists')