Slack bot tìm thông tin tài nguyên trên GCP từ IP

Cuong Trinh
One Mount | Tech
Published in
4 min readSep 29, 2021

--

1. Vấn đề gặp phải

Với 1 công ty nhỏ nhỏ, có tầm 10 20 máy ảo thì nhìn sơ sơ cũng đoán được cái IP này là của con máy nào. Nhưng “chẳng may” công ty bạn lại có hàng trăm hay thậm chí hàng nghìn máy ảo trên cloud, 1 ngày đẹp trời bạn được dự án hỏi “Chú cho anh hỏi chút IP này là của bên nào mà nó call sang con của anh nhiều thế?” thì nên giải quyết thế nào nhỉ? Document hết cái đống tạo lại vào trong 1 cái file nào đấy rồi tra? Hợp lý, cơ mà lại mất công update hàng ngày thêm sửa xoá cái file đấy quá, vậy thì phải tìm cách auto nó thôi

2. Ý tưởng

May sao là cloud của GCP hỗ trợ list danh sách các VM trong 1 project:

https://cloud.google.com/sdk/gcloud/reference/compute/instances/list

Nhưng chúng ta đang quản lý rất nhiều project, vậy thì tạo 1 cái loop với project vậy:

OK vậy về cơ bản là xong cái file có thông tin khá đầy đủ rồi

Tự động gen được file rồi, vậy thì thêm tự động trả lời người hỏi luôn đi nhỉ🤔. May sao là công ty mình dùng slack, tạo 1 con bot để cho mọi người hỏi là được rồi 😁

3. Triển khai

3.1. Storage

Cái file output.csv vừa nãy cần chọn 1 nơi lưu trữ để có thể dùng bot query vào được, ở đây thì mình dùng GCS luôn cho tiện, vậy thì mình sẽ update lại code để thêm phần đẩy file lên GCS

3.2. Slack bot

Slack bot có thể tạo tại https://api.slack.com/apps

Cần quan tâm 1 số config sau

Signing Secret: mỗi request của slack sẽ có phần secret này, chúng ta sẽ sử dụng để authen request với backend

Slash Commands: dùng để chạy command trên slack, slash này bị 1 hạn chế là các request sẽ phải xử lý trong vòng 3s và gửi trả lại nếu không sẽ bị coi là timeout

Để tránh việc sử dụng slash bị timeout, chúng ta có thể thêm cơ chế khác là bot sẽ bắt được mention event và xử lý

Bot User Oauth Token: sử dụng token này để nhắn lại trên slack dưới quyền của bot

3.3. Backend

Backend sử dụng để nhận request từ slack, và tìm thông tin trong file để trả về kết quả phù hợp. Ở đây mình sử dụng Google Cloud Function và code backend bằng Python

Đầu tiên như đã nói ở trên, chúng ta cần verify request được gửi từ bot của mình chứ không phải từ ai khác -> viết 1 hàm verify Signing Secret:

Trong đoạn code trên mình có sử dụng Secret Manager của Google Cloud để lưu SLACK_SIGN_SECRET (và 1 số giá trị secret khác), đây là phần hàm mình dùng để xử lý

Giờ thì thêm hàm main nhận request và route các event. Như mình có nói ở phần config slack app thì backend sẽ bắt 2 sự kiện từ slash commandsmention event

Giờ tiếp tục là phần hàm xử lý sự kiện app_mention_event

app_slash_event

Ở cái hàm get_ip_vm sẽ là phần xử lý tìm text của user gửi đem so với thông tin trong file và trả về kết quả

Mình không phải là dev nên code nhìn hơi … bốc mùi, mong các bạn thông cảm

Phần code các bạn có thể xem thêm ở https://github.com/OneMount/slack-find-ip

3.4. Kết quả

Nhìn code nhiều mỏi mắt rồi, cùng nhìn qua kết quả nào

Sử dụng mention
Sử dụng slash command

Ok vậy là ta đã làm xong 1 con bot để có thể tối ưu việc tra cứu

Nhìn qua log thì cũng thấy bot được gọi 82 lần/tuần thay vì 82 cái message cho mình 😱

Ví dụ này mình chỉ lấy về IP của Compute Engine, IP trên Google Cloud còn có 1 số ứng dụng nữa như GKE, CloudSQL, Load Balancer, Memorystore; các ứng dụng này cũng có hỗ trợ sẵn câu lệnh list và có thể làm tương tự

Ngoài ra còn phần tự động chạy update danh sách nữa mình cũng không đề cập trong bài này, sơ sơ qua thì dùng Cloud Run để chạy script + Cloud Scheduler để lập lịch chạy

--

--