S3 batch job error Task target couldn't be URL decoded が出たときの対処法 - Halcyon Days

Halcyon Days

IT × 移住 × ファイナンス

MENU

S3 batch job error Task target couldn't be URL decoded が出たときの対処法

マニュフェストファイルを作成するのにもめちゃくちゃ時間がかかったのに、このエラーが出たときゾッとしたよね……。

エラーの内容

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にマニュフェストファイルをアップロードして、再度ジョブを作成し、実行すると問題なく実行された。

いやーーーあせった。まじで帰れへんかと思った。

文字コードとはエンコードに呪われている気がする今年。何回目やねん。

参照ドキュメント