Amazon ECS上にEmbulkを立ててRDSのデータをBigQueryに同期する

2017.12.7

こんにちは、エンジニアの大原です。

この記事は Findy Advent Calendar 7日目の記事です。

分析のために、RDSに入っているデータをBigQueryに定期的にサクッと同期したいなと思い、Embulkを試してみました。
環境構築もDockerでサクッとやって、ECSのScheduled Tasksで定期実行させれば色々楽そうと思い、やってみました。

手順

Dockerイメージ作成

javaのコンテナをベースにEmbulkがインストールされたコンテナを用意します。
configディレクトリにEmbulkの設定ファイルを置いています。json-key.jsonはBigQueryに接続するためのキーファイルです。
以下のようなDockerfileを作成します。


FROM java:8

RUN apt-get -y update && apt-get -y upgrade

RUN curl -o /usr/local/bin/embulk --create-dirs -L "http://dl.embulk.org/embulk-latest.jar" && \
    chmod +x /usr/local/bin/embulk

RUN /usr/local/bin/embulk gem install embulk-input-mysql embulk-output-bigquery

COPY config /root/
COPY json-key.json /root/

COPY start.sh /start.sh
RUN chmod +x /start.sh

WORKDIR /root
CMD ["/bin/sh", "/start.sh"]

start.shでconfig配下の設定を全て実行するようにしました。


ls /root/*.yml.liquid | xargs -I {} embulk run {}

こちらのDockerfileをビルドしてRegistryにプッシュしておきます。

Embulk設定ファイル作成

configディレクトリ配下にymlを作成します。Embulkは同期するテーブルごとにymlファイルを作成する必要があるようです。
データベースの接続情報は環境変数にしておくと良いでしょう。BigQuery接続用のjsonキーファイルのパスもJSON_KEY_PATHとして環境変数化しました。
以下はusersテーブルを同期するymlの例です。


in:
  type: mysql
  host: {{ env.RDS_HOSTNAME }}
  user: {{ env.RDS_USERNAME }}
  password: {{ env.RDS_PASSWORD }}
  database: {{ env.RDS_DB_NAME }}
  table: users
  select: id, name, created_at, updated_at
out:
  type: bigquery
  mode: replace
  auth_method: json_key
  json_keyfile: {{ env.JSON_KEY_PATH }}
  dataset: {{ env.BQ_DATASET }}
  table: users

ECS設定

  • クラスター&インスタンス作成
    CLIでも出来ると思いますが、今回は普通にAWSのコンソールから作成しました。
  • タスク定義作成
    タスク定義ファイルDockerrun.aws.jsonを作成します。

{
  "containerDefinitions": [
    {
      "name": "embulk-task",
      "image": "my-registry/embulk",
      "memory": 1024,
      "environment": [
        {
          "name": "RDS_DB_NAME",
          "value": "hoge"
        },
        {
          "name": "RDS_HOSTNAME",
          "value": "hoge.ap-northeast-1.rds.amazonaws.com"
        },
        {
          "name": "RDS_PASSWORD",
          "value": "hoge"
        },
        {
          "name": "RDS_USERNAME",
          "value": "hoge"
        },
        {
          "name": "JSON_KEY_PATH",
          "value": "/root/json-key.json"
        },
        {
          "name": "BQ_DATASET",
          "value": "hoge"
        }
      ]
    }
  ],
  "family": "embulk-task"
}

こちらのファイルをもとに、AWS CLIでタスク定義を作成します。


$ aws ecs register-task-definition --cli-input-json file://Dockerrun.aws.json
  • タスク実行(単発)
    以下のコマンドを実行するとembulkタスクが一度だけ実行されます。

$ aws ecs run-task --cluster embulk --task-definition embulk-task --count 1
  • タスク実行(スケジュール)
    ECSのScheduled Taskを利用することでembulkタスクを定期実行させることができます。
    CLIでは作成できないようなので、コンソールから作成しました。
  • ECSコンソールでクラスターを選択し、タスクのスケジューリング→作成
  • スケジュールルールの名前: embulk-update
  • スケジュールルールタイプ: Cron 式
  • Cron 式: cron(0 9 * * ? *)
  • ターゲット ID: embulk-update
  • タスク定義: embulk-task

これで定期的にRDSとBigQueryのデータが同期されます。

読んで頂きありがとうございました! 宜しければ、エンジニアの皆様はFindyでご自身のスキル偏差値を測定してみてください。

[正社員の方]
ハイスキルなエンジニアのプレミアム転職サービス Findy

[フリーランスの方]
フリーランス・副業エンジニア向けの単価保証型の案件紹介サービス Findy Freelance

また、Findyでは年齢や勤務形態を問わず、様々な働き方で採用をしています。興味のある方は、こちらからご応募どうぞ!

Findyブログを購読してみませんか?
エンジニアの働き方やFindyの技術的な話などをお送りします!

GitHub連携するだけで、スキルを解析。
スキル偏差値やプロフィール情報を基に、人気のテック企業からオファーが届く

https://findy-code.io/
  • Category

  • About

  • Service

    フリーランス・副業向け
    単価保証型案件紹介サービス

    ハイスキルなフリーランス・副業エンジニア向けに案件紹介

    https://freelance.findy-code.io/
    ハイスキルなエンジニアの
    プレミアム転職サービス

    スキル偏差値が高いエンジニアに、人気のテック企業からオファーが届く

    https://findy-code.io/
    リアルタイムAI求人票採点サービス

    AIを使ってリアルタイムに求人票を採点

    https://findy.us/