■ はじめに
https://dk521123.hatenablog.com/entry/2017/04/01/235355
の続き。 作業で、S3バケット内のファイル容量を調べる必要が出てきて そのファイルの時間推移も併せて調べることとなった。 ちまちまManagement Console上から手作業で調べていたのだが シェルでやった方が正確かつ後々同じことしそうなので記録しておく
目次
【1】aws s3 ls 1)構文 2) コマンド例 【2】オプション 1)--recursive 2)--summarize (--sum) 3)--human-readable(--human) 【3】シェルスクリプトで半自動化 1)s3バケット構成 2)サンプル 【4】補足:「シェルスクリプトで半自動化」でのTips 1)指定した年月で末日を算出する 2)【Key】:【Value】の文字列抽出 & Trim 3)ゼロ埋め 4)多重ループの break
【1】aws s3 ls
* S3の一覧表示
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html
1)構文
aws s3 ls (s3://【S3のバケット名】)
2) コマンド例
例1:s3バケット一覧を表示する
$ aws s3 ls
例2:容量を出力する
https://dev.classmethod.jp/articles/aws-cli-count-s3-filesize/
# --summarize (--sum):合計サイズとオブジェクトの数を表示 # --recursive:再帰的に下位階層にあるパスのファイルまで対象にする $ aws s3 ls s3://your-bucket/your-dir/ --recursive --sum 2024-10-02 00:00:00 3123232 your-dir/2024/10/02/test.csv Total Object: 1 Total Size: 3123232
【2】オプション
1)--recursive
* 再帰的に下位階層にあるパスのファイルまで対象にする
2)--summarize (--sum)
* 合計サイズ(Byte)とオブジェクトの数を表示
3)--human-readable(--human)
* ファイルサイズに単位をつけて表示 (e.g. MiB)
【3】シェルスクリプトで半自動化
1)s3バケット構成
s3://your-s3-bucket-name/ /xxxx/data-type(e.g. customer)/yyyy(e.g. 2024)/MM (e.g. 01)//dd (e.g. 01)/ <= ここの部分の容量を取得したい <File1> ... <FileX>
2)サンプル
#!/bin/bash S3_BUCKET_NAME=your-s3-bucket-name S3_ROOT_PATH=xxxx/customer/ OUTPUT_FILE="./customer.tsv" YEAR_LIST=(2023 2024) MONTH_LIST=(1 2 3 4 5 6 7 8 9 10 11 12) CURRENT_DATE=`date +"%Y%m%d"` # output the TSV header echo -e "target_date\tfile_size" > ${OUTPUT_FILE} # YEAR part for year in ${YEAR_LIST[@]}; do echo "[DEBUG] target_year=$year" # MONTH part for i in ${MONTH_LIST[@]}; do month=`printf "%02d\n" ${i}` echo "[DEBUG] target_month=$month" first_date=`date -d "-1 days + 1 month ${year}/${i}/1" +%Y%m01` end_day=`date +"%d" -d "-1 days + 1 month ${first_date}"` # DAY part for((j=1; j<=end_day; j++)) do day=`printf "%02d\n" ${j}` target_date=${year}${month}${day} echo "target_date=${target_date}" if [ "${target_date}" -gt "${CURRENT_DATE}" ]; then echo "target_date [${target_date}] is greater than ${CURRENT_DATE}" break fi ######################## # Main process ######################## # Run aws s3 ls to get file size result=`aws s3 ls s3://${S3_BUCKET_NAME}/${S3_ROOT_PATH}${year}/${month}/${day}/ --recursive --sum | grep "Total Size:"` # Get file size file_size=`echo ${result} | cut -d ':' -f 2 | sed 's/^ *\| *$//'` # Output into TSV file echo -e "${target_date}\t${file_size}" >> ${OUTPUT_FILE} done if [ "${target_date}" -gt "${CURRENT_DATE}" ]; then break; fi done if [ "${target_date}" -gt "${CURRENT_DATE}" ]; then break; fi done echo "Done"
【4】補足:「シェルスクリプトで半自動化」でのTips
* aws s3 ls のTipsではなく、サンプルで作成したBashのTips。
1)指定した年月で末日を算出する
date +%Y%m%d -d "-1 days + 1 month $(date -d '-1days + 1 month <年>/<月>'/1 +%Y%m01)"
日時/タイムゾーン関連のコマンド
https://dk521123.hatenablog.com/entry/2017/02/07/232516
2)【Key】:【Value】の文字列抽出 & Trim
#!/bin/bash result=" Total Size: 102400" key=`echo ${result} | cut -d ':' -f 1 | sed 's/^ *\| *$//'` # key=Total Size echo "key=${key}" value=`echo ${result} | cut -d ':' -f 2 | sed 's/^ *\| *$//'` # value=102400 echo "value=${value}"
シェル ~ 文字列抽出あれこれ ~
https://dk521123.hatenablog.com/entry/2021/08/03/160901
3)ゼロ埋め
$ printf "%02d\n" 1 01 $ printf "%02d\n" 10 10
4)多重ループの break
* 以下の関連記事を参照のこと
シェル ~ 基本編・ループ while / for etc ~
https://dk521123.hatenablog.com/entry/2021/08/09/000000
関連記事
Amazon S3 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/03/06/212734
Amazon S3 ~ aws s3api ~
https://dk521123.hatenablog.com/entry/2024/05/22/235922
Amazon S3 ~ AWS CLI ~
https://dk521123.hatenablog.com/entry/2017/04/01/235355
Amazon S3 ~ AWS CLI / aws s3 sync ~
https://dk521123.hatenablog.com/entry/2024/06/06/203209
Amazon S3 ~ Boto3編 ~
https://dk521123.hatenablog.com/entry/2019/10/21/230004
シェル ~ 基本編・ループ while / for etc ~
https://dk521123.hatenablog.com/entry/2021/08/09/000000
シェル ~ 文字列抽出あれこれ ~
https://dk521123.hatenablog.com/entry/2021/08/03/160901
シェル ~ ファイル処理あれこれ ~
https://dk521123.hatenablog.com/entry/2020/09/28/000000
日時/タイムゾーン関連のコマンド
https://dk521123.hatenablog.com/entry/2017/02/07/232516