Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Hantar Pemberitahuan Slack dengan Fungsi Go AWS Lambda

Hantar Pemberitahuan Slack dengan Fungsi Go AWS Lambda

WBOY
WBOYasal
2024-07-17 14:03:57614semak imbas

pengenalan

Dalam artikel ini, kita akan membincangkan cara mencipta fungsi lambda AWS untuk menghantar pemberitahuan Slack apabila penggunaan CPU bagi tika AWS mencapai 50%.

AWS Lambda ialah perkhidmatan pengiraan tanpa pelayan yang ditawarkan oleh Amazon Web Services (AWS). Ia membolehkan anda menjalankan kod tanpa perlu menyediakan atau mengurus pelayan sendiri.

Ia dipacu peristiwa iaitu kod anda dilaksanakan sebagai tindak balas kepada peristiwa yang dicetuskan oleh perkhidmatan AWS lain seperti muat naik fail yang diselesaikan dalam s3, permintaan HTTP daripada Amazon API Gateway atau pelbagai pencetus lain.

Dalam hal ini, kami akan membincangkan cara menyediakan Amazon Cloudwatch untuk memantau dan mengumpul metrik daripada tika EC2, penggera Cloudwatch berdasarkan metrik tersebut untuk mencetuskan pemberitahuan apabila ambang atau syarat tertentu dipenuhi, perkhidmatan Pemberitahuan Mudah Amazon kepada terima pemberitahuan ini dan akhirnya fungsi lambda melanggan topik SNS, yang akan memproses pemberitahuan dan menghantar mesej kendur.

Prasyarat

Untuk mengikuti ini, pembaca harus mempunyai pengetahuan asas dan pemahaman

  • Golang
  • AWS dan perkhidmatannya ### Menyediakan projek Mula-mula, kita akan mulakan dengan menulis fungsi untuk menghantar pemberitahuan ini kepada Slack.

Buat projek go baharu dan panggil apa sahaja yang anda mahu, saya panggil saya "lambdaFunction" dalam fail main.go anda, tampalkan sekeping kod berikut

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)
}

Lari pergi mod

Mari cuba fahami apa yang berlaku
Fungsi handleRequest

  • Pertama, kami mencipta struct bernama slackMessage untuk mewakili format mesej yang dihantar kepada Slack, ia mempunyai satu medan Teks yang menyimpan kandungan mesej
  • Fungsi handleRequest ialah fungsi utama yang dilaksanakan oleh masa jalan lambda. Ia mengambil dalam dua konteks hujah dan acara snsEvent.SNSEvent yang mengandungi butiran tentang pemberitahuan SNS masuk.
  • Fungsi ini berulang melalui setiap snsRecord dalam snsEvent, ia mendapatkan semula kandungan mesej dari medan sns.message dan memanggil sendSlackNotification dengan URL webhook slack dan kandungan mesej

fungsi sendSlackNotification

  • Fungsi ini mengambil dua argumen webhookURL: URL tempat pemberitahuan Slack dihantar dan mesej: kandungan mesej yang akan dihantar ke Slack.
  • Saya memberikan mesej yang dipratentukan "penggunaan cpu melebihi 50%" yang dilampirkan pada mesej yang disediakan. Ia kemudian menyusun struct slackMessage ke dalam format JSON menggunakan json.marshal.
  • Permintaan siaran HTTP dibuat menggunakan http.NewRequest dengan URL webhook yang kendur, badan berformat JSON dan pengepala jenis kandungan ditetapkan kepada application.json *Permintaan dihantar menggunakan http.client dan respons diterima Fungsi utama hanya digunakan untuk ujian tempatan. Dalam persekitaran lambda fungsi lamba.start dipanggil secara automatik dengan handleRequest sebagai titik masuk

Mendapat URL webhook yang kendur

Untuk mendapatkan URL webhook Slack yang membolehkan anda menghantar mesej kepada Slack, navigasi ke https://api.slack.com/apps. Pastikan anda log masuk ke akaun Slack anda sebelum meneruskan.

  • Klik pada "Buat apl baharu" di bahagian atas sebelah kanan Kotak dialog akan muncul. Pilih "Dari awal" untuk membuat apl baharu. Selepas itu, kotak dialog lain akan muncul. Di sini, anda boleh menamakan apl anda "cpu-alert" dan kemudian memilih ruang kerja Slack tertentu di mana anda mahu mesej dihantar. Saya sudah mencipta "ujian kebolehpercayaan tapak" ruang kerja ujian
  • Klik “Buat apl”
  • Dalam bahagian "Tambah ciri dan kefungsian" pilih "Webhooks masuk"
  • Togol aktifkan butang webhook masuk ke "hidup" Navigasi kembali semula dan tatal ke "bahagian pasang apl"
  • Klik "pasang ke Ruang Kerja" kemudian kami akan memilih saluran yang kami mahu Slack menghantar mesej. Kemudian klik benarkan.
  • Kembali ke "Tambah ciri dan kefungsian" dan pilih "Webhooks masuk"
  • Tatal ke bawah untuk mencari URL webhook kami, kemudian salin dan tampalkannya ke dalam kod kami.

Langkah seterusnya ialah membuat pakej penggunaan untuk apl Go kami
Kami akan membina aplikasi.

  • Buka terminal dalam direktori kerja projek.jalankan GOOS=linux go build -o main.go
  • Buat fail 'bootstrap' Buat fail bernama 'bootstrap' dalam direktori akar projek dengan kandungan berikut
#!/bin/sh 
./main

Jadikan fail bootstrap boleh laku

  • Jalankan chmod +x bootstrap
  • Zip fail boleh laku dan bootstrap dengan menjalankan fungsi zip.zip bootstrap utama

Memuat naik fungsi lamba

  • Navigasi ke konsol pengurusan AWS
  • Cari lambda, dan buat fungsi baharu
  • Beri nama pilihan anda
  • Pilih “Pengarang dari awal”
  • Untuk masa jalan, pilih Amazon linux 2023
  • Klik fungsi pilih
  • Apabila fungsi selesai membuat tatal ke bawah dan cari pilihan "Muat naik dari"
  • Pilih fail function.zip anda BUKAN keseluruhan folder yang mengandungi kod
  • Simpan
  • Cari bahagian tetapan masa jalan dan klik pada edit
  • Tetapkan pengendali kepada bootstrap dan simpannya

Dalam langkah seterusnya, kami akan mengkonfigurasi pencetus untuk fungsi Lambda. Pencetus ini mentakrifkan peristiwa yang akan menggesa fungsi untuk menghantar mesej kepada Slack

Seperti yang saya nyatakan sebelum ini bahawa pencetus akan berlaku apabila penggunaan cpu mesin maya ialah >= 50%

Untuk mencapai kefungsian ini, langkah pertama melibatkan mencipta tika EC2.

Apabila ini selesai, kami perlu mengkonfigurasi Cloudwatch untuk memantau dan mengumpul metrik

  • Cari Cloudwatch dan bukanya
  • Pilih buat penggera
  • Pilih Pilih metrik
  • Pilih ec2
  • Pilih metrik setiap contoh
  • Pilih metrik CPUUtilization

Di bahagian syarat

  • Pilih Lebih Besar/Sama untuk ambang
  • Tentukan nilai ambang sebagai “50”
  • Klik seterusnya Pada halaman seterusnya cari bahagian pemberitahuan
  • Kami akan meninggalkan pencetus keadaan penggera kerana ia adalah "Dalam Penggera"
  • Pilih pilihan "buat topik baharu"
  • Masukkan nama unik, anda juga boleh memasukkan e-mel untuk menerima pemberitahuan
  • Pilih Cipta topik
  • Pada halaman seterusnya masukkan nama penggera yang unik Kemudian buat penggera

Kami akan kembali ke fungsi lambda kami

  • Pilih “tambah pencetus”
  • Dalam medan "Pilih sumber", Cari "sns" dan pilihnya
  • Pilih topik yang anda buat sebelum ini dan klik "tambah" ### Ujian Kami telah selesai menyusun pelbagai bahagian infrastruktur ringkas kami, kini tiba masanya untuk menguji.

Untuk menguji bahawa ini berfungsi, kami perlu meletakkan VM kami di bawah sejenis ujian tekanan. Ujian ini menjana beban CPU yang tinggi. Untuk melaksanakan ujian ini kita akan menggunakan alat "tekanan" dalam linux.

Pertama sekali, kami perlu memasang alat "tekanan" dalam keadaan EC2 kami. sambung ke contoh EC2 dan Jalankan arahan berikut
sudo apt-get kemas kini
sudo apt-get install stress
Gunakan arahan berikut untuk menguji tekanan CPU anda
tekanan --cpu 4 --masa tamat 300
Contoh ini menggunakan 4 pekerja CPU (bilangan proses selari atau benang) selama 300 saat (5 minit). Anda boleh melaraskan bilangan pekerja dan kedua mengikut kesesuaian anda.

Buka Slack dan tunggu anda akan mendapat makluman yang kelihatan seperti ini

Image description

Ralat Biasa yang mungkin anda hadapi

Semasa menjalankan ujian tekanan anda, anda mungkin melihat keadaan Cloudwatch berubah kepada "data tidak mencukupi" yang mungkin menyebabkan penggera tertangguh seketika. Untuk membetulkan ini

  • Buka konsol Cloudwatch
  • Navigasi ke penggera dan pilih penggera khusus anda
  • Klik pada tindakan kemudian edit
  • Tatal ke bawah ke bahagian rawatan data yang tiada
  • Pilih “Anggap data yang hilang sebagai abaikan (kekalkan keadaan semasa)”
  • Simpan penggera ### Kesimpulan Setakat ini, kami telah meneroka cara menulis dan menyediakan fungsi Lambda yang mudah dalam Go. Selain itu, kami telah mengkonfigurasi CloudWatch untuk memantau dan mengumpul metrik, menyediakan penggera CloudWatch untuk mencetuskan apabila ambang tertentu dipenuhi dan menetapkan topik SNS untuk menerima penggera ini. Tujuan topik SNS adalah untuk mencetuskan fungsi Lambda kami, yang menghantar mesej Slack.

Saya percaya anda mendapati ini menyeronokkan dan bermaklumat. Sekiranya terdapat sebarang ralat atau jika mana-mana bahagian tidak dijelaskan dengan jelas atau anda rasa saya terlepas sesuatu, sila hubungi. Maklum balas anda amat dihargai. Terima kasih!

pautan ke repositori github ditemui Di sini

Atas ialah kandungan terperinci Hantar Pemberitahuan Slack dengan Fungsi Go AWS Lambda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Palindrome menyemak rentetanArtikel seterusnya:Palindrome menyemak rentetan