Firebase RealtimeDatabaseに大量データ投入　-　その3　-

GYAOのtsです。

#経緯
[前回の投稿](https://qiita.com/tstakano-yj/items/6daa22f09d67cd2fa147)でデータの投入、更新はできるようになたので、お掃除jobであるcleanExpiredMessageを作ってみる。[GAEのcron](https://cloud.google.com/appengine/docs/python/config/cronref)つかってもいいのだが、面白そうなのでAzure LogicAppsと連携してみる。GUIで直感的だし。なんかエンジニアじゃなくても起動時間とか変えられそうだし。

#やりたいこと

* httpsリクエストで起動
* messagesの中のexpiredDate（unix timestamp）が過去のものを検索して、すべてdeleteする。

#Cloud Functions
```js:index.js
'use strict';

const rcloadenv = require('@google-cloud/rcloadenv');
rcloadenv.getAndApply('functionConfig');

/**
 * job that cleans expired messages.
 *
 * @param {!Object} req Cloud Function request context.
 * @param {!Object} res Cloud Function response context.
 */
exports.cleanExpiredMessage = (req, res) => {
    const key = req.query.key;
    if (!module.exports.authenticate(key)) {
        res.status(403).send('Security key does not match.');
    }
    else {
        console.log('invoke clean-expired-message Job.');
        const now = Math.floor( new Date().getTime() / 1000 );
        const messageRef = db.ref("messages");
        const updates = {};
        messageRef.orderByChild("expireDate").endAt(now).once('value', function(snapshot) {
            snapshot.forEach(function(child) {
                console.log(child.key);
                if (child.val().expireDate === undefined) {
                    console.log('expireDate is undefined.');
                    //do nothing.
                }
                else {
                    console.log(child.key + ' added to the delete list.');
                    updates[child.key] = null;
                }
            });
        }).then(() => {
            console.log('clean-expired-message ended.');
            return messageRef.update(updates);
        }).catch((e) => {
            console.error(e);
            throw e;
        });
        res.status(200).send('Success');
    }
};

/**
 * authentication method.
 *
 * @param key CRON_KEY
 * @returns {boolean} authenticated or not.
 */
exports.authenticate = function(key) {
    const secureCompare = require('secure-compare');
    if (!secureCompare(key, process.env.CRON_KEY)) {
        console.log('The key provided in the request does not match ' +
            'the key set in the environment. Check that', key,
            'matches the CRON_KEY');
        return false;
    }
    else {
        console.log('authenticated.');
        return true;
    }
}
```

* [upsertするとき](https://qiita.com/tstakano-yj/items/6daa22f09d67cd2fa147#coding)と同様、[multi-location updates ](https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html)を使用する。
    * Realtime databaseはnullでupdateするとremoveになるのでそれを利用。
* expireDateがないメッセージも引っ張ってくるため、undefinedの場合はremove対象には入れない。
* jobの起動認証は[Runtime Config](https://cloud.google.com/deployment-manager/runtime-configurator/)を使用する。[こちら](https://qiita.com/ottijp/items/bdabe443c5273874839d)で詳しく説明されている。
    * コンフィグ　’functionConfig’　に 下記のコマンドでCRON_KEYを設定する。

    ```bash
    $ gcloud beta runtime-config configs create functionConfig

    $ gcloud beta runtime-config configs variables set \
    CRON_KEY hogehoge \
    --is-text --config-name functionConfig

    ```
これで uri?key=hogehogeで起動できる。

#Azure Logic Apps
Azure LogicAppsで起動してみる。

* Azure Portalからロジックアプリ作成
<img width="479" alt="スクリーンショット 2018-07-11 14.24.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/36360e7b-8d8a-dac4-6c81-d5c9f7fc8e4c.png">

* 下記のように構築。今回は起動結果（statusコード等をslackに送信するように設定）
<img width="710" alt="スクリーンショット 2018-07-11 14.31.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/df3a4264-3f68-3903-37d8-e017b26b3c90.png">

* さらにslackアクションの設定で失敗時にも結果がslackに送られるように設定
<img width="727" alt="スクリーンショット 2018-07-11 14.36.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/fcbeeda8-fd52-5595-562a-d38e52a78abc.png">


#Slack, Cloud loggingで確認
* Slack 
<img width="560" alt="スクリーンショット 2018-07-11 14.37.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/9da8c3c3-3ac3-f516-1ac6-6445c9c146e9.png">
* Cloud logging <img width="617" alt="スクリーンショット 2018-07-11 14.39.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/95bc8ff1-24ab-f9b9-8506-539009ba5cdf.png">


問題なし。