[小ネタ] S3 Batch Operations で失敗したオブジェクトを確認したい

2020.12.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

S3 Batch Operations の Completion Report

S3 Batch Operations では処理結果を Report として Export することができます。これによってどの Object の処理の結果を Report として受け取ることができ、正常に処理が完了したかのチェックを行うことが可能です。

S3 Batch Operations - 例: S3 バッチオペレーション 完了レポートのリクエスト

処理に失敗したオブジェクトのみを Report 出力することが可能です。この結果リストを持って処理のリトライを行うことができます。

クロスアカウントコピーによる処理失敗時の Completion Report

前回紹介したような AWS アカウント間でオブジェクトのコピーを実施するような場合、Report 出力から処理開始までの時間経過によってオブジェクトの状況が変わっている可能性があります。

コピー元からオブジェクトが削除されている場合、通常 404 Not Found が返ってきそうなものですが、コピー先からクロスアカウントでの Batch Operations を実施した場合、失敗したものについては 403 Access Denied が記録されるようです。

dummy-test-bucket,test/218ee75c-66e4-4e21-ad99-f4fb05abe039,,failed,403,AccessDenied,Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXXXX; S3 Extended Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx=; Proxy: null)
...

そのため、エラーとなったオブジェクトが本当に存在しないのか、それとも権限エラーで本当にアクセスできないのかをチェックする必要があります。

 ## 単純な確認方法

失敗した処理が大した量ないのであれば、コードを書かずにさっと処理したいところです。今回の転送では1500万件に大して1200件弱のエラーが Report されていました。

これくらいの件数ならば bash でいけるかと思ったので以下のようにしてみました。

$ cat 7202f9bebf2d50c10529e9cc2d111f68d1XXXXXX.csv | awk -F, '{printf "s3://%s/%s\n", $1,$2}' | xargs -L 1 -I {} aws s3 ls {} --profile <SOURCE_ACCOUNT_YOUR_PROFILE>

とりあえず、えいやで書けて期待した結果が出てしまったのですが、もっと良い方法がある場合は教えていただけると幸いです。

一応パイプでつないだコマンドの解説など。

awk -F, '{printf "s3://%s/%s\n", $1,$2}'

csv 形式なのでデリミタは , です。さらに Bucket Name と Key を組み合わせて S3 URI に整形します。

Man page of GAWK

s3api を利用したい場合は、S3 URI の形式ではなく --bucket BUCKE_NAME --key KEY_VALUE という指定になるため少々加工が必要です。

xargs -L 1 -I {} aws s3 ls {} --profile

csvからS3 URIの形式にしたリストを一行ずつ分解し、仮引数 {} にパラメータを埋め込みます。それを aws s3 ls コマンドの対象に指定。SOURCE_ACCOUNT_YOUR_PROFILE にはコピー元のアカウントで S3 の Role を付与したプロファイルを指定してください。

ファイルが存在しなければ何も表示されず、ファイルが存在する場合はファイルの情報が出力されます。これで一応チェックができそう。

まとめ

今回 Batch Operationsのコピーに失敗したものはなかったようで、 403 Access Denied で記録されていた1200件弱のデータはすべて出力なしという結果でした。 もし Batch Operations での取りこぼしが発生した場合は、オブジェクトの数にも依りますが、再度Batch Operations を施行するよりかは、簡単なプログラム等で個別に処理してあげたほうが良さそうです。

エラーによっては ACL の設定やオブジェクトのオーナー権限といったメタ情報を修正する必要がある場合もあります。都度オブジェクトを修正するのも良いですが、そのようなオブジェクトが生成される要因を解消してから再実施した方が良いかもしれません(ワンショットの作業ならばその場で修正でも良いでしょうが)

参照