Amazon Athena의 쿼리 결과를 Lambda를 사용하여 자동으로 gzip 압축

8262 단어 Athena람다AWS
이것은 마이넷 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 파일이 만들어지게 되었다.

    좋은 웹페이지 즐겨찾기