MySQL
S3
JSON
Kinesis
Embulk

Embulkを使ってS3にあるJSONをMySQLに保存

S3にあるJsonファイルをMySQLにレコードとして保存

状況

Kinesis FirehoseでS3にログを送った後、どうにかして特定のログをMysqlに保存したかった。
なのでEmbulkで定期的にMysqlへ書き込んでやることに。

ちなみにFirehoseのTransform時にLambdaからMysqlにデータを保存しようとしたが、Lambdaがconnectionを使い切るみたいな記事を読んだので辞めた。MySQL + lambdaのgoogle 検索結果

使ったプラグイン

  • embulk-output-mysql
  • embulk-input-s3
  • embulk-parser-jsonl

configファイル

config.yml
in:
  type: s3
  bucket: xxxxx
  path_prefix: dev/2018/03/12/24/
  endpoint: s3-ap-northeast-1.amazonaws.com
  auth_method: instance
  parser:
    type: jsonl
    schema:
      - {name: first_name, type: string}
      - {name: last_name, type: string}
      - {name: sex, type: string}
      - {name: datetime, type: string}

out:
  type: mysql
  host: xxxxxxxxx.ap-northeast-1.rds.amazonaws.com
  user: xxxxx
  password: xxxxxxx
  database: xxxxx
  table: xxxxx
  mode: replace

ハマリポイント

改行コード

Kinesisで普通にログを出力するとJSON同士の切れ目がなくなるのでログ出力時に改行コードを入れるとパースしやすくなる

BAD:

{"a":1}{"b":1}

GOOD

{"a":1}
{"b":1}

embulkを実行しているEC2からS3へアクセスする時

もちろんIAMでS3にアクセス出来るようにしておく必要があるのと
config.ymlauth_method: instance を明記する必要がある

感想

どうしようかなと思って調べてから、約1時間でやりたいことが出来たのでembulkスゴい。