안녕하세요? DevOps Engineer 제이디입니다.
이번 포스팅에서는 AWS Serverless(API Gateway, SQS, Lambda)와 Teams Graph API를 활용해서 사내 메신저 Teams로 알림 메시지 발송하기에 대해 공유하겠습니다.
작년 연말부터 ITSM 변경/배포 프로세스 고도화 프로젝트를 진행하면서 ITSM에 변경 승인 기능을 추가했는데요. ITSM에서 승인 발생시 담당자에게 사내 메신저(Teams)로 알림 메시지를 발송해야하는 개발건이 추가됐습니다.
엔터프라이즈 환경에는 다양한 시스템들이 있고 내부 메신저로 알림 메시지 발송 기능이 있으면 좋겠다는 생각이 들어서 AWS Serverless 환경을 통해서 구성하게됐습니다.
현재 구성해서 사용중인 아키텍처는 아래와 같습니다.

AWS API Gateway
내부에서 운영중인 AWS 인프라는 이미 IDC와 Site to Site VPN을 통해서 연결해서 사용중입니다. (내용 생략)
AWS API Gateway 구성시 필요한 요건은 아래 2가지가 있었습니다.
- 내부망 호출을 통해서 API를 사용해야합니다.
- API 사용시 인증 절차가 필요합니다.
내부에서 사용중인 VPC(VPN 연결)에 VPC Endpoint를 생성 후 AWS API Gateway를 Private 형태로 생성해서 연결합니다.
구성 당시에 참고했던 AWS Document 공유드립니다.
VPC Endpoint를 통해서 API Gateway 호출시 아래 링크를 참고해서 호출해야합니다.
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
API Gateway를 Private 형태로 구성후 다음으로 작업할 내용은 인증 처리입니다.
API Gateway에서 API keys를 생성합니다.

생성한 API Keys를 API Gateway의 Stage에 할당합니다.

실제 API 호출시 Header에 API keys의 값을 'x-api-key' Header를 통해서 사용합니다.
AWS SQS
AWS SQS는 아래 링크를 참고해서 생성합니다.
AWS SQS를 생성후 API Gateway에서 Post message를 발송하기 위해서 SQS에 Access policy를 추가해야합니다.
Queue policies에서 Access Policy에 아래 내용을 추가합니다.
{
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "AWS SQS ARN를 넣어주세요"
}
AWS Lambda
AWS Lambda를 구성하는 방법은 아래 링크를 참고해주세요. (저는 Golang를 통해서 개발했어요)
참고 : https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/getting-started.html
현재 AWS Lambda는 GitLab Runner를 통해서 빌드 및 배포를 진행하고있습니다. (이부분은 추후 공유드릴게요)
이번 포스팅에서는 AWS Lambda에서 Teams로 메시지 발송시 사용하는 Graph API에 대해서 공유드리겠습니다.
1. Teams 앱 등록하기
Teams에 Graph API를 사용하려면 우선 Teams 앱을 등록해야합니다. Microsoft Azure에 접속해서 앱 등록을 진행합니다.

앱을 생성했으면 API 사용 권한을 발급합니다. Teams로 메시지를 발송하려면 아래 권한들이 필요합니다.
Chat.Create
Chat.ReadWrite
ChatMessage.Send
User.Read.All
2. Teams Access Token 발급하기
앱 생성 완료후 본격적으로 Teams Graph API를 사용할 수 있습니다.
우선 아래 방법으로 Token를 발급해보시죠!
# POST
https://login.microsoftonline.com/디렉터리(테넌트) ID/oauth2/v2.0/token
# Body
grant_type : client_credentials
scope : https://graph.microsoft.com/.default
client_id : 앱 생성시 발급
client_secret : 앱 생성시 발급
Postman으로 Token를 발급해보면 Bearer Toekn이 잘 생성되서 응답옵니다.

3. Teams 사용자 프로필 검색
ITSM Jira 혹은 외부 시스템에서 특정 사용자에게 알림 메시지를 보낼때 사용하는 값은 사내 이메일입니다.
이메일을 통해서 Teams의 사용자 프로필을 검색후 메시지 발송시 사용되는 Teams 사용자 ID 값을 확인합니다.
# GET
https://graph.microsoft.com/v1.0/users?$filter=mail eq '이메일'
# Authorization
Bearer Token : 발급 받은 토큰
사용자 검색후 응답받은 결과값에서 value에 id 값을 사용합니다.
4. Teams 1:1 채팅방 생성하기
다음으로 진행하는 내용은 Teams 앱과 메시지를 수신하는 사용자의 1:1 채팅방을 생성합니다.
# POST
https://graph.microsoft.com/v1.0/chats
# Authorization
Bearer Token : 발급 받은 토큰
# Body
{
"chatType": "oneOnOne",
"members": [
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [
"owner"
],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/앱 사용자 아이디"
},
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [
"owner"
],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/사용자 아아디"
}
]
}
Teams Chats API를 통해서 채팅방 생성 및 조회를 진행합니다.
응답받은 결과값에 id값을 사용합니다.

5. Teams 1:1 채팅방 메시지 발송하기
마지막으로 Teams 알림 수신자에게 메시지를 발송합니다. 메시지 발송 형태는 htlm를 사용합니다.
메시지 발송 content에 아래 내용을 참고해서 입력합니다.
- title : 메시지 발송 카드 제목
- text : 메시지 발송 카드 본문
- buttons.type : openUrl
- buttons.title : 버튼 링크 제목
- buttons.value : 버튼 링크 주소
# POST
https://graph.microsoft.com/v1.0/chats/Teams 채팅방 아이디/messages
# Authorization
Bearer Token : 발급 받은 토큰
# Body
{
"subject": null,
"body": {
"contentType": "html",
"content": "<attachment id=\"74d20c7f34aa4a7fb74e2b30004247c5\"></attachment>"
},
"attachments": [
{
"id": "74d20c7f34aa4a7fb74e2b30004247c5",
"contentType": "application/vnd.microsoft.card.thumbnail",
"contentUrl": null,
"content": "{\"title\": \"Teams 알림 발송하기 🤖\",\"text\": \"<h2>AWS Serverless를 활용한 사내 메신저(Teams) 알림 메시지 발송하기</h2><br>DevOps Bot 추천👇👇 \",\"buttons\": [{\"type\": \"openUrl\",\"title\": \"JD-VLog\",\"value\": \"https://jd-vlog.tistory.com/\"}]}",
"name": null,
"thumbnailUrl": null
}
]
}
Teams 1:1 채팅방에 정상적으로 카드 형태의 메시지 발송이 완료됐습니다.

앞으로의 방향성
앞으로 Teams 봇 관련해서 하고싶은 일은 크게 두가지가 있습니다.
- ITSM 변경 모바일 승인
- 사내에 모든 알림을 Teams 메신저 기반으로 변경
Teams 봇은 회사에 입사 후 OJT를 시작으로 조금씩 만들었는데, 사용을 원하는 타 부서가 늘어나면서 애착도 커지고 안전한 서비스 제공을 위해 많은 고민도 필요하네요! 🚀
이번 포스팅에서는 AWS Serverless 환경에서 Teams Graph API를 활용한 Teams 1:1 메시지 발송 방법을 알아보았습니다.
앞으로도 더 좋은 포스팅으로 찾아뵙겠습니다.
감사합니다! 🙇♂️
'IT' 카테고리의 다른 글
Grafana로 Frontend 모니터링하기 (Image Renderer를 곁들인) (0) | 2024.12.07 |
---|---|
AWS EKS 업그레이드 시 발생했던 이슈들 공유 (3) | 2024.07.20 |
GitHub-Flow 브랜치 전략에서 Develop 브랜치를 지워야하는 이유 (0) | 2024.06.30 |
Feature 브랜치 전략에 따른 개발 문화의 중요성 (1) | 2024.04.26 |