Golang 및 Line Notify를 사용하여 API의 인증서 만료 확인 #golang

11912 단어 5Line
API의 사활 감시와 증명서의 만료(※)의 체크를 golang 를 이용해 실시해, 결과를 Line Notify 를 사용해 통지합니다.
※ Let's Encrypt를 이용하고 있지만 3개월 만에 만료됨

golang 은 회사에서 새로운 프로다우트에 이용할 가능성이 있었기 때문에 시험에 사용해보기로 했습니다.

이전 준비


  • Golang 개발 환경 구축 (아래 사이트 참조)

  • Golang 본가 사이트
  • Intellij golang IDE

  • Line Notify 준비
  • 명령줄에서 LINE으로 메시지를 보낼 수 있는 LINE Notify


  • 사양



    인수에 체크 대상의 엔드 포인트의 URI 및 Line Notify 용의 Token 를 설정할 수 있도록(듯이) 한다
    $ apichecker -endpoint=${エンドポイントURI} -token=${Line Notify 用 Token} 
    

    소스 코드


    $ go version
    go version go1.9 darwin/amd64
    

    apichecker.go
    package main
    
    import (
        "fmt"
        "net/http"
        "flag"
        "log"
        "net/url"
        "strings"
        "io/ioutil"
    )
    
    func main() {
        var endpoint = flag.String("endpoint", "", "check target Endpoint URL")
        var lineToken = flag.String("token", "", "LINE notify token")
        flag.Parse()
    
        var apiResult = getAPI(*endpoint)
        var result = postLINE(*lineToken, apiResult)
    
        fmt.Printf("LINE Post result [%t]\n", result)
    }
    
    func getAPI(endpoint string) string {
        if endpoint == "" {
            log.Fatal("not endpoint")
            return "not endpoint"
        }
    
        var result = ""
        resp, err := http.Get(endpoint)
        if err != nil {
            result = fmt.Sprintf("NG [%s]", err)
        } else {
            defer resp.Body.Close()
            result = fmt.Sprintf("OK [%s]", endpoint)
        }
    
        return result
    }
    
    func postLINE(token string, message string) bool {
        if token == "" {
            log.Fatal("not token")
            return false
        } else if message == "" {
            log.Fatal("not text")
            return false
        }
    
        data := url.Values{"message": {message}}
        r, _ := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(data.Encode()))
        r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
        r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
        resp, err := http.DefaultClient.Do(r)
        if err != nil {
            log.Fatal(err)
            return false
        }
        defer resp.Body.Close()
        _, err = ioutil.ReadAll(resp.Body)
        if err != nil {
            log.Fatal(err)
            return false
        }
    
        return true
    }
    

    LINE Notify를 Go로 보내기 를 참고로 했습니다.

    실행 결과



    OK인 경우


    $ go run apichecker.go -endpoint=https://www.yahoo.co.jp -token=${Line Notify 用 Token}
    LINE Post result [true]
    



    NG의 경우(인증서 오류)


    $ go run apichecker.go -endpoint=https://www.yahoo.jp -token=${Line Notify 用 Token}
    LINE Post result [true]
    



    Appendix


  • 소스 코드
  • 좋은 웹페이지 즐겨찾기