CLI で複数アカウントの S3 のフォルダ有無を確認

記事タイトルとURLをコピーする

はじめに

ポインコ兄とエンジニアの高橋です。はてなブログになって初めての投稿で緊張しています。 さて、今回は業務で CLI を使って複数アカウントの S3のフォルダ有無を確認してみたので、その紹介です。

AWS CLI とは

コマンドラインで AWS の操作ができるよ、というものですね。 本当は EC2 で実行したり、あるいは Lambda で実装して自動化したかったのですが諸事情で断念。 bash でスクリプト化してそれを叩くようにしました。 aws.amazon.com

CLI についての基本的なところはこちらのブログをどうぞ。 blog.serverworks.co.jp

スクリプトにしてみた

#!/bin/bash

# S3 Path が存在するかどうかを表示する
#   配列に追加した分だけチェックする
#   ローカルでの実行を想定しているため、CLIのprofileを使用

declare -a profile=()   # 対象のCLI Profile
declare -a s3path=()    # 対象のS3 Path (バケット)

# 対象のS3 Pathの後に連結する文字列
targetPath=`date -d '1 month ago' + '/%Y/%m/'`   # 実行日の前月

# AWSアカウント 012345678901用
profile=("${profile[@]}" CLI-Profile-01)
profile=("${profile[@]}" CLI-Profile-01)
profile=("${profile[@]}" CLI-Profile-01)
s3path=("${s3path[@]}" s3://poinco-report-012345678901-ani${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678901-otouto${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678901-ane${targetPath})

# AWSアカウント 012345678902用
profile=("${profile[@]}" CLI-Profile-02)
profile=("${profile[@]}" CLI-Profile-02)
profile=("${profile[@]}" CLI-Profile-02)
s3path=("${s3path[@]}" s3://poinco-report-012345678902-ani${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678902-otouto${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678902-ane${targetPath})

# AWSアカウント 012345678903用
profile=("${profile[@]}" CLI-Profile-03)
profile=("${profile[@]}" CLI-Profile-03)
profile=("${profile[@]}" CLI-Profile-03)
s3path=("${s3path[@]}" s3://poinco-report-012345678903-ani${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678903-otouto${targetPath})
s3path=("${s3path[@]}" s3://poinco-report-012345678903-ane${targetPath})

# 存在有無判定
for ((i = 0; i < ${#profile[@]}; i++)) {
    aws s3 ls ${s3path[i]} --profile ${profile[i]} >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo ${s3path[i]} "は 存在する"
    else
        echo ${s3path[i]} "は 存在しない"
    fi
}

配列の profile には CLI のプロファイルを、s3path にはバケット名を格納します (AWS アカウント IDや Profile 名称は適当なものに変更してあります) 。 業務では前月の Athena の実行結果の有無を検知したかったため、S3 バケット名の後ろにフォルダのパスを付与しています。 ちょっといまいちな設計ではありますが、profile が配列に格納されている分だけ ls でフォルダの存在有無を確認し、結果を表示しています。

実行してみる

poinco_ani : xxx $ bash iamlog_s3_check_cli.sh
s3://poinco-report-012345678901-ani/2020/09/ は 存在する
s3://poinco-report-012345678901-otouto/2020/09/ は 存在する
s3://poinco-report-012345678901-ane/2020/09/ は 存在する
s3://poinco-report-012345678902-ani/2020/09/ は 存在しない
s3://poinco-report-012345678902-otouto/2020/09/ は 存在する
s3://poinco-report-012345678902-ane/2020/09/ は 存在する
s3://poinco-report-012345678903-ani/2020/09/ は 存在する
s3://poinco-report-012345678903-otouto/2020/09/ は 存在する
s3://poinco-report-012345678903-ane/2020/09/ は 存在する

こんな感じになります。フォルダ作成がされていないものがありましたね。 今回はフォルダ有無を確認できれば OK なのでこれでおしまいです。

効果は

マネジメントコンソールで 1 つのフォルダ有無を確認するのに大体 30 秒くらいかかるとします。 CLI での確認ですと 3 秒ほどで完了しますので、手作業の 1 / 10 くらいに短縮は可能かと思います。 確認数が多い場合に効果的ですね。

あとがき

今後も Dev を意識したブログを書いていきたい所存、と兄が申しておりました。今後ともよろしくお願いします。

それではまた、ごきげんよう。

高橋悠佑 (ポインコ兄) (執筆記事一覧)

健康志向です