コンニチハ、BFT名古屋支店のヤタテです。
今回は、業務でよく使いそうなS3に置いたcsvファイルをRDSにインポートする手順を説明したいと思います。
他システムからS3にファイルが連携されて、それをDBに取り込むといった要件が良くあるかと思いますので
参考になれば幸いです。
はじめに
Amazon S3に配置されているcsvファイルをAmazon RDS(PostgreSQL)にインポートした手順を紹介する。
前提条件
- AWS RDS for PostgreSQL v10.7 以上であること
- AWS RDSにテーブル(文字コード:UTF-8)が作成されていること
- AwS S3にcsvファイル(文字コード:UTF-8)が配置されていること
注意事項
- csvファイル内のデータをインポート(追加)するだけであり、テーブルにあるデータの上書きや削除はできない
手順概要
1. RDS向けデータインポート用IAMロール作成
以下の条件でIAMロールを作成する。
2. RDSインスタンスにIAMロールをアタッチ
2-1. AWS RDSを起動する。
2-2. 起動したAWS RDSの「接続とセキュリティ」の下部にある
「IAMロールの管理」にて以下の情報を追加設定する。
・ ロール:手順1で作成したIAMロール
・ 機能 :s3Import
3. S3連携の拡張機能を有効化
※本手順はPostgreSQLのスーパーユーザのみで実行可能である
3-1. AWS RDSに接続する
C:\>psql -h <AWS RDSのエンドポイント> -U <ユーザ名> <データベース名>
3-2. 拡張機能の状態確認
dbname=> select * FROM pg_available_extensions where name like 'aws%'; name | default_version | installed_version | comment -------------+-----------------+-------------------+--------------------------------------------- aws_s3 | 1.1 | | AWS S3 extension for importing data from S3 aws_commons | 1.1 | | Common data types across AWS services (2 rows)
3-3. 拡張機能を有効化
dbname=> CREATE EXTENSION aws_s3 CASCADE; NOTICE: installing required extension "aws_commons" CREATE EXTENSION
3-4. 有効後の状態を確認
dbname=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.1 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
4. S3からRDSへデータインポートを実施
※本手順はPostgreSQLのスーパーユーザのみで実行可能である
4-1. 文字コードの確認
以下のコマンドで、文字コードを確認する。
dbname=> \encoding SJIS
4-2. 文字コードの変更
文字コードがSJISでは、UTF-8のファイルをインポートできないので変更する必要がある。
dbname=> \encoding UTF8 dbname=> \encoding UTF8
4-3. 以下のコマンドを実行し、データをインポートする
dbname=> SELECT aws_s3.table_import_from_s3( '<スキーマ名.テーブル名>' '<インポート先カラム名>', //空白('')の場合は、テーブルのカラムと一致 '(format csv)', '<S3バケット名>', '<ファイルキー>', //プレフィックス有の場合は、prefix/filename.csv '<リージョン名>' );
4-4. 文字コードを戻す
UTF-8にした文字コードをSJISに戻さずに、テーブルを出力すると文字化けするため以下のコマンドを実行する。
dbname=> \encoding SJIS dbname=> \encoding SJIS
まとめ
AWS S3の保存さているcsvファイルをAwS RDSにインポートする手順を紹介した。他のDBエンジンでも可能なようなので、機会があれば実施してみたい。