はじめに
ポインコ兄とエンジニアの高橋です。はてなブログになって初めての投稿で緊張しています。 さて、今回は業務で 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 を意識したブログを書いていきたい所存、と兄が申しておりました。今後ともよろしくお願いします。
それではまた、ごきげんよう。
高橋 悠佑 (ポインコ兄) (執筆記事一覧)
健康志向です