遭遇した課題
AWSではロードバランサー(ELB, ALB)のアクセスログをS3上に保存することができるわけですが、将来のことをあまり良く考えずに場当たり的に設定した結果、以下のような課題にぶち当たりました。
起動しているロードバランサーが数台であれば、WEB管理画面からポチポチ確認すれば良いのですが、10台超えたあたりからしんどくなってきます。。。
- そもそもアクセスログ有効になってるのか?
- どのS3バケットのどんなパスに保存しているのか?
そこで、以下のように aws-cli + jq を使うといくらか苦痛が緩和されました。
手順
ELB の場合
実行したコマンド
$ aws elb describe-load-balancers | jq -r '.LoadBalancerDescriptions[].LoadBalancerName' > /tmp/elb-names.txt
$ cat /tmp/elb-names.txt | while read NAME \
do \
echo $NAME \
aws elb describe-load-balancer-attributes --load-balancer-name=$NAME \
| jq '.LoadBalancerAttributes.AccessLog | "s3://\(.S3BucketName)/\(.S3BucketPrefix)"' \
echo \
done
出力例
# ロギング設定なし
elb-hogehoge1
"s3://null/null"
elb-hogehoge2
"s3://bucket2/prefix"
elb-hogehoge3
"s3://bucket2/prefix"
ALB の場合
実行したコマンド
$ aws elbv2 describe-load-balancers | jq -r '.LoadBalancers[].LoadBalancerArn' > /tmp/alb-arns.txt
$ cat /tmp/alb-arns.txt | while read ARN \
do \
echo $ARN | cut -d'/' -f3 \
aws elbv2 describe-load-balancer-attributes --load-balancer-arn $ARN \
| jq '"s3://\(.Attributes[] | select(.Key=="access_logs.s3.bucket").Value)/\(.Attributes[] | select(.Key=="access_logs.s3.prefix").Value)"' \
echo \
done
出力例
# ロギング設定なし
alb-hogehoge1
"s3:///"
alb-hogehoge2
"s3://bucket2/prefix"
alb-hogehoge3
"s3://bucket3/prefix"