やりたいこと
業務でAWSリソースの整理をしておりいくつか使用していなさそうなS3を発見。
そのまま削除してしまうのも怖いし、アーカイブ用に残しておくのもコストがかかるので、
ローカルにZIPでダウンロードしてからGoogleドライブで保管しようと考えました。
S3が複数ある場合にマネコンでポチポチやるのも面倒なので、バケットの中身をローカルに落としてからZIP形式に圧縮するまでを自動化するスクリプトを組んで行こうと思います。
前提条件
- AWS CLIをインストール済みであること
- ./aws/配下の'config','credencial'ファイルを用意してAWS CLIが使用可能であること
準備
今回は対象のバケットが複数あったので、CSVファイルにバケット名を記載しておき、CSVファイルからバケット名を読み込むようにしていきます。
筆者のCSVファイルは以下のようにしました。
example,aa
test,bb
筆者の場合は、削除対象のs3バケットをNotionのdatabeseに記載し、CSVでエクスポートしたものを使用しました。
ここでポイントなのは、各行の1つ目の要素にバケット名を記載することです。
各行に大量の要素があることは問題ないです。
今回の例だと"example","test"がバケット名です。
スクリプト
- CSV_FILE変数を、バケット名の入ったファイル名に変更
- export AWS_PROFILE=""にAWS CLIを実行するプロファイル名を記載
- s3_sync_to_local.shを実行
#s3_sync_to_local.sh
#!/bin/bash
export AWS_PROFILE=""
# CSVファイルのパス
CSV_FILE="xxxxxxxx.csv"
while IFS=',' read -r bucket_name _; do
# バケット名の前後にある空白や改行を削除(トリム)
bucket_name=$(echo "$bucket_name" | xargs)
echo "Processing bucket: $bucket_name"
# バケットごとのローカルディレクトリとZIPファイル名を設定
LOCAL_DOWNLOAD_DIR="./s3_downloads/$bucket_name"
ZIP_FILE="$bucket_name.zip"
# ローカルのダウンロードディレクトリを作成
mkdir -p $LOCAL_DOWNLOAD_DIR
# S3バケットの内容をローカルに同期
aws s3 sync s3://$bucket_name $LOCAL_DOWNLOAD_DIR
# 同期した内容をZIP形式に圧縮
zip -r $ZIP_FILE $LOCAL_DOWNLOAD_DIR
# 圧縮が完了したら、必要に応じてダウンロードディレクトリを削除
# rm -rf $LOCAL_DOWNLOAD_DIR
echo "Bucket $bucket_name has been downloaded and compressed into $ZIP_FILE"
done < "$CSV_FILE"
スクリプトを実行すると、以下が作成されます。
- ./s3_downloads配下に、バケット名毎のディレクトリと、バケットのオブジェクト
- "$bucket_name.zip"ファイル(S3の中身が圧縮されています)
おわりに
何かを削除するには入念な調査と、万が一に備えて復元できる事が大切だと最近強く学びました。
読んでくれた方の時間を10分でも削減できたら嬉しいです。