俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #76 - AWS Data Pipelineを使ってRDSをRedshiftに送ってみる

今日も朝から一日中、
はさみの音も軽やかに、
ひつじ刈るその仕事場に、
山なす白いその、
巻き毛!!

調子をそろえて、クリッククリッククリックですよ!

昔も今もクリックしてたんです。
さて、童心に帰るのはこの辺にして、今日はRDSからRedshiftへデータを移す話。

最強なのはRDSのバイナリログをRedshiftに食わせるという方法です。
INSERTされたものだけでなく、 UPDATEされたものやDELETEされた部分もしっかりと追跡できて、
完全に「同期」可能です。
で、そういうサービスは既にございます。
http://aws.typepad.com/aws_japan/2014/10/rdsmysql_redshift.html
この皆さんに大人気のブログにも多数紹介されております。
なんでも、MySQL5.6になってから行ベースでのバイナリログにアクセスできるようになったそうで、
それをPostgre用に変換しつつRedshift上で実行する、といった感じのサービスがあるそうです。
便利な世の中ですね。
とはいっても、有料です。
出来るだけお金をかけずに達成したいものです。

さすがにバイナリログを持ってきて動向するってのはかったるいし、
そもそもRedshiftに移したいデータの利用目的はあくまで「分析」です。
そんなに正確なデータはいらないということで、
とにかく毎日新規に書き込まれた分のデータを移行さえできていれば大体おkなわけです。
そうすると簡単ですね。
SQLを発行してCSVに書き出し、それをRedshiftに食わせるPHPを書いてcronに読ませればいいのです。

なんですが、
どうせCSVに書き出すんならバックアップになるし、それS3にあげておきたいと思うのです。
それにPHPを書くにしてもリポジトリ作る程でもないくせに、
そこそこ大事なスクリプトだから管理も厄介だなぁとか思うわけです。
なので、ちょっと色気出して、Amazon Data Pipelineとかいう珍しいものを使ってみることにしました。

まだちょっと使い方あやしいのですが、
とりあえずRDSからS3にCSV書き出しをし、
S3からRedshiftへインサートする。
これをスケジュール組んで行うインターフェースを用意しているそうなので、やってみます。

色々飛ばして、結果。
こんな概要図で一応できました。

f:id:tom_rc:20141107214252p:plain

とっつきやすそうで結構厄介だったので、ぶっちゃけPHP書いたほうがいいかな、、、と思いつつ、
かなーり資料がすくないDataPipelineを使ってみたのでご報告ということでした。

つまずきやすいところを以下に列挙しておきます。

EC2→RDSのときConnectionが貼れないようエラー

こんな感じのエラー

Unable to establish connection data pipeline
これが出たら、EC2のセキュリティグループを設定しているか確認しましょう。
RDSへのアクセスは同じセキュリティグループじゃないと駄目です。

なんかエラーが発生して止まった

そしたらコンソールでしっかりStatusをMark Finishedにしてアクティビティを終了させましょう。

Redshiftに接続できなくね?IP指定だと

そないなことありません。
Redshiftと同じリージョンにセキュリティグループを作ってそれにパーミッションを与えましょう。
そして、EC2インスタンスはそのリージョンに立ち上げるように設定しましょう。
具体的には、ResourcesのEc2Resourceグループで、Regionオプションパラメータをしていして、
そこで設定しましょう。

こんな感じです。
実際役に立つのか知らないですが、、、
やるだけやってみます。
じゃーあね。