Bài đăng này trình bày cách tự động hóa thông báo cảnh báo cho các lỗi chức năng AWS Lambda cụ thể bằng cách sử dụng đăng ký nhật ký Amazon CloudWatch . Nhật ký CloudWatch cho phép bạn gọi một hàm Lambda khi mục nhập nhật ký khớp với một mẫu. Báo động Amazon CloudWatch được sử dụng để thông báo khi xảy ra lỗi với một hàm Lambda; thông báo này không cung cấp bất kỳ thông tin cụ thể nào về lỗi. Đối với các tình huống mà bạn cần thông tin cụ thể về lỗi trong thông báo, bạn có thể sử dụng đăng ký Nhật ký CloudWatch. Đăng ký Nhật ký CloudWatch cho phép bạn khớp các mục nhập với một mẫu lỗi cụ thể trong nhật ký của mình và được thông báo với các chi tiết lỗi đó. Điều này giúp bạn tiết kiệm một bước bổ sung để phân tích qua các nhật ký và thực hiện hành động cần thiết. Bạn cũng có thể sử dụng điều này như một bản thiết kế để xây dựng các biện pháp phản ứng tự động khi phát hiện mẫu lỗi đó trong hàm Lambda của mình.
Bài đăng này hướng dẫn bạn cách cấu hình đăng ký nhật ký CloudWatch kích hoạt hàm AWS Lambda để xử lý nhật ký. Hàm Lambda sử dụng Amazon SNS để gửi email có thông tin chi tiết về lỗi cụ thể và vị trí nhật ký.
Kiến trúc cho giải pháp này khá đơn giản. Bạn có một loạt các hàm Lambda mà bạn muốn được thông báo về các lỗi nghiêm trọng cụ thể. CloudWatch Logs sẽ ghi lại các bản ghi từ các hàm Lambda này. Nó sẽ gọi hàm Lambda “xử lý lỗi” khi một mục nhật ký khớp với một mẫu bộ lọc, ví dụ: ERROR, CRITICAL hoặc lỗi tùy chỉnh. Hàm Lambda xử lý lỗi này sẽ lần lượt xuất bản một thông báo đến một chủ đề Amazon SNS, có thể đăng ký để nhận email khi lỗi xảy ra.
Đối với mục đích của bài đăng này, chúng tôi sẽ sử dụng hàm Lambda tạo lỗi mẫu sau:
import logging
import os
logging.basicConfig(level=logging.DEBUG)
logger=logging.getLogger(__name__)
def lambda_handler(event, context):
logger.setLevel(logging.DEBUG)
logger.debug("This is a sample DEBUG message.. !!")
logger.error("This is a sample ERROR message.... !!")
logger.info("This is a sample INFO message.. !!")
logger.critical("This is a sample 5xx error message.. !!")
Để triển khai giải pháp này, bạn phải tạo:
Để tạo chủ đề SNS, hãy hoàn thành các bước sau:
arn:aws:sns:us-east-1:123456789012:MySNSTopic
arn:aws:sns:us-east-1:123456789012:MySNSTopic
Để tạo vai trò IAM, hãy hoàn tất các bước sau. Để biết thêm thông tin, hãy xem Tạo vai trò IAM .
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "arn:<partition>:sns:<region>:<AWS account number>:<name of the SNS topic from previous step>"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:<partition>:logs:<region>:<AWS account number>:log-group:/aws/lambda/<name of the lambda function you are going to create in next step>:*"
}
]
3. Chọn Chính sách đánh giá .
4. Nhập tên ( MyCloudWatchRole ) cho chính sách này và chọn Tạo chính sách . Ghi chú tên của chính sách này cho các bước sau.
5. Trong ngăn điều hướng bên trái, chọn Vai trò và chọn Tạo vai trò .
6. Trên trang Chọn loại vai trò , hãy chọn dịch vụ AWS làm thực thể đáng tin cậy của bạn và chọn Lambda trong các trường hợp sử dụng phổ biến.
7. Chọn Tiếp theo: Quyền.
8. Lọc chính sách theo tên chính sách bạn vừa tạo và chọn hộp kiểm.
9. Chọn Tiếp theo: Thẻ và đặt thẻ thích hợp.
10. Chọn Tiếp theo: Xem lại . Đặt tên phù hợp cho vai trò IAM này và ghi chú lại để sử dụng sau này.
11. Chọn Tạo vai trò .
Để tạo hàm Lambda, hãy hoàn tất các bước sau. Để biết thêm thông tin, hãy xem Tạo hàm Lambda bằng bảng điều khiển .
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# A copy of the License is located at## http://aws.amazon.com/apache2.0/
# or in the "license" file accompanying this file.
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
# either express or implied. See the License for the specific language governing permissions
# and limitations under the License.
# Description: This Lambda function sends an email notification to a given AWS SNS topic when a particular
# pattern is matched in the logs of a selected Lambda function. The email subject is
# Execution error for Lambda-<insert Lambda function name>.
# The JSON message body of the SNS notification contains the full event details.
# Author: Sudhanshu Malhotra
import base64
import boto3
import gzip
import json
import logging
import os
from botocore.exceptions import ClientError
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def logpayload(event):
logger.setLevel(logging.DEBUG)
logger.debug(event['awslogs']['data'])
compressed_payload = base64.b64decode(event['awslogs']['data'])
uncompressed_payload = gzip.decompress(compressed_payload)
log_payload = json.loads(uncompressed_payload)
return log_payload
def error_details(payload):
error_msg = ""
log_events = payload['logEvents']
logger.debug(payload)
loggroup = payload['logGroup']
logstream = payload['logStream']
lambda_func_name = loggroup.split('/')
logger.debug(f'LogGroup: {loggroup}')
logger.debug(f'Logstream: {logstream}')
logger.debug(f'Function name: {lambda_func_name[3]}')
logger.debug(log_events)
for log_event in log_events:
error_msg += log_event['message']
logger.debug('Message: %s' % error_msg.split("\n"))
return loggroup, logstream, error_msg, lambda_func_name
def publish_message(loggroup, logstream, error_msg, lambda_func_name):
sns_arn = os.environ['snsARN'] # Getting the SNS Topic ARN passed in by the environment variables.
snsclient = boto3.client('sns')
try:
message = ""
message += "\nLambda error summary" + "\n\n"
message += "##########################################################\n"
message += "# LogGroup Name:- " + str(loggroup) + "\n"
message += "# LogStream:- " + str(logstream) + "\n"
message += "# Log Message:- " + "\n"
message += "# \t\t" + str(error_msg.split("\n")) + "\n"
message += "##########################################################\n"
# Sending the notification...
snsclient.publish(
TargetArn=sns_arn,
Subject=f'Execution error for Lambda - {lambda_func_name[3]}',
Message=message
)
except ClientError as e:
logger.error("An error occured: %s" % e)
def lambda_handler(event, context):
pload = logpayload(event)
lgroup, lstream, errmessage, lambdaname = error_details(pload)
publish_message(lgroup, lstream, errmessage, lambdaname)
6. Trong phần Biến môi trường , hãy nhập cặp khóa-giá trị sau:
7. Chọn Lưu .
Để xác thực giải pháp của mình, tôi sẽ chạy hàm Lambda tạo lỗi mẫu và lọc theo mẫu “ ?ERROR ?WARN ?5xx ” để nhận thông báo qua email như sau:
Tương tự như vậy, tôi có thể tạo mẫu bộ lọc cho bất kỳ lỗi cụ thể nào, ví dụ lỗi 5xx như được hiển thị và nhận được thông báo sau về thông báo lỗi đó:
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE