LoginSignup
8
6

More than 5 years have passed since last update.

Amazon Athenaのクエリ結果をLambdaを使って自動でgzip圧縮する

Posted at

これはマイネット Advent Calendar 2016 21日目の記事です。

対象読者

以下のいずれかに当てはまる人

  • Amazon Athenaを利用している。
  • AWS Lambdaを試してみたい。

やりたいこと

Athenaのクエリ結果はCSVでS3に保存される。
クエリによる集計済みのデータとは言え、生のCSVだと数百MB~数GBになることもある。
gzip圧縮することで、ダウンロード時の帯域と転送料金を節約したい。

手順

AWSコンソールからLambdaの新規作成を選択したところから、画面キャプチャ付きで解説

Lambda Functionのテンプレートを選択

image

トリガーの設定

S3を選択し、CSVファイルの作成時にLambdaが起動するように設定する。
image

Lambda Functionの設定

Lambda Functionの設定画面になるので、適切に設定する。
gzip圧縮するタスクの場合、検証の結果Node.jsが高速だったので、ここではNode.jsを使用する
image
image

Roleの作成

上記画面で、Create New Roleを選択すると、Role作成画面へ移動するので、Roleの作成を行う。
image

コードを書く

設定を完了し、Lambda Functionを作成すると、コードの編集&テスト画面へ移る。
書き込まれたCSVをgzip圧縮をしてS3へ保存するコードを書く。
image

コードは「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では、テストイベントを設定してコードを起動できる。
image

今回は、バケット名とパスのみ参照するため、テスト用のパスに書き換える。
image

テストを実行する

image

結果を確認する

image

トリガーを有効化する

image

実際にAthenaでクエリを発行してみる。

サンプルテーブルに対して適当にクエリを発行してみる。
image

S3を見に行くと、CSVファイルと一緒にgzip圧縮されたファイルも作成されていることが確認できた。
image

結果

Athenaでクエリを発行するだけで、自動でgzipファイルが作成されるようになった。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6