クラスメソッドメンバーズ提供のCURを日付指定で見るコツ

クラスメソッドメンバーズへ加入されたお客様向けに提供しているCURを特定日付指定で確認したい場合の方法についてまとめました。
2020.10.21

はじめに

弊社サービスのクラスメソッドメンバーズでは、AWSが提供しているCost and Usage Report(CUR)とは別に、加入されているお客様向けへAWSで利用されたサービスの利用量とコストについての時間単位での明細が記載されたCURをCSVとして独自提供しています。これはメンバーズポータル上でのご利用料金表示に沿ったものとなっています。

社内においても動作確認用に出力していますが、後からX日に出力されたレポートを見たいとなった時に案外手が止まったりします。各日出力の区切りがランダムな文字列となっているためです。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/
                           PRE XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/
                           PRE 12345678-1234-1234-1234-123456789012/
                           PRE 87654321-4321-4321-4321-210987654321/
2020-10-21 07:25:46      25264 cur_hourly-Manifest.json

シェル芸になりますが、とりあえず迷わなくてすむ手段を整えてみました。

最新の出力を見る

cur_hourly-Manifest.jsonを見てみましょう。この中に含まれるassemblyIdに指定されるランダム文字列が最新のパスとなります。

% aws s3 cp s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/cur_hourly-Manifest.json - | grep assemblyId
"assemblyId" : "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",

当月の出力を日付順に見る

CURの出力バケットに対してaws s3 lsを実行すると以下のような感じになるかと思われます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/
                           PRE XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/
                           PRE 12345678-1234-1234-1234-123456789012/
                           PRE 87654321-4321-4321-4321-210987654321/
2020-10-21 07:25:46      25264 cur_hourly-Manifest.json

このオプション機能を担当している私自身、これだけ見ても何時の日付のものかはわかりません。もしこれをみてひと目で「これはXX日のやつだ」と判断がつく方は暗記してしまうくらいにバケット内を見ている可能性があります。

あまり労しない、現実的な方法を検討してみましょう。Prefixのパスには日付が出ませんが、recursiveオプションを用いることでオブジェクトまでのパスを取り、そこから日付を取る事ができます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \
    --recursive
2020-10-04 06:07:10     717126 CUR/Hourly/cur_hourly/20201001-20201101/XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/cur_hourly-1.csv.gz
2020-10-04 06:07:10      25006 CUR/Hourly/cur_hourly/20201001-20201101/XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/cur_hourly-Manifest.json
2020-10-04 18:10:16     826259 CUR/Hourly/cur_hourly/20201001-20201101/12345678-1234-1234-1234-123456789012/cur_hourly-1.csv.gz
2020-10-04 18:10:17      25006 CUR/Hourly/cur_hourly/20201001-20201101/12345678-1234-1234-1234-123456789012/cur_hourly-Manifest.json
2020-10-07 06:12:29    1713116 CUR/Hourly/cur_hourly/20201001-20201101/87654321-4321-4321-4321-210987654321/cur_hourly-1.csv.gz
2020-10-07 06:12:29      25006 CUR/Hourly/cur_hourly/20201001-20201101/87654321-4321-4321-4321-210987654321/cur_hourly-Manifest.json
…

出力されたパスには問題のPrefixが含まれており、且つ一番左側にはオブジェクトの更新日付がでています。ポイントは、時分秒はさておきとしてPrefixが同じ場合は更新日付もまた同じところです。これを利用してみます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \
    --recursive | 
    sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | 
    sed 's|/cur_hourly.*||'
2020-10-04 06:07:10     717126 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 06:07:10      25006 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 18:10:16     826259 12345678-1234-1234-1234-123456789012
2020-10-04 18:10:17      25006 12345678-1234-1234-1234-123456789012
2020-10-07 06:12:29    1713116 87654321-4321-4321-4321-210987654321
2020-10-07 06:12:29      25006 87654321-4321-4321-4321-210987654321

不要なprefixとオブジェクト名を削りました。時分秒とサイズもいらないので削ります。最新のCURに関する情報が含まれるcur_hourly-Manifest.jsonについても、今回は不要なため削ってしまいます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \
    --recursive | 
    sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | 
    sed 's|/cur_hourly.*||' | 
    grep -v cur_hourly-Manifest.json | 
    awk '{print $1, $4}'
2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 12345678-1234-1234-1234-123456789012
2020-10-04 12345678-1234-1234-1234-123456789012
2020-10-07 87654321-4321-4321-4321-210987654321
2020-10-07 87654321-4321-4321-4321-210987654321

重複して出力されていますが、これはcur_hourly-1.csv.gzcur_hourly-Manifest.jsonがそれぞれに出力されているためです。考慮する必要はないため重複を省いてしまいます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \
    --recursive | 
    sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | 
    sed 's|/cur_hourly.*||' | 
    grep -v cur_hourly-Manifest.json | 
    awk '{print $1, $4}' | 
    uniq
2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 12345678-1234-1234-1234-123456789012
2020-10-07 87654321-4321-4321-4321-210987654321

日付順で出したいため、sortも加えておきます。

% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \
    --recursive | 
    sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | 
    sed 's|/cur_hourly.*||' | 
    grep -v cur_hourly-Manifest.json | 
    awk '{print $1, $4}' | 
    uniq | 
    sort
2020-10-01 XXXXXXXX-YYYY-DDDD-MMMM-ABCDEFGHIJKL
2020-10-01 XXXXXXXX-YYYY-DDDD-MMMM-ABABABABABAB
2020-10-02 XXXXXXXX-DDDD-DDDD-MMMM-AAAAAAAAAAAA
2020-10-02 XXXXXXXX-AAAA-DDDD-MMMM-AAAAAAAAAAAA
2020-10-03 DDDDDDDD-AAAA-DDDD-MMMM-AAAAAAAAAAAA
2020-10-03 AAAAAAAA-AAAA-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA
2020-10-04 12345678-1234-1234-1234-123456789012

おおむね1日2回程度の出力になっているため、一致する形となりました。必要に応じてS3のフルパスを生成して追加すると便利かもしれません。

あとがき

Prefixは仕組み上日付を確認ができませんが、メンバーズサービスのCURに関しては出力仕様の関係で年月日で絞ることが可能です。

特定日付のCURについて調べたい場合に、該当パスを絞り込むための参考になると幸いです。