2023.09.05
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
お久しぶりです。
JGです。
今回はPHPでAWS SDK for PHPを使用してS3を削除するバッチを作成したのですが、ListObjectsV2でたまにエラーが出たので、その原因と解決策を説明したいと思います。
原因
ListObjectsV2で出たエラーは下記となります。
Error parsing response for ListObjectsV2: AWS parsing error: Error parsing XML: String could not be parsed as XML
S3のデータがおかしくXMLとして解析できないため、エラーが出ているようです。
恐らくファイル名の拡張子が不適切なため起きてそうなので、該当のバケットのフォルダ配下にあるファイル名を確認する必要があると感じました。
S3のバケットは環境毎によって違うので、ローカル環境で一時的にバケットの向き先をエラーが出た環境に変更して詳細なエラーを取得できる気もしますが、今回はAWS CLIを使って取得することにしました。
AWS CLIのセットアップは割愛しますが、下記のコマンドを実行すれば バケットのフォルダ配下にあるファイル情報を取得できます。
aws s3 ls s3://{バケット名}/{パス} --recursive
上記のコマンドを実行したところ、幾つかのファイルで拡張子の後ろに&がついており、ファイルサイズも0でした。
該当のオブジェクト URLにアクセスしても正常に表示されなかったので、これが原因のようです。
解決策
今回の場合は 拡張子の後ろに&がついており、ファイルサイズが0のものを削除すれば解決しそうです。
AWS SDK for PHPのdeleteObjectsで削除する方法もありますが、今回はAWS CLIのrmコマンドで削除しました。
aws s3 rm s3://{バケット名}/{ファイルパス} // バケットのファイルを削除する場合
aws s3 rm s3://{バケット名}/{フォルダパス} --recursive // バケットのフォルダを削除する場合
最後に
まとめますとListObjectsV2でエラーが出た場合は、 AWS CLIのlsコマンドでファイルの拡張子がおかしいまたはサイズが0のものを探し、それらを AWS CLIのrmコマンドで削除すれば解決できます。
今回は以上になります。