【DynamoDB】S3からのインポートで発生する"Unable to map value based"の対処法
DynamoDBで「S3からのインポート」を行った際に、"Unable to map value based on the given schema. Remainder of the file will not be processed.”というエラーが発生したのですが、DynamoDB自体は作成されており、データもちゃんと入っている現象が起きました。
今回はエラーの詳細と解決方法ついて解説します。
結論
コンソール上でフォルダを作成すると、0バイトのファイルが生成されてしまうため、0バイトのファイルをaws cliで削除するか、手動ではなく直接S3にファイルを送る必要があります。
エラーの詳細
この挙動を確認するために、コンソール上でtestフォルダを作成し、sample_1.csvをアップロードしてみました。
画像の通り、testフォルダーの中にはsample_1.csvしか存在しないことがわかると思います。
ここで、aws s3 ls s3://{バケット名}/test/
でs3の中身を確認します。すると、コンソール上ではsample_1.csvしかありませんが、0バイトのファイルも存在しています。
2024-01-26 01:51:05 0
2024-01-26 01:51:41 74 sample_1.csv
S3からDynamoDBにインポートするとき、インポートするファイルのフォーマットを指定すると思うのですが、この0バイトのファイルはそれらのフォーマットに当たらないため、"Unable to map value based on the given schema. Remainder of the file will not be processed.”が発生しています。
なぜ0バイトのファイルが生成されるのか
ドキュメントを漁っていたら、ちゃんと理由が記載されていました。[1]
Amazon S3 にフォルダを作成すると、S3 は、指定したフォルダ名に設定されたキーを持つ 0 バイトのオブジェクトを作成します。例えば、バケットに photos という名前のフォルダを作成した場合、Amazon S3 コンソールは photos/ キーを使用して 0 バイトのオブジェクトを作成します。コンソールは、フォルダの考え方をサポートするために、このオブジェクトを作成します。
Amazon S3 コンソールでは、キー名の最後 (末尾) の文字がスラッシュ (/) になっているすべてのオブジェクト (examplekeyname/ など) がフォルダとして扱われます。キー名の末尾の文字が / のオブジェクトは、Amazon S3 コンソールを使用してアップロードすることができません。ただし、Amazon S3 API で名前の末尾が / のオブジェクトは、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用してアップロードできます。
名前の末尾が / のオブジェクトは、Amazon S3 コンソールではフォルダとして扱われます。Amazon S3 コンソールには、このようなオブジェクトのコンテンツやメタデータが表示されません。コンソールを使用して名前の末尾が / のオブジェクトをコピーすると、コピー先の場所に新しいフォルダが作成されますが、オブジェクトのデータとメタデータはコピーされません。
元々、S3にはフォルダという概念は存在せず、オブジェクト名に/
をつけることで、フォルダのような階層構造を実現しています。
なので、コンソール上でtestフォルダを作成したときに、0バイトのオブジェクト(test/)を生成するということです。
まとめ
「S3からのインポート」を行った際に発生する"Unable to map value based on the given schema. Remainder of the file will not be processed.”は、コンソール上にて手動でフォルダーを作成したときに発生する0バイトのファイルが原因でした。
Discussion