S3に出力された CloudFront/ELB/ALB/S3 アクセスログを特に加工せずにRDS PostgreSQLへインポート。。。したかったのですができませんでした。 (極力簡単にインポートし、整形・集計はDB側に任せようと思いました。)
PostgreSQL ベースである Redshift と RDS(PostgreSQL) の違いを確認しました。
- 使用したテーブル、ログ形式等は下記参照
\copy コマンドでインポート
\copy コマンドを使用して PostgreSQL DB インスタンス上のテーブルにデータをインポートする
ローカルの実行環境にtsvファイル(未圧縮・要変換)を置いた状態で、psqlから “\copy” を実行します。
# CloudFront \copy cf_log FROM '〜.tsv' # ELB \copy elb_log FROM '〜.tsv' # ALB \copy alb_log FROM '〜.tsv' # S3 \copy s3_log FROM '〜.tsv' # シェル上から実行する場合 psql -h-p -U -d -c "\copy ..."
Redshift での \copy
syntax errorとなり実行できませんでした。
# \copy cf_log from '〜.tsv' ERROR: syntax error at or near "STDIN" 行 1: COPY cf_log FROM STDIN
Redshift で S3以外からの COPY
マニフェストファイル作成等の事前準備をした上で、S3以外のファイルを対象に COPY が行えるようです。
COPYコマンド
COPYコマンドでS3からのインポートは不可です。そもそもCOPYコマンド自体実行できません。 (\copy を使いなさいとヒントをくれます)
ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
COPYはサーバ側、\copyはクライアント側依存になるので RDS では使えないということですね。
Redshift の COPY コマンドはAWS向けに拡張されていますが、RDSでも同様に使えるようになると混乱せずに済むのかなと思いました。