[AWS]S3からRedshiftにデータをロード&RedshiftからS3へデータ出力

2013.06.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

S3からRedshiftにデータをコピーする

前回はAmazon RedshiftをCLIから起動し、nodeプログラムからアクセスしてみました。
Redshiftにはこういった直接アクセスする手法だけでなく、S3やDynamoからデータをロードしたり、逆にS3やDynamoへ出力する機能があります。
今回はS3のファイルからRedshiftのテーブルに対してデータを追加とS3へのデータ出力を行なってみましょう。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.8

Redshiftクラスタやnodeのpgモジュールは前回を参考にセットアップしておいてください。

Amazon S3とRedshiftでデータのやり取り

Redshiftにテーブルを作成

では、RedshiftへS3からデータを登録してみましょう。
まずはRedshiftに対してテーブルを作成しておきます。下記のようなプログラムで作成してもかまいませんし、postgres用クライアントで接続してもかまいません。

var pg = require('pg');

var conString = "tcp://<ユーザー名>:<パスワード>@<endpoint>:<ポート番号>/<DB名>";
var client = new pg.Client(conString);
client.connect(function(err) {
    if(err) console.error(err);
});
var query = client.query("CREATE TABLE data_from_s3(id integer,name varchar(50), timestamp timestamp not null default current_timestamp)");

query.on('error', function(error) {
    console.error(error);
});
query.on('end', function(row, error) {
    client.end();
});

data_from_s3という名前で、idカラム、nameカラム、timestampカラムを持つテーブルを作成します。

S3へオブジェクトアップロード

data_from_s3テーブルへ登録するデータを記述したファイルをS3へ登録します。
csvファイルのように改行で1レコード、デフォルトでは「|」がdelimiterとしてデータを記述します。
下記のように記述すると、5レコード分のデータを記述したことになります。このファイルをusers.txtと名前をつけ、S3へアップロードしておきます。

1|taro|2010-01-12 14:15:57.119568
2|hanako|2011-03-10 12:13:17.372616
3|takeshi|2008-01-12 10:10:57.784833
4|jon|2009-03-30 10:34:57.3954958
5|yuki|2013-10-22 18:44:55.585858

copyコマンドでS3からRefshiftへ

copyコマンドを実行することで、S3のファイル内容をReedshiftへ登録することができます。
S3とRedshiftは同じリージョンでなければいけません。また、1レコードのサイズは4MBまでと制限されています。

・
・
var query = client.query("copy data_from_s3 from 's3://<S3のtxtファイルパス>' credentials \'aws_access_key_id=<アクセスキー>;aws_secret_access_key=<シークレットキー>\' timeformat 'YYYY-MM-DD HH:MI:SS'");

query.on('error', function(error) {
    console.log(error);
});
query.on('end', function(row, error) {
    client.end();
});

上記プログラムを実行すると、S3にアップロードしたデータがRedshiftに登録されます。
select文で登録されたのを確認してみましょう。

・
・
var query = client.query("SELECT * FROM data_from_s3");

query.on('row', function(row) {
    console.log(row);
});
query.on('error', function(error) {
    console.log(error);
});
query.on('end', function(row, error) {
    client.end();
});

Redshiftへ登録されているのを確認したら、今度は逆に、S3へRedshiftの内容を出力してみましょう。
unloadコマンドを使用すれば、S3へデータ内容が出力されます。
出力用バケットを作成し、そこへRedshiftのデータを出力してみましょう。

・
・
var query = client.query("unload ('select * from data_from_s3') to 's3://<出力先S3のパス>' credentials \'aws_access_key_id=<アクセスキー>;aws_secret_access_key=<シークレットキー>\'");

query.on('error', function(error) {
    console.log(error);
});
query.on('end', function(row, error) {
    client.end();
});

まとめ

いかがでしょうか。S3からRedshiftへの登録、逆にS3への出力もコマンド1つで簡単に実行できました。
なお、今回はS3データをtxtファイルで用意しましたが、gzipオプションを使用すると、gzip圧縮されたファイルを指定することができます。

参考サイトなど