はじめに
Aurora PostgreSQLはS3と連携できる機能がある。
これを使えば、通常はアプリ側でS3からダウンロードして取り込むような処理を、
アプリを介さずにS3 → PostgreSQLへ直接インポートすることが可能となる。
よって以下のメリットがあると考える。
- アプリ側でファイルを扱う必要がない
- アプリ側のディスク容量を気にしなくていい
- 実装がシンプルになる
今回の記事ではこの機能を用いて、通常のインポート方法と比較してみたいと思う。
※機能の詳細についてはこちらを見ていただければと。
検証環境
- AWS 東京リージョン
- Aurora PostgreSQL17.4 (スペック:db.t3.medium)
- large_test_data.csv (1000万行のテストデータ)
- test_table (データ格納用テーブル)
S3のファイルをインポート
-
まずはS3連携するための拡張機能をインストールする
CREATE EXTENSION IF NOT EXISTS aws_s3 CASCADE; -
S3上のファイルをインポートする
postgres=> SELECT aws_s3.table_import_from_s3( 'test_table', '', '(format csv, header true)', '<S3バケット名>', 'large_test_data.csv', 'ap-northeast-1', '<Auroraに紐づけたIAMロール名>' ); table_import_from_s3 ------------------------------------------------------------------------------------------------------ 10000000 rows imported into relation "test_table" from file large_test_data.csv of 208888910 bytes (1 row) Time: 11639.759 ms (00:11.640) postgres=>
通常の方法(アプリを介してインポート)の場合
- まずはS3のファイルをダウンロードする
~ $ time aws s3 cp s3://<S3バケット名>/large_test_data.csv ./ download: s3://<S3バケット名>/large_test_data.csv to ./large_test_data.csv real 0m2.301s - COPYコマンドを使って、インポートする
postgres=> \COPY test_table (id, name, age) FROM 'large_test_data.csv' WITH (FORMAT csv, HEADER true); COPY 10000000 Time: 11416.487 ms (00:11.416) postgres=>
まとめ
結果としては以下となった。
| 方法 | 処理時間 |
|---|---|
| S3連携 | 11.6秒 |
| アプリ経由 | 13.7秒 (ダウンロード:2.3秒、COPYコマンド:11.4秒) |
処理時間としては、S3連携のほうがわずかに早いという結果になった。
あまり大きな差が出なかったが、アプリを介さずに済むというのが最大の利点だと思う。
今回はインポートを試したが、もちろんエクスポートもできる。
また、AuroraからLambdaを呼び出す、なんてこともできるようだ。
あまり現場で使われていない(知られていない?)機能だが、
メリットが多々あるので、積極的に活用していきたい