Amazon S3 の 1 つのバケットから別のバケットにファイルを移動し、移動されたキーの内容を確認する 2 つの Python スクリプトを作成しています。boto の Key クラスに注いだ後、このスタックオーバーフローの質問を調べたところ、ファイルがコピーされた後に「etag」を介してチェックサムを取得する方法がわかりました。
ただし、これはファイルがダウンロード/アップロードされた場合にのみ機能します。検証はまったく別のスクリプトによって行われるため、実際にダウンロードせずにファイルから etag を取得する必要があります。
現在のワークフローは次のとおりです。ファイル 1 はバケットを通過し、boto を使用してすべてのキーをコピーします。次に、出力キーのパスとそれに続く etag を出力します。(buckets[] は送信元と送信先です) これはうまくいきます:
inbuck = conn.get_bucket(buckets[0])
outbuck = conn.get_bucket(buckets[1])
for inkey in inbuck.list():
print buckets[1] + ";;" + inkey.key + ";;" + inkey.etag.replace("\"","")
out = Key(outbuck)
out.key = inkey.key
inkey.copy(outbuck,out.key,preserve_acl=True)
次に、ファイル 2 はファイル 1 から出力を読み取り、キーが存在することを確認し、宛先でキーの etag を取得して、入力として取得したものと比較する必要があります。ただし、キーはダウンロードされていないため、キーの etag は常に None です。
dstbuck = conn.get_bucket(destination[0])
dstkey = Key(dstbuck)
dstkey.key = destination[1]
if dstkey.exists() and dstkey.etag.replace("\"","") == destination[2]:
PASSED.append(dstkey.key)
else:
FAILED.append(dstkey.key)
ここでは、dstkey.etag が「None」であるため、プログラムがクラッシュします。誰もこれを回避する方法を知っていますか?