lambda + kintone으로 chatwork에 메시지 만 보낼 수 있도록 로그를 남겨 둡니다.

※이 기사는 「AltPlus Advent Calendar 2016」의 11일째 기사입니다.

안녕하세요, id:thashimoto입니다.

사내 공통으로 사용할 수 있는 메세지 통지용의 bot를 chatwork로 설정하려고 했습니다만
chatwork에서는 계정별로 API 토큰이 발급되기 때문에
API 토큰을 사내에서 공개하면 bot 계정이 포함된 대화방 정보에
액세스가 되어 버리므로, 그것을 회피하기 위해서 아래와 같은 요건으로 설정했을 때의 로그가 됩니다.
  • 감사 로그 검색, 실행할 수있는 API 제한 (메시지 알림 전용), chatworkAPI 토큰을 배포하지 않음

  • 설정중, 걸린 곳 등을 쓰고 싶습니다.

    구성


  • APIGateway
  • lambda
  • kintone

  • APIGateway


  • chatwork API 토큰을 그대로 배포하면 chatwork API를 모두 사용할 수 있습니다.
    이번에는 메시지 알림만 할 수 있으면 좋았기 때문에 APIGateway의 API 키를 사용하여 인증 대응을 실시했습니다.
  • 본문 매핑 템플릿은 아래와 같은 형태로 설정, 시작 구조를 이해하지 못했기 때문에 이 근처의 lambda측에서의 받는 방법으로 걸렸습니다.
  • # Content-Type : application/json
    {
        "room_id" : $input.json('$.room_id'),
        "body" : $input.json('$.body'),
        "sourceIp" : "$context.identity.sourceIp"
    }
    
  • lambda 측 값 수신
  •     option = "body="+str(event['body'])
        room_id = str(event['room_id'])
        sourceIp = str(event['sourceIp'])
    

    람다


  • 언어는 파이썬을 사용했습니다.
    궁극적으로 pycurl을 사용할 수 있었기 때문에 다음과 같이 대응 (이번에는 파일 업을하지 않고 웹 페이지에서 설정했습니다)
  • import pycurl
        # chatwork post
        c = pycurl.Curl()
        c.setopt(pycurl.URL, chatwork_url)
        c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken: '+CHATWORK_TOKEN+''])
        c.setopt(pycurl.POST, 1)
    
        c.setopt(pycurl.POSTFIELDS, post_text)
        c.perform()
    
  • lambda상에서 bot의 어미를 붙였습니다만 문자화해 있었으므로 url_encode한 것을 문자 연결하는 형태로 대응했습니다.

  • 금과 소리


  • 데이터 저장소로 사용
  • 특별히 걸렸던 곳은 없었습니다.
  • 간단하게 집계해 그래프 표시까지 할 수 있으므로 편리했습니다.

  • curl에서 실행


    curl -H "Content-Type: application/json" -H "x-api-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -X POST -d '{ "body": "body test","room_id": "1111111111111"}'  "apigateway endpoint url"
    

    감상


  • 이번에, 구조가 간단했기 때문에 서버를 설치하고 싶지 않았기 때문에
    데이터스토어 포함해, 서버리스적인 형태로 설정할 수 있어 운용도 그다지 수고가 들지 않기 때문에 편리해 보였습니다.
  • 앞으로도 글루적인 대응으로 문제 없는 경우는, 운용이 편하기 때문에 이런 형태로 대응해 나가면 좋겠다고 생각했습니다.
  • 좋은 웹페이지 즐겨찾기