>  기사  >  백엔드 개발  >  Go AWS Lambda 함수를 사용하여 Slack 알림 보내기

Go AWS Lambda 함수를 사용하여 Slack 알림 보내기

WBOY
WBOY원래의
2024-07-17 14:03:57520검색

소개

이 기사에서는 AWS 인스턴스의 CPU 사용률이 50%에 도달할 때 Slack 알림을 보내는 AWS 람다 함수를 생성하는 방법에 대해 설명합니다.

AWS Lambda는 Amazon Web Services(AWS)에서 제공하는 서버리스 컴퓨팅 서비스입니다. 서버를 직접 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있습니다.

이벤트 기반입니다. 즉, s3에서 완료된 파일 업로드, Amazon API Gateway의 HTTP 요청 또는 기타 다양한 트리거와 같은 다른 AWS 서비스에 의해 트리거된 이벤트에 응답하여 코드가 실행됩니다.

여기에서는 Amazon Cloudwatch를 설정하여 EC2 인스턴스에서 측정항목을 모니터링하고 수집하는 방법, 해당 측정항목을 기반으로 특정 임계값이나 조건이 충족될 때 알림을 트리거하는 Cloudwatch 경보, Amazon Simple 알림 서비스를 설정하는 방법에 대해 설명합니다. 이러한 알림을 받고 마지막으로 SNS 주제를 구독하는 람다 함수가 알림을 처리하고 Slack 메시지를 보냅니다.

전제조건

이를 따라가기 위해서는 독자가

에 대한 기본 지식과 이해를 갖추고 있어야 합니다.
  • 골랑
  • AWS와 해당 서비스 ### 프로젝트 설정 먼저 이러한 알림을 Slack에 보내는 기능을 작성하는 것부터 시작하겠습니다.

새 Go 프로젝트를 만들고 원하는 대로 부르세요. 저는 main.go 파일에 "lambdaFunction"이라고 부르고 다음 코드를 붙여넣습니다.

import (
   "bytes"
   "context"
   "encoding/json"
   "fmt"
   "github.com/aws/aws-lambda-go/events"
   "github.com/aws/aws-lambda-go/lambda"
   "net/http"
)

type slackMessage struct {
   Text string `json:"text"`
}

func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
    webhookURL := "https://hooks.slack.com/services/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"
    for _, record := range snsEvent.Records {
        snsRecord := record.SNS
        sendSlackNotification(webhookURL, snsRecord.Message)
    }
    return nil
}

func sendSlackNotification(webhookURL, message string) {
   slackMessage := slackMessage{Text: "Cpu usage is above 50%" + message}
   slackBody, _ := json.Marshal(slackMessage)
   req, err := http.NewRequest(http.MethodPost, webhookURL, bytes.NewBuffer(slackBody))
   if err != nil {
      fmt.Printf("Error creating request: %v\n", err)
      return
   }
   req.Header.Set("Content-Type", "application/json")

   client := &http.Client{}
   resp, err := client.Do(req)
   if err != nil {
      fmt.Printf("Error sending request: %v\n", err)
   }
   defer resp.Body.Close()
   if resp.StatusCode != http.StatusOK {
      fmt.Printf("Error response from slack: %v\n", resp.StatusCode)
   } else {
      fmt.Printf("Successfully sent Slack notification: %v\n", resp.StatusCode)
   }
}



func main() {
   lambda.Start(handleRequest)
}

런 고 모드

무슨 일이 일어나고 있는지 이해하려고 노력합시다
handlerRequest 함수

  • 먼저 Slack으로 전송되는 메시지 형식을 나타내기 위해 slackMessage라는 구조체를 생성합니다. 이 구조체에는 메시지 내용을 보관하는 단일 필드 Text가 있습니다.
  • handleRequest 함수는 람다 런타임에서 실행되는 주요 함수입니다. 두 개의 인수 컨텍스트와 snsEvent events.SNSEvent를 사용하여 들어오는 SNS 알림에 대한 세부 정보를 포함합니다.
  • 이 함수는 snsEvent 내의 각 snsRecord를 반복하여 sns.message 필드에서 메시지 콘텐츠를 검색하고 slack 웹후크 URL 및 메시지 콘텐츠로 sendSlackNotification을 호출합니다.

slackNotification 보내기 기능

  • 이 함수는 두 개의 인수 webhookURL(Slack 알림이 전송되는 URL)과 message(Slack으로 전송될 메시지 콘텐츠)를 사용합니다.
  • 제공된 메시지에 "cpu 사용량이 50%를 초과합니다"라는 미리 정의된 메시지를 추가했습니다. 그런 다음 json.marshal을 사용하여 slackMessage 구조체를 JSON 형식으로 마샬링합니다.
  • HTTP 게시 요청은 Slack 웹훅 URL, JSON 형식 본문 및 application.json으로 설정된 콘텐츠 유형 헤더와 함께 http.NewRequest를 사용하여 생성됩니다. *요청은 http.client를 사용하여 전송되고 응답이 수신됩니다. main 함수는 로컬 테스트에만 사용됩니다. 람다 환경에서 Lamba.start 함수는 진입점으로 HandleRequest를 사용하여 자동으로 호출됩니다

Slack 웹훅 URL 가져오기

Slack에 메시지를 보낼 수 있는 Slack 웹훅 URL을 얻으려면 https://api.slack.com/apps로 이동하세요. 계속하기 전에 Slack 계정에 로그인했는지 확인하세요.

  • 오른쪽 상단의 '새 앱 만들기'를 클릭하세요. 대화 상자가 나타납니다. 새 앱을 만들려면 "처음부터"를 선택하세요. 그러면 또 다른 대화 상자가 나타납니다. 여기에서 앱 이름을 "cpu-alert"로 지정한 다음 메시지를 보낼 특정 Slack 작업 공간을 선택할 수 있습니다. 이미 테스트 작업공간 “사이트 신뢰성 테스트”를 만들었습니다
  • '앱 만들기'를 클릭하세요
  • '기능 추가' 섹션에서 '수신 웹훅'을 선택하세요
  • 수신 웹훅 활성화 버튼을 '켜기'로 전환합니다. 다시 뒤로 이동하여 '앱 설치 섹션'으로 스크롤합니다
  • "Workspace에 설치"를 클릭하면 Slack에서 메시지를 보낼 채널을 선택합니다. 그런 다음 허용을 클릭하세요.
  • '특징 및 기능 추가'로 돌아가서 '수신 웹훅'을 선택하세요
  • 아래로 스크롤하여 웹훅 URL을 찾은 다음 복사하여 코드에 붙여넣으세요.

다음 단계는 Go 앱용 배포 패키지를 만드는 것입니다
우리는 애플리케이션을 구축할 것입니다.

  • 프로젝트 작업 디렉터리에서 터미널을 엽니다.run GOOS=linux go build -o main main.go
  • '부트스트랩' 파일 만들기 다음 내용으로 프로젝트 루트 디렉터리에 'bootstrap'이라는 파일을 만듭니다.
#!/bin/sh 
./main

부트스트랩 파일을 실행 가능하게 만듭니다

  • chmod +x 부트스트랩 실행
  • zip function.zip 메인 부트스트랩을 실행하여 실행 파일과 부트스트랩 파일을 압축합니다.

lamba 함수 업로드

  • AWS 관리 콘솔로 이동
  • 람다를 검색하고 새 함수 만들기
  • 원하는 이름을 지정하세요
  • “처음부터 작성”을 선택하세요
  • 런타임으로 Amazon Linux 2023을 선택하세요
  • 선택 기능 클릭
  • 기능 생성이 완료되면 아래로 스크롤하여 "다음에서 업로드" 옵션을 찾으세요
  • 코드가 포함된 전체 폴더가 아닌 function.zip 파일을 선택하세요
  • 저장
  • 런타임 설정 섹션을 찾아 편집을 클릭하세요
  • 핸들러를 부트스트랩으로 설정하고 저장하세요

다음 단계에서는 Lambda 함수에 대한 트리거를 구성하겠습니다. 이 트리거는 함수가 Slack에 메시지를 보내도록 요청하는 이벤트를 정의합니다

앞서 언급했듯이 가상 머신의 CPU 사용량이 >= 50%일 때 트리거됩니다

이 기능을 구현하기 위한 첫 번째 단계는 EC2 인스턴스를 생성하는 것입니다.

이 작업이 완료되면 측정항목을 모니터링하고 수집하도록 Cloudwatch를 구성해야 합니다

  • Cloudwatch를 검색하여 엽니다
  • 알람 생성 선택
  • 측정항목 선택 선택
  • ec2 선택
  • 인스턴스별 지표 선택
  • CPUUtilization 지표 선택

조건란에서

  • 임계값에 대해 더 큼/같음 선택
  • 임계값을 “50”으로 정의
  • 다음을 클릭하세요 다음 페이지에서 알림 섹션을 찾으세요
  • 알람 상태 트리거를 "알람 중"으로 두겠습니다
  • '새 주제 만들기' 옵션을 선택하세요
  • 고유한 이름을 입력하세요. 이메일을 입력하여 알림을 받을 수도 있습니다
  • 주제 만들기 선택
  • 다음 페이지에서 고유한 알람 이름을 입력하세요. 그런 다음 알람을 만드세요

다시 람다 함수로 돌아가겠습니다

  • '트리거 추가' 선택
  • '소스 선택' 필드에서 'sns'를 검색하여 선택하세요
  • 이전에 생성한 주제를 선택하고 "추가"를 클릭하세요. ### 테스트 간단한 인프라의 다양한 부분을 결합하는 작업을 마쳤으므로 이제 테스트할 시간입니다.

이것이 작동하는지 테스트하려면 VM을 일종의 스트레스 테스트에 두어야 합니다. 이 테스트는 높은 CPU 로드를 생성합니다. 이 테스트를 수행하기 위해 Linux의 "스트레스" 도구를 사용할 것입니다.

먼저 EC2 inatance.connect에 "스트레스" 도구를 설치하고 EC2 인스턴스에 연결하고 다음 명령을 실행해야 합니다
sudo apt-get 업데이트
sudo apt-get 설치 스트레스
다음 명령을 사용하여 CPU 스트레스 테스트를 수행하세요
스트레스 --cpu 4 --timeout 300
이 예에서는 300초(5분) 동안 4개의 CPU 작업자(병렬 프로세스 또는 스레드 수)를 사용합니다. 작업자 수와 세컨드 수를 원하는 대로 조정할 수 있습니다.

Slack을 열고 기다리면 다음과 같은 알림이 표시됩니다

Image description

발생할 수 있는 일반적인 오류

스트레스 테스트를 실행하는 동안 Cloudwatch 상태가 '데이터 부족'으로 변경되어 경보가 약간 지연될 수 있습니다. 이 문제를 해결하려면

  • Cloudwatch 콘솔 열기
  • 알람으로 이동하여 특정 알람을 선택하세요
  • 작업을 클릭한 후 수정하세요
  • 누락된 데이터 처리 섹션까지 아래로 스크롤
  • '누락된 데이터를 무시로 처리(현재 상태 유지)' 선택
  • 알람 저장 ### 결론 지금까지 Go에서 간단한 Lambda 함수를 작성하고 설정하는 방법을 살펴보았습니다. 또한 지표를 모니터링 및 수집하고, 특정 임계값이 충족될 때 트리거되도록 CloudWatch 경보를 설정하고, 이러한 경보를 수신할 SNS 주제를 설정하도록 CloudWatch를 구성했습니다. SNS 주제의 목적은 Slack 메시지를 보내는 Lambda 함수를 트리거하는 것입니다.

이 내용이 즐겁고 유익했다고 믿습니다. 오류가 있거나 명확하게 설명되지 않은 부분이 있거나 제가 놓친 부분이 있다고 생각되면 언제든지 연락해 주세요. 귀하의 의견은 매우 소중합니다. 감사합니다!

github 저장소 링크는 여기에서 확인하세요

위 내용은 Go AWS Lambda 함수를 사용하여 Slack 알림 보내기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.