BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】S3のcsvファイルをRDSにインポートする手順

コンニチハ、BFT名古屋支店のヤタテです。
今回は、業務でよく使いそうなS3に置いたcsvファイルをRDSにインポートする手順を説明したいと思います。
他システムからS3にファイルが連携されて、それをDBに取り込むといった要件が良くあるかと思いますので
参考になれば幸いです。

はじめに

Amazon S3に配置されているcsvファイルをAmazon RDS(PostgreSQL)にインポートした手順を紹介する。

前提条件

注意事項

  • csvファイル内のデータをインポート(追加)するだけであり、テーブルにあるデータの上書きや削除はできない

手順概要

  1. RDS向けデータインポート用IAMロール作成
  2. RDSインスタンスにIAMロールをアタッチ
  3. S3連携の拡張機能を有効化
  4. S3からRDSへデータインポートを実施

1. RDS向けデータインポート用IAMロール作成

以下の条件でIAMロールを作成する。

  • ユースケースの選択:RDS - Add Role to Database
  • 割り当てポリシー:csv配置先のS3バケット読み取り権限
            →今回はAmazonS3ReadOnlyAccessを選択

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エンジンでも可能なようなので、機会があれば実施してみたい。