はじめに
こんにちは、クラウド事業部の志摩です。
DynamoDBにデータを投入する場合、複数の方法があると思いますが、今の現場で仮にDynamoDBを活用するとなった場合、csvファイルを使う可能性が高い気がするので、csvファイルからテーブル作成する方法を試してみました。
下準備
DynamoDBからCSVエクスポート機能があるため、取り込むためのファイルを自ら生成し、それを別の新規テーブル用に読み込ませることで、機能を試してみようと思います。
ダウンロードしたCSVをS3へアップロード。
DynamoDBへインポートするS3バケットを指定。
新規テーブル作成。
インポート
いざ!
見事にエラー。(すこし変えて2回やったがだめ)
しかし、テーブルはできていた。(謎)
エラーのままのテーブルは使いたくないので、調査開始。 ひとまずCloudWatchLogsからエラーメッセージを確認する。
エラーメッセージでググったところ、早速同じ悩みの記事を発見。要約すると、
・S3はフォルダをネイティブにサポートしていないが、それを補うために、S3にフォルダを作成すると、0byteのオブジェクトとして作成される。
・S3へインポートする際、0byteのオブジェクトを読み込むことによって、エラーが出る。
と、ざっくりいうとそういうことらしい。
そういうことであれば、新規バケット作成し、読み込ませたいCSVのみを配置すればいけるのでは?!と思い、早速試してみる。まずは新規バケット作成。
新規バケットにファイルを単品で配置。
新規バケットを指定して、改めてアップロード。
成功!!
テーブルも問題なく作成されている。
まとめ
思わぬところでエラーを踏みましたが、S3の仕様など、学ぶところが多かったです。
ググっているうちに知ったことも含め、
・S3のフォルダの存在が、読み込みエラーの要因になることがある。
・S3からCSVをインポートする際、パーティションキーやソートキーは、指定したデータ型で取り込まれるが、それ以外は全て文字列型で取り込まれる。(ググって知りました)
を、今回学べました。
★参考★
DynamoDB の S3 インポート機能は CSV の場合だとすべて文字列型で取り込まれてしまう | DevelopersIO (classmethod.jp)
最後に
S3経由のCSVはお手軽にインポートできる分、S3におけるフォルダ関連エラーの可能性や、キー以外の型について指定したい場合はひと手間かかるということで、やはり用途に応じて、JSONの直接取り込みとの使い分けになっていくのかなと思います。
読んでいただき、誠にありがとうございました。