こんにちは。データサイエンティスト兼、データ基盤エンジニアのshobyです。
皆さんは、開発環境のRedShiftでテスト用に本番データを使用したい場合にどうやってデータを移していますか?
今回は、S3を用いて本番環境のRedShiftから、開発用のRedShiftにデータを移す方法についてご紹介します。
概要
- RedShiftの開発環境と本番環境
- S3を使ったデータの移動
- TVISION INSIGHTSでの活用事例
RedShiftの開発環境と本番環境
皆さんはRedShiftの開発環境と本番環境をどのように管理していますか?
おそらく開発環境と本番環境の分離度には以下の3段階が存在します。
- 同一RedShiftクラスター内で、開発用データベースと、本番用データベースを用意する
- 開発用RedShiftクラスターと、本番用RedShiftクラスターをそれぞれ立てる
- 開発用AWSアカウントにRedShiftクラスターを立て、本番用AWSアカウントにRedShiftクラスターを立てる
いずれの方式を採用するにせよ、本番環境から開発環境にデータを移すのは一手間かかります。 今回は、どの方式においても簡単にデータを移せるS3を使った方法をご紹介します。
S3を使ったデータの移動
異なる環境のRedShiftにデータを移す場合には、S3を用いて、UNLOADコマンドとCOPYコマンドを使うのが簡単です。
UNLOADはクエリの実行結果をS3にexportするためのコマンドで、COPYはS3などのデータソースからデータをimportするためのコマンドです。
以下の手順でデータの移動を行います。
- データ移行用のS3バケットを作成
- 移行用S3バケットにアクセス権限があるkeyを発行
- 開発環境に本番同等のテーブルを作成
- 移行用S3バケットにUNLOAD
- 移行用S3バケットからCOPY
データ移行用のS3バケットを作成
移行用に新しく空のバケットを作成します。 UNLOADの出力先は、空のバケット、もしくは空のディレクトリである必要あります。
もし、既に作業用のバケットが存在する場合には、空のディレクトリを作成しても構いません。
移行用S3バケットにアクセス権限があるkeyを発行
IAMで該当のバケットに対するアクセス権限を持つkeyを発行します。
詳細はこの記事では割愛します。以下をご参照ください。
開発環境に本番同等のテーブルを作成
開発環境に本番同等のテーブルを作成します。
既存のテーブル定義は以下のクエリで確認できます。 この結果を元に、CREATE TABLE文を作成します。
SELECT * FROM pg_table_def WHERE tablename = 'target_table';
DataGripを使用している場合には、対象のテーブルを右クリックし、 SQL Scripts > Generate DDL to Clipboard で、 既存テーブルと同等のCREATE TABLE文を生成することができます。
移行用S3バケットにUNLOAD
以下のコマンドでS3バケットにデータをUNLOADすることができます。
UNLOAD ('SELECT * FROM target_table ORDER BY id') TO 's3://target_bucket/' ACCESS_KEY_ID 'access_key_id' SECRET_ACCESS_KEY 'secret_access_key';
この際、sort_keyでORDER BYをすることにより、COPYの際にsort済みの状態でimportをすることができます。
移行用S3バケットからCOPY
以下のコマンドでS3バケットからデータをCOPYすることができます。
COPY target_table FROM 's3://target_bucket/' ACCESS_KEY_ID 'access_key_id' SECRET_ACCESS_KEY 'secret_access_key';
TVISION INSIGHTSでの活用事例
TVISION INSIGHTSでは、調査機器のログデータに対する変換処理に手を入れる場合などに、 開発環境で本番データを用いた検証処理を行なっています。
そのような検証処理のタイミングで、S3を用いたデータの移動を活用しています。
まとめ
RedShiftの本番から開発環境にデータを移すのは手のかかる作業ですが、S3を用いて、 UNLOADとCOPYを活用することで、簡単にデータを移すことができます。