🧨

【DynamoDB】S3からのインポートで発生する"Unable to map value based"の対処法

2024/01/28に公開

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バイトのファイルが原因でした。

参考

脚注
  1. https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-folders.html ↩︎

Discussion