アクセスログはfluentdでBigQueryに流しているが、その情報とマスタデータを付きあわせてデータを出したい。Embulkでどうにか、とも考えたけどプロダクトの性質的にマスタデータがそれほど重くないので、何も考えずに毎回全部流してみることにした。キツくなってきたら考える。
ということでRDSの全データをBigQueryに転送するnpmを書いた。RDSだけではなくMySQLなら何でも可。差分の転送じゃなくて毎回全レコード転送するのでご注意を。
mysql-to-bigquery
使い方
以下はElasticBeanstalkのWorkerとして構築した時の例。Lambda(Scheduled Event) -> SQS -> ElasticBeanstalkという構成でバッチ処理を実現している。AWS LambdaのScheduled EventでSQSを叩くに書いたように構築するのは簡単。
Lambdaからは基本的にRDSに接続できない(SecurityGroupが面倒)ので、この構成にした。RDSを使う/使わないに限らず、重めのバッチはEB Workerに処理を寄せて、LambdaはScheduled EventでSQSを叩くだけに専念させてよいかと。EBもt2.microなら大した金額にもならないし。
var http = require('http');
var MySqlToBigQuery = require('mysql-to-bigquery');
var sqlToBq = new MySqlToBigQuery({
mySqlConfig: {
host: 'localhost',
user: 'root',
password: 'password',
database: 'database'
},
bigQueryConfig: {
projectId: 'bigquery_project',
keyFilename: "./path/to/file.json",
dataset: 'production'
}
});
// ここに転送したいテーブルを配列で
var tables = [
'users', 'articles
];
http.createServer(function(request, response) {
sqlToBq.exec(tables, function(error) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
});
}).listen(process.env.PORT || 8888);
Configはパラメータで渡さずに環境変数に設定してもOKです(詳細はREADMEを参照)。