Amazon Athenaのクエリ結果バケットには不完全なMPUを削除するライフサイクルルールを設定しよう

Amazon Athenaのクエリをキャンセルするとクエリ結果バケットに不完全なマルチパートアップロードが残る可能性があります。ライフサイクルルールを設定してコスト増加を抑えましょう。
2022.09.08

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

こんにちは。サービス部の武田です。

先日S3 Storage Lensを見ていたら 未完了のMPUバイト数 という項目が伸びていることに気が付きました。

この項目はそのままの意味で、バケットに未完了のマルチパートアップロードが残っていると伸びていきます。基本的にはそのまま放置するのはコストでしかないため、削除するのが望ましいです。

ところでどのバケットだったのかというと、 Amazon Athenaのクエリ結果を出力する バケットでした。はて、なぜだろう?と調べているとドキュメントに次の記載を発見しました。

キャンセルされた、または失敗したクエリの場合、Athena が既に部分的な結果を Amazon S3 に書き込んでいる可能性があります。このような場合、Athena は結果が保存されている Amazon S3 プレフィックスから部分的な結果を削除しません。部分的な結果がある Amazon S3 プレフィックスを削除する必要があります。Athena は、Amazon S3 マルチパートアップロードを使用して Amazon S3 データを書き込みます。クエリが失敗した場合にはマルチパートアップロードを中止するように、バケットライフサイクルポリシーを設定することが推奨されます。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「マルチパートアップロードを使用したオブジェクトのアップロードとコピー」を参照してください。 引用元:データ使用量の制御制限の設定

Athenaのクエリをキャンセルすると残ってしまう可能性があるんですね。そんなわけでバケットに次のような、7日後に不完全なMPUを停止および削除するルールを設定しました(既存のルールがある場合はマージします)。これでしばらく待っていれば自動的に削除されるはずです。

{
    "Rules": [
        {
            "ID": "Abort-Incomplete-Multipart-Upload-7days",
            "Status": "Enabled",
            "Filter": {},
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation": 7
            }
        }
    ]
}

まとめ

Athenaのクエリをキャンセルすると不完全なMPUが残る仕様は知りませんでした。実は不完全なMPUを削除するルールは すべてのバケットに設定する のがAWSの推奨事項だったりします。そのためベストプラクティにのっとって運用している方は、すでに設定済みで恩恵を受けている可能性が高いです。みなさんもぜひ設定を見直してみてください。