Fargate環境でembulkを使ってMySQLからBigQueryへのマスタデータ転送

住まい暮らしメディアLIMIAで開発を担当している樋口です。
LIMIAではBigQueryを使ってデータ分析を行なっています。
ログデータについてはFirebase Analyticsに送信したデータをBigQueryへ書き出しています。
マスタデータについてはMySQLに格納されており、それをBigQueryへ送信する必要がありました。
embulkをfargate環境で動かすことで実現したため、それについて共有します。

embulkについて

embulkはデータローダです。
fluentdのバッチ版と言われており、オープンソースで開発されています。
fluentdと同じようにプラグインを導入することで、様々なデータソースに対応しています。
LIMIAでは入力をMySQL、出力をBigQueryとしています。
そのため、プラグインとして embulk-input-mysql と embulk-output-bigquery を利用しています。

今回のデータを転送するには、テーブル毎に2つのファイルを用意する必要があります。
1つは転送先のBigQueryテーブルのschemaを定義するファイルで、次のようになります。

files/etc/embulk/schema/idea.json

もう1つは転送設定ファイルです。
ファイル名の最後に.liquidと付けると、二重括弧 {{ }} を展開してくれます。
env. で環境変数を取得できるため、パスワードなどをここに格納しています。
以下の設定では、MySQLの対象テーブル全行をダンプし、それをBigQueryに転送して置き換えます。

files/etc/embulk/tables/idea.yml.liquid

コンテナ設定

embulkをインストールして、実行時にshell scriptを叩くようなDockerファイルを作ります。

Dockerfile

embulkで転送を実行するためには、コマンドラインで次のように打ちます。

LIMIAでは複数のテーブルを転送しているため、特定のディレクトリに転送設定ファイルを格納しておき、process_tables()の処理でそれを一括実行しています。
また、特定のテーブルのみ指定時刻に転送する要望があるため、process_specified()で個別転送可能としています。
BigQueryに転送するためには、service accountと呼ばれる権限を与えられた鍵ファイルが必要です。
それを暗号化して blob/${LIMIA_ENV}-bigquery-service-account.blob に置いておき、暗号化鍵をKMSに登録しておきます。
decypt()の処理でservice accountを復号化して、コンテナ内のファイルに保存しています。
GCP_PROJECT_ID と LIMIA_ENV は、環境変数から取得しています。
環境変数は、ECS Task Definitionsで設定しています。

files/entrypoint.sh

まとめ

embulkを使ってMySQLのマスタデータをBigQueryに転送する方法を説明しました。
これにより、マスタデータを絡めた分析が可能となりました。
ECS/Fargateについては軽く触れた程度ですので、可能なら次回その辺りについても共有したいと思います。

また、Fargate環境でS3にあるALBやCloudFrontのログをBigQueryに転送する方法も書きました。もしよければ、合わせてこちらもご覧ください。