S3のファイルをDynamoDBにインポートできるようになったので、CSVファイルからテーブルを作成してみた
こんにちは。システム開発部のkiwiです。
AWSでサーバーレスのシステムを構築する際にデータベースとして採用されることが多いDynamoDBですが、データを一括で投入する場合、これまでは自分で投入処理を作成する必要がありました。先日のアップデートにて、S3に置かれているファイルをDynamoDBの新規テーブルに一括インポートする機能が提供されました!
この記事では、S3に置かれているCSVファイルをDynamoDBに取り込んでみたいと思います。
目次
S3からDynamoDBへのインポート機能について
現時点でインポートに対応しているのは以下の3つのファイル形式です。
- CSV
- DynamoDB JSON
- Amazon Ion
インポート元となるファイルはS3のprefixで指定しますので、共通のprefixを持つ複数のファイルを一気にインポートすることも可能です。バケットの読み込み権限を設定すれば、別のアカウントのS3バケットからインポートすることもできます。
また、GZIP圧縮やZSTD圧縮されている場合もインポートが可能です。ただし、インポートにかかるコストは「未圧縮のファイルの容量」に応じて料金がかかります。圧縮後のファイル容量に応じた料金がかかるAthena等とは異なるので注意が必要です。
インポート先は新しく作成するテーブルに限られます。既存のDynamoDBテーブルに追加したり、置き換えたりすることはできません。テーブル名やキー、キャパシティー、グローバルセカンダリインデックスについてはインポート実施時に指定します。
CSVファイルをインポートしてみる
今回は市区町村の一覧データをDynamoDBに取り込んでみます。このCSVは以下のように、1行目に項目名が、2行目から実際のデータが格納されています(以下の例では一部項目を割愛しています)。
"id","name","pref_id",...
"01100","札幌市","01",...
実際にDynamoDBのマネジメントコンソールからインポートを実行してみます。新しく増えている「S3からのインポート」を選択します。

まずはインポート元となるS3のURLやファイル形式を設定します。今回はCSVファイル1つだけなので、直接ファイルを指定しています。
CSV形式の場合、ヘッダーと区切り文字を選択することができます。データのみが格納されたCSVの場合は「ヘッダーを定義する」を選択することで、各列に対応するカラム名を指定することが可能です。

インポート元の設定が終わったら、今度はインポート先のテーブルの設定をします。テーブル名やキー、そのほか細かい設定ができます。今回は検証ということでキャパシティユニットを最低値に変更し、それ以外はデフォルトのままとしました。

最後に、設定した内容を確認し、「インポート」を実行します。

しばらくすると、インポート一覧が完了表示に切り替わります。

今回使用したCSVはサイズが約170KBありましたが、3分ほどでインポートが完了しました。ブログには「ファイルの大きさやキーの偏りによって数分〜数時間かかる」との記載があるため、この機能を何かのワークフローに組み込む場合には、ステータスが完了となるまで待機する必要がありそうです(describe-import コマンドでステータスを取得できます)。
実際に作成されたテーブルを見てみます。以下の通り、正しくCSVの情報がインポートされています。CSVでは各カラムがダブルクオートで括られていましたが、問題なくインポートされていますね。

一部のデータにエラー(パーティションキーが存在しない、など)がある場合、CloudWatch Logsに最大10000件まで出力されます。今回はすべてのレコードが問題なく取り込まれていたため、何も出力されていませんでした。
まとめ
S3に配置されているファイルから、簡単にDynamoDBテーブルを作成することができるようになりました。キャパシティユニットを消費しない、グローバルセカンダリインデックスも同時に生成できるなど、従来スクリプトなどで行っていたインポート処理よりも効率よく実行できます。
既存テーブルへのインポートはできないため、ここで生成したテーブルをAPIなどに組み込む際には、日付を付与するなど規則的なテーブル名にしたり、CloudFormationスタックにテーブルをインポートするなどの工夫が必要そうです。
この記事ではCSVからテーブルを生成していますが、別のシステムからDynamoDBへデータをマイグレーションする際や、テスト用のテーブルの生成、エクスポートしたデータを別のリージョンやアカウントで復元するなど、さまざまな用途で便利に活用できそうです。
なお、AWSのブログ記事ではこの機能の主なユースケースの1つである「DynamoDBのエクスポート機能を使って出力したJSONを別のテーブルにインポートする」手順が記載されていますので、あわせてご覧ください。
掲載内容は、記事執筆時点の情報をもとにしています。