API Gateway + Lambda でQiita::Team のポエムを集約してみました

  • 23
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

「ポエム」のタグを付けた投稿を #poem チャンネルに集約するためにAPI Gateway とLambda を使ってみました。

Qiita::Team のWebhook => API Gateway => Lambda => Slack の流れで、Qiita::Team の投稿をSlack に通知する流れです。

細かい設定は公式のドキュメントが丁寧に説明してくれています。また、API Gateway + Lambda の連携は書いてくれている人が多いので説明は割愛。

Lambda の設定

API Gateway で適宜Webhook のPOST データを受け取れる様にすると、 event 変数にJSON データが受け渡されます。

var https = require('https');
exports.handler = function(event, context) {
    console.log('event: ' + JSON.stringify(event, null, 4));
    var payload = event;

    // 不要なアクションはスキップ
    // cf. https://qiita.com/api/webhook/docs
    var nop = true;
    if (payload.action === 'created') { 
        payload.item.tags.some(function(e, index) {
            if (e.name === 'ポエム') {
                nop = false;
                return true;
            }
        });
    }
    if (nop) {
        context.succeed('NOP');
        return;
    }

    var options = {
        host: 'hooks.slack.com',
        port: 443,
        path: '/services/xxx/xxxxxx', // NOTE: Slack のIncoming Webhook URL を指定する 
        method: 'POST',
        headers: { 'Content-Type': 'application/json' }
    };

    // Slack への投稿フォーマット指定
    // cf. https://api.slack.com/incoming-webhooks
    var response = {
        channel: '#poem', 
        username: 'poemer', 
        text: 'ポエム入荷しました!',
        icon_emoji: ':kissing_cat:',
        attachments: [
            {
                "title": payload.item.title,
                "title_link": payload.item.url,
                "fields": [
                    {
                        "title": "Author",
                        "value": payload.user.url_name,
                        "short": true
                    }
                ]
            }
        ]
    };

    // Slack へのPOST
    var req = https.request(options, function(res) {
        var body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            body += chunk;
        });
        res.on('end', function() {
            console.log('Successfully processed HTTPS response');
            // If we know it's JSON, parse it
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
            }
            context.succeed(body);
        });
    });
    req.on('error', context.fail);
    req.write(JSON.stringify(response));
    req.end();
};

Qiita::Team のWebhook 通知のToken はチェックしていないので、セキュリティ的な部分が気になる人はチェックするとよいと思います。

Qiita::Team から飛んでくるデータは公式ドキュメントを参照してください。

AWS コンソールでポチポチすれば簡単に作れるのでお試しあれ。

追記:こんな感じで通知されます

Screen Shot 2016-02-09 at 13.01.23.png