Scouter의 Alert를 라인 메신저로 Notification 하기

보통 Notification 연동시에 개방형 메신저인 Slack이나 Telegram을 많이들 사용합니다.

당연히 Scouter에서 발생하는 경고를 Slack이나 Telegram으로 연동하는 Plugin도 제공하고 있습니다.

그런데 얼마 전 라인에서도 Messaging API 를 공개하였습니다.

Developer 용 Messaging API 사용시 분당 1000건까지는 무료이고 아무래도 일반 사용자가 쓰기는 좀 더 친숙하기에 Scouter – Line 플러그인을 만들어 보았습니다.

사실 방법만 알면 금방 연동이 가능합니다만 Slack 등과의 연동시와 개념적으로 좀 다른점이 있어 처음에 조금 해맸습니다.

라인 비즈니스 계정 생성 부터 하나씩 해보도록 하겠습니다.

먼저 Line business center에 접속합니다. ( https://business.line.me )

여기서 Messaging API로 들어간 후 “Start using Developer Trial” 로 접근합니다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-12-20-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-55-08

여기서 기존에 가지고 있는 LINE ID로 로그인합니다.
만약 ID가 없다면 미리 가입해 놓아야 합니다.
어차피 테스트를 하려면 LINE 메신저를 사용해야 하니 메신저를 설치하고 가입합니다.

로그인하게 되면 사용할 Business ID들을 추가할 수 있습니다.

스크린샷 2016-12-21 오전 12.03.30.png

그런 다음 Account List에서 좀전에 만든 id의 manager 화면으로 접근합니다.

여기서 계정 설정 > Bot 설정 메뉴에 들어간 다음 API를 활성화 해야 합니다.
활성화 하고 Webhook 사용 : 허용, Bot 그룹 대화 : 허용, 자동응답메시지 : 허용 안함 으로 변경합니다.

스크린샷 2016-12-21 오전 12.21.15.png

여기까지 설정한후 다시 Line business center의 Accounts 메뉴에 가보면 Messaging API라는 항목이 생겼을 겁니다. 여기서 LINE Developers로 들어갑니다.

스크린샷 2016-12-21 오전 12.11.49.png

그러면 Line developers 사이트로 이동하는데 여기서 Channel Access Token을 생성해야 합니다. Issue 버튼으로 생성이 가능합니다.
여기서 생성된 Token을 잘 기록해 둡니다.

자 이제 라인 메신저에서 위에서 생성한 계정을 친구추가 합니다.
친구 추가를 하기 위해서는 id를 알아야 하는데 Line@Manager에서 확인할 수 있습니다.

스크린샷 2016-12-21 오전 12.17.29.png

위에서 보듯이 id는 @cpu0501a 입니다.
위 id를 몰라도 친구추가 링크를 전송한다던지 QR코드로 친구추가를 하게 할 수도 있습니다.

일단 저는 개인계정에서 @cpu0501a를 친구추가 하도록 하겠습니다.

스크린샷 2016-12-21 오전 12.22.24.png

우리의 목적은 Scouter 에서 경고 발생시 특정 사용자들에게 전달하는 것입니다.

이를 위해 Line Messaging API에서 Push API를 사용하면 되는데 이를 위해서는 상대측 id 를 알아야 합니다. 그리고 이 id는 사용자 id 와는 다른 id로 내부적으로 사용되는 id 입니다.

이 id는 개인id 일 수도 있고, 그룹이나 채팅방 id일 수도 있습니다.

결국 우리는 Scouter에서 발생하는 경고를 이 id로 보내야 하는데, 우리 목적상 그룹을 만들고 이 그룹에 참석한 사용자들에게(수신:그룹ID) 보내는 것이 가장 적합합니다. 당연히 XX-Scouter-Alert라는 우리 비즈니스 계정도 이 그룹에 초대되어야겠죠?
(만약 그룹 멤버가 아니라면 메시지 송신이 실패합니다.)

그러면 라인 메신저 기능을 이용해서 그룹을 만들어 보겠습니다.

저는 그냥 Scouter-Alert-Group1 이라는 이름으로 만들었습니다.

스크린샷 2016-12-21 오전 12.27.25.png

일단 저 자신과 XX-Scouter-Alert 계정만 이 그룹에 참여시켰는데 나중에 다른 사람들을 그룹으로 초대하면 다 같이 알림을 받게 될 겁니다.

자~ 이제 거의 다 되었다고 생각하실지 모르겠으나 큰 난관이 있습니다.
이 그룹의 ID를 알아야 Alert 메시지를 보낼텐데 현재로서는 알 수 있는 방법이 없습니다.

라인의 Messaging API는 Notification을 목적으로 하기보다는 Bot을 만들기 위한 목적이 강합니다. 그래서 반드시 서버가 필요합니다. 사용자가 우리가 생성한 비즈니스 계정을 친구 추가하거나 또는 그룹에 초대하거나 하는 이벤트 시점에, 그리고 특정 사용자가 메시지를 보낼 때 이 서버에서 제공(Listen)하는 WebHook URL을 호출하게 됩니다.

따라서 반드시 서버가 필요하며 또한 해당 서버는 https 통신을 지원해야 하고 그리고 중요한 것이 ssl을 위한 인증서도 정식 인증서여야 합니다. 그리고 모든 인증 업체가 승인되지는 않습니다.
(Let’s encrypt 는 안된다고 합니다.)

저는 여기서 상당히 고민을 많이 했습니다.
겨우 이거 하자고 서버 띠우고 인증서 구매하고.. 세팅하고…
여기서 제가 Bot을 만들게 아니잖아요? 저는 단지 이 그룹의 ID 만 알면 됩니다.
이건 단 한번의 메시지 요청만 받아도 알 수 있습니다.

배보다 배꼽이 너무나 큽니다.

그러다가… 아! 하고 불현듯 떠오른 생각이…

Lambda…

Lambda로 간단히 Function 하나 올려서 API Gateway와 연결하여 request의 body를 로깅만 하면 끝나는 문제였습니다.
그리고 우리가 원하는 ID만 획득하고 필요없는 Lambda function 은 disable 하면 되겠죠?

오호라~

Lambda 오랜만에 만들어 봤는데 예전보다 많이 편해진 것 같더군요. ^^
템플릿을 사용해서 그런지 API Gateway도 자동으로 붙네요.

Lambda function 올리는 상세한 절차는 다른 좋은 포스팅들이 많으니 참고해 보시기 바랍니다.
여기서는 간단히 제가 한 절차만 정리해 보겠습니다.

서버 설치 없이 라인ID를 에코 응답해주는 Bot을 만들었습니다.
그 Bot을 사용하시면 아래 Lambda쪽은 건너 뛰어도 됩니다. 아래 링크 참고하세요.

서버없이 라인 아이디를 확인해보자!!(https://goo.gl/SiYehX)

aws.amazon.com에 접속합니다.
Lambda 메뉴로 가서 Create a Lambda function을 합니다.

저는 여기서 그냥 https-request 템플릿을 사용하였습니다.

trigger로는 API Gateway를 고릅니다.

스크린샷 2016-12-21 오전 12.40.15.png

임시로 사용하는 것이므로 보안 옵션도 그냥 Open 으로 합니다.

Lambda function은 아래 내용을 붙여 넣습니다.
그냥 request 내용을 log로 찍는 것이며 cloud watch의 로그에서 확인하면 됩니다.
요청서 sender의 id가 들어오기 때문에 여기서 우리는 그룹의 id를 획득할 수 있습니다.

원래는 request의 헤더에서 token을 검증하여 정확한 요청인지 확인하는 절차등이 필요하나 우리는 그룹 id만 획득하는 것이 목적이므로 이는 생략합니다.

'use strict';
exports.handler = (event, context, callback) => {
console.log("[EventLog-ByLineCall]");
console.log(event);
const done = (err, res) => callback(null, {
statusCode: err ? '400' : '200',
body: err ? (err.message || err) : JSON.stringify(res),
headers: {
'Content-Type': 'application/json',
},
});
done(null, "ok");
};

Lambda를 제대로 생성하였다면 Trigger tab에서 해당 function이 실행되는 end point 주소를 알 수 있습니다.

이 url을 복사합니다.
이 url을 line messaging 설정에서 webHook의 url로 설정하여야 합니다.

developers.line.me에서 edit를 누르면 Webhook URL를 설정하는 곳이 있습니다.
여기에 위 url을 붙여넣습니다.

스크린샷 2016-12-21 오전 12.54.51.png

자 이제 아까 그룹 대화방에서 아무 메시지나 보냅니다.

그리고 나서 AWS Lambda의 monitoring tab에서 cloud watch 로그를 확인합니다.

스크린샷 2016-12-21 오전 12.59.38.png

이 위 그림에서 groupId가 우리가 앞으로 Notification 할 id 입니다.

드디어 우리가 원하는 모든 준비가 끝났습니다.

이제는 scouter plugin만 설치하고 설정하면 됩니다.

그 전에 curl로 메시지가 제대로 전송되는지 테스트를 해보실 수 있습니다.

https://devdocs.line.me/en/#push-message

위 url 참고하셔서 메시지를 한번 전송해 보시기 바랍니다.

curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {ENTER_ACCESS_TOKEN}' \
-d '{
"to": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"messages":[
{
"type":"text",
"text":"Hello, world1"
},
{
"type":"text",
"text":"Hello, world2"
}
]
}' https://api.line.me/v2/bot/message/push

view raw
push-to-line.sh
hosted with ❤ by GitHub

위에서 TOKEN 값은 우리가 초반에 생성한 Channel Access Token을 입력하면 됩니다.

그리고 “to:” 에는 당연히 우리가 Lambda 에서 획득한 그룹 ID를 입력하면 됩니다.

잘 되는군요… (아.. 힘들었다…)

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-12-21-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-1-05-54

모든 준비가 끝났습니다.

이제 Scouter Plugin을 설치하고 설정하면 됩니다.

Scouter의 Server-Plugin은 해당 library를 lib 디렉토리에 넣은 후 재기동만 하면 적용 됩니다.

아래 url에서 scouter-plugin-server-alert-line-1.0.0.jar 를 포함하여 모든 jar 파일을 다운로드 받은 후 Scouter Server Home의 lib 디렉토리로 복사한 후 재기동 합니다.

그리고 conf 파일에 아래 옵션을 설정합니다.

ext_plugin_line_send_alert=true
ext_plugin_line_access_token=Tl++IYUAOdtcHQfr7+3ieTIQs8/M9DTdBIrrwkm58KzuX03paU3gq8hxUrAA7NTERS3PJ9n8Q2=
ext_plugin_line_group_id=C0246cfsdf6599ec6ddesdf12bec77eb4a

view raw
scouter.properties
hosted with ❤ by GitHub

이제 다 되었습니다.
Scouter의 모니터링 중 Alert가 발생하면 해당 그룹으로 Notification을 받을 수 있습니다.

스크린샷 2016-12-21 오전 11.30.05.png

실제 plugin 설치는 간단한데 그룹 ID를 알아내는 절차가 가장 복잡하네요.
그럼 잘 사용하시기 바랍니다.

Line-Alert 플러그인 소스는 아주 간단합니다.
그리고 추가적인 조건에서의 notification을 직접 구현할 수도 있습니다.
추가적인 조건에서의 notification 구현은 scouter-plugin-server-alert-line 의 소스와 scouter-plugin-server-alert-telegram 소스를 비교해 보시면 알 수 있으실 겁니다.

조만간 Group ID를 쉽게 알아낼 수 있는 방법을 마련하여 소개하도록 하겠습니다. ^^;
Lambda 올리기도 귀찮으신 분들은 조금만 기다려 주세요~~~

아래 참고하세요.


서버 설치 없이 라인ID를 에코 응답해주는 Bot을 만들었습니다.
그 Bot을 사용하시면 아래 Lambda쪽은 건너 뛰어도 됩니다. 아래 링크 참고하세요.

서버없이 라인 아이디를 확인해보자!!(https://goo.gl/SiYehX)

Scouter의 Alert를 라인 메신저로 Notification 하기”에 대한 2개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중