これはマイネット Advent Calendar 2016 21日目の記事です。
対象読者
以下のいずれかに当てはまる人
- Amazon Athenaを利用している。
- AWS Lambdaを試してみたい。
やりたいこと
Athenaのクエリ結果はCSVでS3に保存される。
クエリによる集計済みのデータとは言え、生のCSVだと数百MB~数GBになることもある。
gzip圧縮することで、ダウンロード時の帯域と転送料金を節約したい。
手順
AWSコンソールからLambdaの新規作成を選択したところから、画面キャプチャ付きで解説
Lambda Functionのテンプレートを選択
トリガーの設定
S3を選択し、CSVファイルの作成時にLambdaが起動するように設定する。
Lambda Functionの設定
Lambda Functionの設定画面になるので、適切に設定する。
gzip圧縮するタスクの場合、検証の結果Node.jsが高速だったので、ここではNode.jsを使用する
Roleの作成
上記画面で、Create New Roleを選択すると、Role作成画面へ移動するので、Roleの作成を行う。
コードを書く
設定を完了し、Lambda Functionを作成すると、コードの編集&テスト画面へ移る。
書き込まれたCSVをgzip圧縮をしてS3へ保存するコードを書く。
コードは「AWS LambdaでS3に配置されたファイルをgzipする」をほぼそのまま利用した。
var aws = require('aws-sdk');
var zlib = require('zlib');
exports.handler = function(event, context) {
var bucket = event.Records[0].s3.bucket.name;
var key = event.Records[0].s3.object.key;
console.log('starting gzip ' + bucket + '/' + key);
var s3 = new aws.S3();
var gzStream = s3.getObject({ Bucket: bucket, Key: key }).
createReadStream().pipe(zlib.createGzip());
var s3obj = new aws.S3({ params: { Bucket: bucket, Key: key + '.gz' }});
s3obj.upload({Body: gzStream}).
send(function(err, data) {
context.done(err, data);
});
};
テストイベントを設定する
コードが期待通りに動作するかテストをする。
Lambdaでは、テストイベントを設定してコードを起動できる。
今回は、バケット名とパスのみ参照するため、テスト用のパスに書き換える。
テストを実行する
結果を確認する
トリガーを有効化する
実際にAthenaでクエリを発行してみる。
S3を見に行くと、CSVファイルと一緒にgzip圧縮されたファイルも作成されていることが確認できた。
結果
Athenaでクエリを発行するだけで、自動でgzipファイルが作成されるようになった。