【AWS】Amazon S3 ~ AWS CLI / aws s3 ls ~

■ はじめに

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 S3aws s3api ~
https://dk521123.hatenablog.com/entry/2024/05/22/235922
Amazon S3AWS CLI
https://dk521123.hatenablog.com/entry/2017/04/01/235355
Amazon S3AWS 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