アドベントカレンダー3日目です。
弊社では様々な事情により複数のAWSアカウントがあります。
今までは人力でAWS情報を一つに纏めていましたが、そろそろ台数的に限界に至り
自動更新する仕組みをサクッと以下の要件で作成することにしました。
- 定期的に自動更新したい
- 更新時の通知はSlack等でよい
- CSV形式みたいな感じ
- 保存場所はBacklogで
構成図
追加のライブラリや環境にあまり依存しないよう以下のコマンドで作成。
- aws-cli
- jq
- curl
動作は以下の通りです。
1. EC2(Amazonlinux2)のCronで起動
2. aws-cli にて情報取得しcsv作成
3. curlでcsvをBacklogにupload
4. 取得したattachidをcurlでwikiと紐づける
5. slackに通知
ec2用script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#!/bin/bash set -e # .aws/credentials declare -a AWS_ACCOUNT=($(cat << EOF account_a account_b account_c EOF )) CSV_PATH=/home/example-dir CSV_FILE="$(date +%Y%m%d)_all_ec2_list.csv" # main start echo "account,status,Name,Instance-Id,InstanceType,Publicip,Privateip,Zone,Tags01,Tags02,Tags03,Tags04,Tags05,Tags06,Tags07" >"${CSV_PATH}/${CSV_FILE}" for ac in ${AWS_ACCOUNT[@]};do # set profile aws configure set region ap-northeast-1 --profile "${ac}" # awscli main - generate CSV aws ec2 describe-instances --profile "${ac}"| jq -r --arg a ${ac} '.Reservations[].Instances[] | $a + "," + .State.Name + "," + [.Tags[] | select(.Key == "Name").Value][] + "," + .InstanceId + "," + .InstanceType + "," + .PublicIpAddress + "," + .PrivateIpAddress + "," + .Placement.AvailabilityZone + "," + ([.Tags[]|.Key + ":" + .Value + ","]|sort|add)' >>"${CSV_PATH}/${CSV_FILE}" done # Backlog upload main APIKEY="xxxxxxxxxxxxxxxxxx-example-api-key-xxxxxxxxxxxxxxxxxxxxxxxxx" UPLOADFILE="${CSV_PATH}/${CSV_FILE}" DOMAIN=example.backlog.com WIKIID=999999 # file upload RES="$(curl -s -F filename=${UPLOADFILE} -F file=@${UPLOADFILE} https://${DOMAIN}/api/v2/space/attachment?apiKey=${APIKEY} 2>&1)" # get ID (return ATTACHID="123456") ATTACHID="$(echo ${RES}|cut -f 1 -d ","|grep -o -E "[^:]*[0-9]{6}")" # file attach to wiki curl -s -d "attachmentId[]=${ATTACHID}" https://${DOMAIN}/api/v2/wikis/${WIKIID}/attachments?apiKey=${APIKEY} # send slack curl -s -XPOST https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxx -d ' { "username":"CRON from '"$(hostname)"'", "channel": "#example", "icon_url":"https://example.com/icon.png", "attachments": [ { "text":"'"${CSV_FILE}"'のアップロードを完了しました。", "fallback":"'"${CSV_FILE}"'のアップロードを完了しました。", "color":"good" }, ] }' # All Done. echo -e "\n$(date +'%Y/%m/%d %H:%M:%S') :All Done." |
成功したら slackの通知がこのように来ます。
実際のcsvの中身は以下のようになっています。
弊社ではこの他のリソース一覧も同様のScriptで自動更新している他、AzureのリソースについてもBacklogのgitを利用しています。
おわりに
いかがだったでしょうか。
複数アカウントの情報を纏めるのは大変ですよね。
この記事が皆さまの快適なインフラ業務の一助になれば幸いです。