カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

S3インベントリでフォルダ単位のサイズを取得してみた

経緯

S3のストレージ費用を出す方法を調べていて、S3のインベントリを今まで使ったことなかったので、試しに使ってみました。


実施内容

  • インベントリ対象のS3フォルダを作成する。
  • インベントリ出力用のS3バケットを作成する。
  • インベントリを設定する。
  • 出力内容を確認する。

実施作業

インベントリ対象のS3フォルダを作成します。

今回は果物名のフォルダにしました。 f:id:live-your-life-dd18:20191029135812p:plain

各フォルダにはファイルを格納しておきます。

  • appleフォルダ f:id:live-your-life-dd18:20191029135851p:plain

  • bananaフォルダ f:id:live-your-life-dd18:20191029135912p:plain


    インベントリ出力用のS3バケットを作成します。

    インプットのフォルダ名単位で出力するので、こちらもそれに合わせました。 f:id:live-your-life-dd18:20191029140100p:plain


    インベントリを設定します。

    [バケット名]→[管理タブ]→[インベントリボタン]→[新規作成]の順で押下します。
    f:id:live-your-life-dd18:20191029140213p:plain

    appleのインベントリ名とアウトプット先を指定します。

    出力形式はparquetを指定します。
    f:id:live-your-life-dd18:20191029154809p:plain

    オプションで取得するデータを選択します。

    今回はデータサイズと最終更新日、あとはストレージクラスの3つです。特に暗号化はしません。
    f:id:live-your-life-dd18:20191029142107p:plain

    作成されると同時に出力側のS3バケットにポリシーが作成されます。

    f:id:live-your-life-dd18:20191029142259p:plain

    次に同じ要領でbananaのインベントリを作成していきます。

    f:id:live-your-life-dd18:20191029154849p:plain

    f:id:live-your-life-dd18:20191029142852p:plain

    インベントリは一度作成すると定期的に出力してくれるようになりますが、初回のみ最大で48時間待つ必要があります。
    f:id:live-your-life-dd18:20191029142931p:plain

  • ちなみに出力側のS3に設定されているバケットポリシーは以下です。
{
    "Version": "2012-10-17",
    "Id": "S3-Console-Auto-Gen-Policy-1572326515353",
    "Statement": [
        {
            "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1572326515353",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::output-test-inventory/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "************"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::input-test-inventory"
                }
            }
        }
    ]
}



出力内容を確認する。

まずはappleに出力されてることを確認します。 f:id:live-your-life-dd18:20191031132942p:plain

出力される各ファイルの構成はAWS公式ドキュメントに記載されています。
docs.aws.amazon.com

f:id:live-your-life-dd18:20191031133043p:plain

詳細なパラメータが設定されたデータファイルはdataフォルダに格納されています。
f:id:live-your-life-dd18:20191031133215p:plain

インベントリ情報を取得した日付フォルダ配下に作成されるmanifest.jsonファイルには、parquetファイルの情報が記載されており、ファイル内容は以下のようになっています。

{
    "sourceBucket": "input-test-inventory",
    "destinationBucket": "arn:aws:s3:::output-test-inventory",
    "version": "2016-11-30",
    "creationTimestamp": "1572321600000",
    "fileFormat": "Parquet",
    "fileSchema": "message s3.inventory {  required binary bucket (STRING);  required binary key (STRING);  optional int64 size;  optional int64 last_modified_date (TIMESTAMP(MILLIS,true));  optional binary storage_class (STRING);}",
    "files": [
        {
            "key": "apple/input-test-inventory/test-inventory-apple/data/ec881f31-e3ea-4494-acac-234b2bf2e8ae.parquet",
            "size": 1269,
            "MD5checksum": "e9ca04ff1af23274b58e7d264a29d519"
        }
    ]
}


続いてbananaですが、こちらも想定通りインベントリ情報が出力されています。
f:id:live-your-life-dd18:20191031133559p:plain

dataフォルダに格納されているparquetファイルは以下のような内容になっています。
最初にbanana/がカウントされている理由ですが、S3はフォルダとは名称しつつもKVSで管理されているため、"banana"フォルダではなく"banana"というキーとして認識されているため、このような内容になっています。

    {
        "bucket": "input-test-inventory",
        "key": "banana/",
        "size": 0,
        "last_modified_date": "2019-10-29T04:54:09.000Z",
        "storage_class": "STANDARD"
    },
    {
        "bucket": "input-test-inventory",
        "key": "banana/pisanmasbanana.csv",
        "size": 4660,
        "last_modified_date": "2019-10-29T04:57:22.000Z",
        "storage_class": "STANDARD"
    },
    {
        "bucket": "input-test-inventory",
        "key": "banana/redbanana.csv",
        "size": 4660,
        "last_modified_date": "2019-10-29T04:56:44.000Z",
        "storage_class": "STANDARD"
    }
]


manifest.jsonファイルはparquetファイルが対象、parquetファイルはインベントリ情報を取得した実データが対象なので、実際にデータサイズのサマリーを出す場合はparquetファイルのサイズ項目を集計したら出せそうです。

感想及び所感

以前やったAWS CLIでのデータサイズ取得だと定期実行の設定する必要があったので、それと比べるとAWS機能で自動で定期的に取得できる点は良いですね。
データサイズのサマリ計算もLambdaでやろうとすると作りこみが必要ですが、parquetで出力できるならばGlueで読み込みしてAthenaでクエリ発行したら簡単に計算できそうです。
また、Athenaでのクエリ発行までできたらブログに書こうと思います。