CloudFront 액세스 로그를 BigQuery로 분석

배경



여러가지로 CloudFront의 로그를 Athena라든지가 아니라 BigQuery로 분석하고 싶었기 때문에 시행착오한 이야기.

했던 일



CloudFront에서 로그 검색



로그를 저장하는 버킷 만들기



S3에 적당하게 버킷을 작성해 둔다.

CloudFront에서 로그 검색 설정


  • 로그를 얻으려는 배포판 설정 열기
  • 로그 설정 사용

  • 이상의 설정을 함으로써, S3에 액세스 로그가 보존되어 간다.
    로그에 대한 자세한 내용은 htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / 아마 존 C ぉ dF 롱 t / ㅁ st / ゔ ぇ ぺ ぺ ぐ い / 어쩌 ss gs. HTML을 참조하십시오.

    Embulk에서 S3에서 BigQuery로 로그 전송



    Embulk 취득



    적절한 디렉토리를 작성하십시오.
    % wget https://dl.embulk.org/embulk-latest.jar
    

    Gem 설치



    Embulk는 Java9 이후를 지원하지 않으므로 Java8을 사용하도록 설정합니다.
    jenv 등등으로 설정하는 것도 가능.
    % export JAVA_HOME=$(/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v 1.8)
    

    다음 Gem을 설치하십시오.
  • embulk-input-s3
  • embulk-output-bigquery
  • embulk-filter-concat
  • embulk-filter-column
  • embulk-filter-eval
  • embulk-filter-timestamp_format
  • % java -jar embulk-latest.jar gem install \
        embulk-input-s3 \
        embulk-output-bigquery \
        embulk-filter-concat \
        embulk-filter-column \
        embulk-filter-eval \
        embulk-filter-timestamp_format
    

    Config 만들기



    config.yml
    in:
      type: s3
      bucket: [バケット名]
      path_prefix: [CloudFrontで設定したプレフィックス][ディストリビューションID].2019-08-29-09  # 適宜変更すること
      decoders:
      - {type: gzip}
      endpoint: s3-ap-northeast-1.amazonaws.com
      auth_method: profile  # ほかにも認証方法はあるので embulk-input-s3 のドキュメントを参照
      profile_name: [AWSのプロファイル名]
      parser:
        charset: UTF-8
        type: csv
        delimiter: "\t"
        quote: '"'
        escape: null
        skip_header_lines: 2
        columns:
        - {name: date, type: string}
        - {name: time, type: string}
        - {name: edge_location, type: string}
        - {name: sc_bytes, type: long}
        - {name: c_ip, type: string}
        - {name: cs_method, type: string}
        - {name: cs_host, type: string}
        - {name: cs_uri_stem, type: string}
        - {name: c_status, type: string}
        - {name: cs_referer, type: string}
        - {name: cs_user_agent, type: string}
        - {name: cs_uri_query, type: string}
        - {name: cs_cookie, type: string}
        - {name: edge_result_type, type: string}
        - {name: edge_result_id, type: string}
        - {name: host_header, type: string}
        - {name: cs_protocol, type: string}
        - {name: cs_bytes, type: long}
        - {name: time_taken, type: double}
        # 以降のカラムは不要だったので書いてない
        allow_extra_columns: true
    
    filters:
      - type: concat  # date と time が別のカラムになってるので繋げてから
        name: datetime
        columns:
        - {name: date}
        - {name: time}
      - type: timestamp_format  # string -> timestamp に変換
        columns:
        - {name: datetime, type: timestamp, from_format: ["%Y-%m-%d %H:%M:%S"]}
        timestamp_parser: auto_java
      - type: eval
        eval_columns:
          - cs_user_agent: value.gsub("%2520", " ")  # UserAgentのスペースが %2520 として記録されているため
      - type: column
        columns:
        - {name: datetime}
        - {name: sc_bytes}
        - {name: c_ip}
        - {name: cs_method}
        - {name: cs_uri_stem}
        - {name: c_status}
        - {name: cs_user_agent}
        - {name: edge_result_type, type: string}
        - {name: host_header, type: string}
        - {name: cs_protocol, type: string}
        - {name: cs_bytes, type: long}
        - {name: time_taken, type: double}
    
    out:
      type: bigquery
      auth_method: authorized_user
      json_keyfile: [キーファイルのパス]
      project: [GCPのプロジェクト名]
      dataset: [BigQuery上のデータセット名]
      auto_create_table: true
      table: [テーブル名]
      mode: append
      formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
      path_prefix: /tmp/cloudfront-logs/
      file_ext: .csv.gz
      encoders:
      - {type: gzip}
      source_format: CSV
    

    Embulk에서 로그를 BigQuery에 입력


    % java -jar embulk-latest.jar run config.yml
    

    BigQuery에 이런 식으로 데이터가 들어 있으면 OK

    좋은 웹페이지 즐겨찾기