S3に出力されたCloudFrontアクセスログを特に加工せずにRedshiftへインポートします。 (極力簡単にインポートし、整形・集計はDB側に任せようと思いました。)
S3->RedshiftへCOPYコマンドで実現可能です。
ログ形式
CloudFront が Amazon S3 バケットに保存する各ログファイルの名前には、次のファイル名形式が使用されます。
bucket-name.s3.amazonaws.com/optional-prefix/distribution-ID.YYYY-MM-DD-HH.unique-ID.gz
圧縮(gzip)されたtsvファイルで、ヘッダが2行存在します。
- ヘッダ
#Version: 1.0 #Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version
テーブル作成
各カラムは記号と予約語回避のため _ を使用しています。
CREATE TABLE cf_log ( date_ VARCHAR(4096) ,time_ VARCHAR(4096) ,x_edge_location_ VARCHAR(4096) ,sc_bytes_ VARCHAR(4096) ,c_ip_ VARCHAR(4096) ,cs_method_ VARCHAR(4096) ,cs_Host_ VARCHAR(4096) ,cs_uri_stem_ VARCHAR(4096) ,sc_status_ VARCHAR(4096) ,cs_Referer_ VARCHAR(4096) ,cs_User_Agent_ VARCHAR(4096) ,cs_uri_query_ VARCHAR(4096) ,cs_Cookie_ VARCHAR(4096) ,x_edge_result_type_ VARCHAR(4096) ,x_edge_request_id_ VARCHAR(4096) ,x_host_header_ VARCHAR(4096) ,cs_protocol_ VARCHAR(4096) ,cs_bytes_ VARCHAR(4096) ,time_taken_ VARCHAR(4096) ,x_forwarded_for_ VARCHAR(4096) ,ssl_protocol_ VARCHAR(4096) ,ssl_cipher_ VARCHAR(4096) ,x_edge_response_result_type_ VARCHAR(4096) ,cs_protocol_version_ VARCHAR(4096) );
インポート(COPY)
gzip、TAB区切り、ヘッダ2行を指定して実行します。
COPY cf_log FROM 's3://bucket-name.s3.amazonaws.com/optional-prefix/distribution-ID.YYYY-MM-DD-HH.unique-ID.gz' CREDENTIALS 'aws-auth-args' DELIMITER '\t' GZIP IGNOREHEADER 2
‘aws-auth-args’ はIAMロールやアクセスキーを指定します。
ロールベースのアクセスコントロールを指定するには、次の形式で aws-auth-args 文字列を指定します。
‘aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>’
キーに基づくアクセスコントロールを指定するには、次の形式で aws-auth-args を指定します。
‘aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>’