LoginSignup
7
2

More than 5 years have passed since last update.

RDSのデータをBigQueryに同期する

Posted at

アクセスログは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を参照)。

参考

iQONを支えるデータ分析基盤/iqon-bigquery

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2