マニュフェストファイルを作成するのにもめちゃくちゃ時間がかかったのに、このエラーが出たときゾッとしたよね……。
エラーの内容
S3 batch job error Task target couldn't be URL decoded
というエラーは、簡単に言うと「マニュフェストファイルを解析できないよ」ってエラー。
例えば、空白や記号、日本語がファイル名に含まれている時に起こり、これらをURLエンコードしなければならなかったっぽい。
ここまで気が回っていなかったので反省……という感じ。
ざっとエラー発生時までの経緯をば。
エラー発生時の状況
会社の業務でS3 Deep Archieveに保存されているバックアップデータをS3バッチオペレーションを実行してS3 Standardへ取り出そうとしたときに発生したエラー。
エラー発生までにしていたこと
iret.media様の記事で同じことをしていたため、これを参考にバッチオペレーションの実行まで行った。
ジョブの実行がすぐに失敗してタイトルにあるようなエラーが出た。
ただ、ここでもハマったポイントがあるので別記事でまとめようと思う。
ハマったこと以外は記事に忠実に作業した。
やったこと
S3 batch job error Task target couldn't be URL decoded
で検索をかけると、同じ話題を扱っているAWS re:Postの記事を見つけた。
S3 batch job error Task target couldn't be URL decoded
記事の中で
When using Python, you can use the "urllib.parse" library to easily URL-encode the manifest file. For more information about this library, please refer to the following link: https://docs.python.org/3/library/urllib.parse.html
「Python使ってるなら、 urllib.parse
ってライブラリを使うと簡単にURLエンコードできるで!」って書いてあったのでその通りにした。
作成したスクリプト
ChatGPTの力を借りながら、下記のようなスクリプトを作成した。
import csv import urllib.parse manifest_file = '../path/to/manifest.csv' encoded_manifest_file = 'encoded_manifest.csv' # ファイルを開いてURLエンコード処理を行う with open(manifest_file, 'r', encoding='utf-8') as infile, open(encoded_manifest_file, 'w', newline='', encoding='utf-8') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) for row in reader: bucket_name = row[0] object_key = row[1] encoded_key = urllib.parse.quote(object_key, safe='/') writer.writerow([bucket_name, encoded_key]) print(f"Encoded manifest saved to {encoded_manifest_file}")
マニュフェストファイルは、 backet_name, oject_full_path
みたいになっているので、オブジェクト側をURLエンコードしてマニュフェストファイルの形式にしてやるようにした。
このスクリプトを実行して、S3にマニュフェストファイルをアップロードして、再度ジョブを作成し、実行すると問題なく実行された。
いやーーーあせった。まじで帰れへんかと思った。
文字コードとはエンコードに呪われている気がする今年。何回目やねん。
参照ドキュメント
- iret.media「Amazon S3 Glacier Deep Archiveからデータを取り出す方法(復元・ダウンロード)」
- https://iret.media/115236
- まーーーじで神。ありがとうございます……!
- https://iret.media/115236
- AWS re:Post「S3 batch job error Task target couldn't be URL decoded」
- Pythonドキュメント「rllib.parse — Parse URLs into components」