개요
Python을 이용해 MSTeams로 알람을 보내려고 한다. request, json 모듈로 직접 코딩해서 메시지 전송 함수를 호출해보았는데 Teams로 알람이 오는 경우도, 오지 않는 경우도 있었다.
원인을 파악하고, 해결해본다. 소스는 올리지 못했다.
response 확인
일단 메시지를 전송한 후 응답을 확인해보았다.
<Response [200]> Webhook message delivery failed with error: Microsoft Teams endpoint returned HTTP error 413 with ContextId MS-CV=t6m/FZ9tWE2VAglGXXbmBA.0..
응답 코드는 200으로 정상이지만, 실제로는 전송에 실패해서 Teams 알람이 오지 않은 것을 확인할 수 있다.
정상인 경우에는 아래와 같은 출력을 확인할 수 있다.
<Response [200]> 1
원인
에러 메시지로 구글링 한 결과, MSTeams는 payload에 제한이 있어 메시지 크기가 너무 크면 413 HTTP 응답이 돌아온다고 한다. 413 응답 상태는 Payload Too Large, 즉 요청 엔티티가 서버에서 제한하는 것보다 크다는 의미다.
MSTeams Webhook의 경우, 대략 18000 ~ 40000 사이의 JSON 메시지 payload를 기반으로 하는 것 같다. 메시지가 너무 길어지면 메시지를 잘라서 전송하는 Slack Webhook과 다르게 MSTeams Webhook은 메시지를 버리면서 에러 응답을 보내지 않는다. 이 때문에 response 응답 코드는 200인데, 받지 못한 메시지가 존재할 수 있었다.
조치
메시지 길이를 제한하는 방식으로 해결했다.
json payload를 생성할 때 message를 일정 길이로 자른 후에 payload를 생성할 수 있도록 했다.
max_message_length = 1000
if len(message) > max_message_length:
message = message[:2000] + "..."
참고 문서
https://stackoverflow.com/questions/49199443/microsoft-flow-sharepoint-to-teams-http-413
https://developer.mozilla.org/ko/docs/Web/HTTP/Status/413
How long can messages be when posting to a Microsoft Teams connector webhook?