Sử dụng CloudWatch Events để thông báo tình trạng ECS Task tới Slack
Bài đăng này đã không được cập nhật trong 4 năm
Chào các bạn hôm nay mình xin giới thiệu bài về sử dụng Cloudwatch Events để thông báo về Slack khi AWS ECS task gặp sự cố
-
CloudWatch Events là gì ?
Khi sử dụng CloudWatch Events, bạn sẽ định nghĩa một event pattern cho một AWS resources. Theo đó khi mà resources đó có hành động giống như trong pattern mình đã định nghĩa thì trigger sẽ được kích hoạt. Hôm nay mình sẽ giới thiệu sử dụng Lambda để gửi tin nhắn đến Slack thông báo khi mà ECS task bị Stopped vì một lý do nào đó (Có thể healthcheck Load Balancer failed, do user cố ý stop ECS task, ...)
-
Cấu trúc tổng quát
-
handler.js
const axios = require('axios'); // Search GG để lấy webhook url const SLACK_WEBHOOK = process.env.SLACK_WEBHOOK; const AWS_REGION = process.env.AWS_REGION; module.exports.notification = event => { if(event['source'] && event['source'] === 'aws.ecs') { const detail = event['detail']; const header = 'ECS task bị stop rồi đại ca ơi!!!'; let clusterName = detail['clusterArn'].split('/')[1]; let taskId = detail['taskArn'].split('/')[1]; let taskDefinition = detail['taskDefinitionArn'].split('/')[1]; let detailJson = JSON.stringify(detail, null, 2); let url = `https://${AWS_REGION}.console.aws.amazon.com/ecs/home?region=${AWS_REGION}#/clusters/${clusterName}/tasks/${taskId}/details`; let attachments = { 'text': `${header} \n Cluster: *${clusterName}* \n Task Definition: *${taskDefinition}* \n ${url}\n ` + "```" + `${detailJson}` + "```", 'color': 'danger' }; axios.post(SLACK_WEBHOOK, {attachments: [attachments]}); } };
-
serverless.yml
service: notification-ecs provider: name: aws stackName: ecs-${self:provider.stageName}-notification-lambda runtime: nodejs12.x region: ap-northeast-1 stageName: ${opt:stageName,self:custom.stageName} timeout: 30 memorySize: 128 custom: stageName: dev accounts: XXXXXXXXX resources: Resources: IamRoleLambdaExecution: Type: AWS::IAM::Role Properties: RoleName: EcsNotificationRole AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: myPolicyName PolicyDocument: Version: '2012-10-17' Statement: - Effect: "Allow" Action: - "s3:*" - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" Resource: "*" functions: notificationECS: handler: handler.notification environment: SLACK_WEBHOOK: 'https://hooks.slack.com/services/XXXXXXXX/YYYYYYYYY/VVVVVVVVVVVVVVVVVVVVVVVV' events: - eventBridge: pattern: source: - "aws.ecs" detail-type: - "ECS Task State Change" detail: clusterArn: - !Sub "arn:aws:ecs:${self:provider.region}:${self:custom.accounts.${self:provider.stageName}}:cluster/ecs-${self:provider.stageName}-cluster" lastStatus: - "STOPPED"
-
Deploy
$ sls deploy --profile xxxxxx --region aa-bbbbbb-Z
-
Test
Thử stop ECS task để xem tin nhắn đã về chưa !!
Cảm ơn các bạn đã đọc tới đây. Nếu có gì thắc mắc hãy comment dưới bài mình sẽ trả lời trong tầm hiểu biết của mình. Hẹn gặp lại các bạn ở bài tiếp theo!!!
All rights reserved