Slack bot tìm thông tin tài nguyên trên GCP từ IP
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 commands và mention 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
Ok vậy là ta đã làm xong 1 con bot để có thể tối ưu việc tra cứu
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