Azure Function에서 WebAPI를 정기적으로 모니터링하고 이상을 Slack에 알립니다.

17613 단어 AzureAzureFunctions
Azure Function에 있는 지정 시간에 처리를 실행하는 기능 「Timer Triger」를 이용해 WebAPI에 연결되는지/정상적인 값을 돌려줄지 일정 시간 간격으로 체크를 실시해, 이상이 있으면 SLACK에 통지를 실시한다.

Timer Triger는 현 단계에서는 C#, F#, JavaScript 밖에 대응하고 있지 않기 때문에, 이번은 JavaScript로 실시한다.

알림 대상 SLACK의 Web Hook URL 가져 오기


  • slack 화면 왼쪽 하단의 "App"의 + 버튼을 클릭하십시오


  • incomming-webhook에서 검색하고 설치를 클릭하십시오


  • Webhook URL을 복사하십시오



  • Azure Function 설정


  • 포털 사이트의 왼쪽 메뉴에서 "App Service"→ "+ 추가"→ "Function App"→ "생성".


  • 포털 사이트의 왼쪽 메뉴에서 "Function App"→ "함수"→ "새 기능"


  • Timer Triger 선택 → 언어 (JavaScript) 지정 → 실행 시간 지정 → 작성



  • Schedule에 실행 일시를 입력.
    6시간마다 0분 0초에 실행의 경우, 「0 0 */6 * * *」라고 입력.

    request 모듈 설치



    초기 상태에서는 request 모듈을 사용할 수 없으므로 설치한다.

    https://[function-name].scm.azurewebsites.net/DebugConsole
    에서 디버그 콘솔을 엽니다. ([function-name]에 내 함수 앱 이름 입력)

    cd로 D:\home\site\wwwroot[함수명]으로 이동한다.
    D:\home>cd site\wwwroot\TimerTriggerJS1
    D:\home\site\wwwroot\TimerTriggerJS1> 
    

    request 모듈 설치
    D:\home\site\wwwroot\TimerTriggerJS1>npm init
    D:\home\site\wwwroot\TimerTriggerJS1>npm install --save request
    

    테스트 실행 및 저장



    다음을 입력하고 "저장 및 실행"을 누르면 테스트가 실행됩니다.
    동작에 문제가 없으면 「저장」을 누르는 것으로 Schedule에서 지정한 시간에 실행된다.
    module.exports = function (context, myTimer) {
        var SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/〇/△/□"; // ↑でコピーした通知先SLACKのWebhook URL
        var API_URL = "http://〇.〇.〇.〇/api/hoge"; // 死活チェックするWebAPIのURL
    
        var data = "";
        var channel = "channel_name"; // 通知先のSLACKチャンネル名
    
        var request = require('request');
        var http = require('http');
    
    
        var options = {
            url: API_URL
            ,method: 'GET'
            ,json: true
        };
    
        var payload = {};
        payload.username = "hoge_bot"; //slackに表示される名前
        payload.icon_emoji = ":anger:" // アイコン
        payload.channel = channel;
    
    
        http.get(API_URL, (res) => {
            const { statusCode } = res;
            const contentType = res.headers['content-type'];
    
            context.log(statusCode);
            let error;
            if (statusCode !== 200) {
                data = "Failure accessing " + API_URL + ", Status Code : " + statusCode;
            } else if (!/^application\/json/.test(contentType)) {
                error = new Error('Invalid content-type.\n' +
                                `Expected application/json but received ${contentType}`);
            }
            if (error) {
                data = "API_URLにアクセスに失敗した。" + ", " + String(error);
            }
    
            res.setEncoding('utf8');
            let rawData = '';
            res.on('data', (chunk) => { rawData += chunk; });
            res.on('end', () => {
                try {
                    const parsedData = JSON.parse(rawData);
                    if ("<返されるJSONデータに含まれるキー>" in parsedData) {
                        articles = parsedData.articles;
                    } else {
                        data = "パースした結果にキーが含まれていなかった。" + String(rawData);
                    }
    
                } catch (e) {
                    context.error(e.message);
                    data = "パース自体に失敗した" + String(rawData);
                }
    
                payload.text = data;
    
                var options = {
                    url: SLACK_WEBHOOK_URL
                    ,method: 'POST'
                    ,headers: 'Content-type: application/json'
                    ,json: payload
                };
                request.post(options, function (error, response, body) {
                    context.log("Response Code : "+response.statusCode);
                })
                context.done();
            });
    
        }).on('error', (e) => {
            data = API_URL + "へアクセスできませんでした。ERROR : " + + String(e);
    
            payload.text = data;
    
            var options = {
                url: SLACK_WEBHOOK_URL
                ,method: 'POST'
                ,headers: 'Content-type: application/json'
                ,json: payload
            };
            request.post(options, function (error, response, body) {
                context.log("Response Code : "+response.statusCode);
            })
            context.done();
        });
    
    };
    



    동작





    수수료



    6시간에 1회 실행으로 0.32엔/1일≒10엔/30일 정도

    좋은 웹페이지 즐겨찾기