[Logstash] GCS에서 BigQuery로 로그를 가져오는 방법

개시하다


일상적인 데이터 가공으로 Elastic사의 Logistash[1]를 사용하는 사람
약간의 데이터 가공과 인출을 할 때 Logistash에 의존하기 쉽습니다^^;
최적의 아키텍처의 의미는 이해하기에 더 좋은 방법이 있지만
때로는 익숙한 도구에 의존하기도 한다(웃음)

하고 싶은 일


이번에는 Google Cloud Storage에 저장될 CSV 형식의 로그 데이터입니다.
BigQuery(이후, BQ)를 가져오고 날짜를 포맷하기를 원합니다.
그래서 로고 스태시로 이루기로 했습니다.

이번 도전.


다음 플러그인을 사용하여 데이터를 얻습니다.
  • logstash-input-google_cloud_storage [2]
  • logstash-output-google_bigquery [3]
  • 운영 환경


    Product
    version
    Logstash
    7.11.2
    Open JDK
    11.0.10
    OS
    CentOS 7.7
    BigQuery
    2021년 3월 18일 기준
    Cloud Storage
    2021년 3월 18일 기준
    Region
    asia-northeast1
    【구성도】

    [전제조건]
    ・GCP 콘솔 작업은 소유자 권한에 의해 수행됩니다.
    ·GCS의 통(log-bucket)이 제작되었습니다.
    ・ 로그 저장 경로는 log-bucket/LogData/20210318/testlog.gz입니다.
    · BQ의 시계(log-table)가 제작되었습니다.
    ・ 테이블의 전체 경로는 test-project.dev_dataset.log-table입니다.

    구현 단계

  • 서비스 계정의 창설
  • OpenJDK 설치
  • 창고의 등록
  • Logstash 설치
  • 플러그인 설치
  • 로그 데이터 및 테이블 모드
  • 파이프라인 정의 파일의 설정
  • 데이터 획득 확인
  • 1. 서비스 계정 만들기


    Cloud Shell을 시작합니다.

    다음 명령을 사용하여 서비스 계정for-logstash을 만듭니다.
    $ gcloud iam service-accounts create for-logstash \
        --display-name="for-logstash"
    
    다음 명령을 사용하여 서비스 계정에 다음과 같은 역할을 분배한다.
    • 스토리지 객체 관리자
    • BigQuery 데이터 편집
    • BigQuery 작업 사용자
    $ gcloud projects add-iam-policy-binding test-project \
        --member="serviceAccount:[email protected]" \
        --role="roles/storage.objectAdmin"
    
    $ gcloud projects add-iam-policy-binding test-project \
        --member="serviceAccount:[email protected]" \
        --role="roles/bigquery.dataEditor"
    
    $ gcloud projects add-iam-policy-binding test-project \
        --member="serviceAccount:[email protected]" \
        --role="roles/bigquery.jobUser"
    
    logstash-vm에서 만든 서비스 계정을 지정합니다.
    $ gcloud compute instances set-service-account logstash-vm \
       --service-account [email protected]
    

    2. OpenJDK 설치


    GCP 콘솔에서 브라우저 창에서logstash-vm로 로그인합니다.
    다음 명령을 사용하여 OpenJDK를 설치합니다.
    $ sudo yum install java-11-openjdk-devel
    
    다음 명령을 사용하여 설치를 확인합니다.
    $ sudo java -version
    openjdk version "11.0.10" 2021-01-19 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode, sharing)
    

    3. 창고 등록


    다음 명령을 사용하여 Elastic 저장소를 등록합니다.logstash.repo, 이름 모두 가능
    $ sudo vi /etc/yum.repos.d/logstash.repo
    
    상술한 문서에 기재된 내용은 다음과 같다.
    [logstash-7.x]
    name=Elastic repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    
    【참고】
    Installing Logstash

    4. Logstash 설치


    다음 명령을 사용하여 PGP 키 파일을 가져오고yum 명령으로 Logstash를 설치합니다.
    $ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    $ sudo yum install logstash
    
    다음 명령을 사용하여 설치를 확인합니다.
    $ sudo yum list installed | grep logstash
    logstash.x86_64          1:7.11.2-1          @logstash-7.x
    
    다음 명령을 사용하여 자동 시작 설정과 상태를 확인합니다.
    $ sudo systemctl daemon-reload
    $ sudo systemctl enable logstash
    $ sudo systemctl status logstash
    

    5. 플러그인 설치


    다음 명령을 사용하여 두 개의 플러그인을 설치합니다.
    Installation successful로 표시되면 OK입니다.
    $ sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-google_cloud_storage
    Validating logstash-input-google_cloud_storage
    Installing logstash-input-google_cloud_storage
    Installation successful
    
    $ sudo /usr/share/logstash/bin/logstash-plugin install logstash-output-google_bigquery
    Validating logstash-output-google_bigquery
    Installing logstash-output-google_bigquery
    Installation successful
    
    다음 명령을 사용하여 설치를 확인합니다.
    $ /usr/share/logstash/bin/logstash-plugin list logstash-input-google_cloud_storage
    logstash-input-google_cloud_storage
    
    $ /usr/share/logstash/bin/logstash-plugin list logstash-output-google_bigquery
    logstash-output-google_bigquery
    

    6. 로그 데이터 및 테이블 모드


    GCS에서 구성된 로그 데이터는 다음과 같습니다.
    [로그 형식]
    "colums1","colums2","colums3","colums4","time_stamp"
    
    【로그 샘플】
    "data1","data2","data3","data4","2021/03/18 01:12:42"
    
    대상 BQ를 저장하는 테이블 모드는 다음과 같습니다.
    필드 이름
    타입
    패턴
    colums1
    STRING
    NULLABLE
    colums2
    STRING
    NULLABLE
    colums3
    STRING
    NULLABLE
    colums4
    STRING
    NULLABLE
    time_stamp
    TIMESTAMP
    NULLABLE

    7. 파이프라인 정의 파일의 설정


    파이프라인 정의 파일(logstash.conf)을 설정합니다.
    $ sudo vi /etc/logstash/conf.d/logstash.conf
    
    logstash.conf에 기록됩니다.
    logstash.conf
    input {
      google_cloud_storage {
        # GCSを見にいく間隔(秒)
        interval => 60
        # GCSのバケット名
        bucket_id => "test-bucket"
        # 取込むファイル名
        file_matches => "LogData/20210318/testlog.*.gz"
        # プレーンテキストとして読込む
        codec => "plain"
      }
    }
    
    filter {
      csv {
        # CSVのヘッダー情報
        columns =>
        [
          "colums1",
          "colums2",
          "colums3",
          "colums4",
          "time_stamp"
        ]
      }
      date {
        # 日付型としてマッチする
        match => ["time_stamp", "yyyy/MM/dd HH:mm:ss"]
        # タイムゾーン指定
        timezone => "Asia/Tokyo"
      }
    }
    
    output {
      # BQに出力
      google_bigquery {
        # GCPのプロジェクト名
        project_id => "test-project"
        # 出力したいBQのデータセット名
        dataset => "dev_dataset"
        # BQに取り込みたいフィールド名と型を指定
        csv_schema => "colums1:STRING,colums2:STRING,colums3:STRING,colums4:STRING,time_stamp:TIMESTAMP"
        # テーブル名を指定
        table_prefix => "log-table"
        # テーブル名につく接続文字を消す
        table_separator => ""
        # テーブル名の後に付く日付フォーマットを消すことにより日付できない。
        date_pattern => ""
        # エラー時に出力されるファイルのディレクトリ名
        error_directory => "/tmp/bigquery-errors"
        # テーブルスキーマと一致しない余分な列値を無視する
        ignore_unknown_values => true
      }
    }
    
    [설정된 해설]
    ・이번에 인출할 서류는 testlog.gz,testlog.01.gz도 인출할 수 있습니다.
    시간stamp 필드의 날짜 형식을 ISO8601로 변환하기 위해date Filter를 사용합니다.
    · 시간대에 아시아/Tokyo를 지정함으로써 UTC 시간으로 BQ에 저장한다.
    · BQ에 대한 기본 출력은 테이블 이름TablePrefix_%Y-%m-%dT%H:00으로 설정됩니다.
    ・표 이름만 지정할 때 table_separatordate_pattern는 공백입니다.
    • 파티션 분할 테이블은 작성된 BQ 테이블에 저장할 때 사용할 수 있습니다.
    ・이번엔 분할표를 미리 만들어 BQ 출력으로 보관한다.
    ・ 로그 데이터 필드에서 테이블에 저장되지 않은 필드는 remove field에서 삭제됩니다.
    ·ignore_unknown_values는 진짜이며 가져오지 않을 수도 있다.
    로그 BQ 출력에서 테이블을 만들려면 파티션 분할 테이블로 사용할 수 없습니다.
    또 Logistash에서도 BQ에 저장된 데이터를 중복 제거하는 메커니즘이 이뤄지지 않았다.
    Logstash 가져오기 시 자동 새김@timestamp은 BQ로 출력할 때 "@"을 제거하고 Insert를 실행하는 동작입니다.따라서 다른 timestampTimeStamp 등 (대소문자 구분 없음) 필드가 있다면 @timestamp 시간에 임의로 덮어쓰일 수 있으니 주의하세요!

    8. 데이터 획득 확인


    Logstash에 따라 BQ에 저장된 데이터는 스트리밍 형식으로 가져옵니다.
    https://cloud.google.com/blog/products/bigquery/life-of-a-bigquery-streaming-insert
    따라서 저장 후 즉시 아래 상태로 들어간다.
    (최대 90분 후 테이블에 저장)

    총결산


    그럼, 어때요?
    지속적인 활용을 시야에 두고 관리 서비스에 보내는 방법도 많다고 생각합니다.
    특히 데이터 가공 없이 BQ에만 액세스할 경우 BigQuery Data Transfer Service[4]
    데이터 가공도 GUI의 코드가 없는 것으로 하면 클라우드 데이터 퓨전[5]도 가능하다.
    자신의 요구에 부합되는 방법으로 다양한 데이터 공학을 즐겨라!!
    각주
    로그 ↩︎
    Google Cloud Storage Input Plugin ↩︎
    Google BigQuery output plugin ↩︎
    BigQuery Data Transfer Service 개요 ↩︎
    Cloud Data Fusion ↩︎

    좋은 웹페이지 즐겨찾기