【新機能】Amazon AuroraにS3からの直接データロード機能が追加。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はAuroraの新機能であるデータロード機能をご紹介したいと思います。

AuroraがINSERT SQLいらずに

今回Auroraに追加された機能、それはS3から直接Auroraのテーブルにデータをロードすることが出来る機能です!Auroraにてデータをテーブルに入れる時は作業用のEC2やLambdaに対してS3からデータを持ってきてSQLでINSERT文を書かなくてはいけなかったわけですが、今回のこの新機能によりINSERT SQLを書かなくても直接データをテーブルに入れることが出来るようになりました。元々AuroraのベースはmySqlになりますので、mySqlで使うLOAD DATA / LOAD XMLコマンドが直接S3と結びついたわけですね。

S3にはイベントドリブン機能もありますのでうまく組み合わせればS3にアップロードしたデータが自動的にAuroraに格納されていく、というソリューションが可能になりそうですね。

できること

今回のS3からのアップロードは通常のテキストファイルとXMLファイルがアップ可能です。テキストはプレフィックスが指定できるのでCSV形式のファイルなどがAuroraにLOADできます。ただし圧縮ファイルには対応していません。また行数も指定できるので1行目は見出し行なので無視する、というような書き方も可能です。

XMLファイルの場合は

<row column1="value1" column2="value2" .../>
<row>
  <column1>value1</column1>
  <column2>value2</column2>
</row>
<row>
  <field name='column1'>value1</field>
  <field name='column2'>value2</field>
</row>

の形式が可能です。

また軽い計算や予約語にも対応しているので「column2に入れるのは1つめの値を1/100したもの、column3には現在日時を入れる」、というような指定もできます。

注意事項

AuroraのあるサブネットからS3にアクセスできるようにルートを整えること

S3から直接AuroraにデータをアップロードするにはAuroraの所属しているサブネットからS3にアクセス出来る必要があるようです。つまりRDSを立てる時にPublicly AccessibleをYesにするか、VPC Endpointを立ててVPC内からS3へアクセスできるようにしておくかのどちらかの処理が必要になりますのでご注意下さい。

IAMの他にAuroraとしてのアクセス設定が必要

AuroraからS3にアクセスするには上記のルートの整備の他にIAM RoleにてRDSからS3を操作(GetObject, GetObjectVersion, ListBucket)できる権限が必要です。そしてここから忘れがちなのですがAuroraのクラスタそのものにもS3のアクセス設定として作ったIAM Roleを関連付ける必要があります。これはAuroraのクラスタ管理画面にてIAM Roleとの関連付けを行い、更にS3への操作に対してどのIAM権限を使うか、というのをパラメータグループを使って紐付けます。

まずRDSのクラスタ画面より「IAMロールの管理」をクリックします。

aurora_s32

出てきた管理画面に上で作ったIAM Roleを指定します。

aurora_s33

これで関連付けはOKです。次にAurora5.6のパラメータグループを新規作成し

aurora_s31

Auroraのパラメータグループに「aws_default_s3_role」という項目があるので、そこに上で作ったIAM Roleを指定すればOKです。

やってみた

構築

それではやってみましょう。まず同じVPCに操作用のEC2とAuroraを立てます。

aurora_s34

次にS3のバケットを作成しておきます。テスト用にXMLファイルをひとつ置いておきます。

aurora_s35

<row>
  <col1>value1</col1>
  <col2>value2</col2>
</row>

今回はPublicly AccessibleをNoにしているので、VPCエンドポイントを作成してS3からのアクセスを確保します。

aurora_s36

最後に上記の注意事項を元にIAM Roleを作成して作ったAuroraに紐付けます。

これで準備はOKです。

テスト

では流してみます。EC2にSSHでログインし、mysqlをyum installで入れた後、mysqlにログインします。

mysql -h test.cluster-cdy2hmdijrau.ap-northeast-1.rds.amazonaws.com -P 3306 -u test -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

columnが2つあるテーブルを作成します。

mysql> create table test.test(col1 varchar(10), col2 varchar(10));
Query OK, 0 rows affected (0.03 sec)

mysql>

S3からデータをロードします。

mysql> load xml from s3 's3://test-s3-to-aurora/test.xml' into table test;
Query OK, 1 row affected (0.13 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

mysql>

データを確認します。

mysql> select * from test;
+--------+--------+
| col1   | col2   |
+--------+--------+
| value1 | value2 |
+--------+--------+
1 row in set (0.00 sec)

はいってますね。成功です。

まとめ

いかがでしたでしょうか。S3とDBが直結できるようになると手間が色々はぶけて非常に便利になりますね。皆様も是非使ってみて下さい。

参考リンク