Print
카테고리: [ Amazon Web Services ]
조회수: 4040

1. 개요

describe-load-balancers를 잘 쓰면 편리하겠지만 아직 그런 능력은 없어서 bash를 통해 데이터를 가공하는 방법을 택했다.

2. 소스

문제가 있으면 직접 고쳐 쓰자...

#!/bin/bash
 
function init() {
        CREATED=""
        DNS_NAME=""
        ZONE=""
        SCHEMA=""
        ELB_NAME=""
        INSTANCE=()
        LISTENER=()
        AZ=()
        SUBNET=()
}
 
function joinArray {
        local IFS="$1"; shift; echo "$*";
}
 
function get() {
        echo "$2"
}
 
function getElbInfo() {
        if [[ "$*" == *"internal"* ]]; then
                DNS_NAME=$4
                ZONE=$2
                CREATED=$3
                ELB_NAME=$5
                SCHEMA="internal"
        elif [[ "$*" == *"internet-facing"* ]]; then
                DNS_NAME=$2
                ZONE=$3
                CREATED=$4
                ELB_NAME=$6
                SCHEMA="internet-facing"
        fi
 
        if [[ "$IS_DNS_NAME_CONTAIN" == "true" && "$DNS_NAME" == *"$DNS_NAME_CONTAIN"* ]] || [[ "$IS_DNS_NAME_CONTAIN" == "false" ]]; then
                IS_DOMAIN_MATCH=true
                if [[ "$SCHEMA" == "internal" ]]; then
                        SCHEMA_INTERNAL=$((SCHEMA_INTERNAL + 1))
                elif [[ "$SCHEMA" == "internet-facing" ]]; then
                        SCHEMA_INTERNET_FACING=$((SCHEMA_INTERNET_FACING + 1))
                fi
        else
                IS_DOMAIN_MATCH=false
        fi
}
 
function getListener() {
        if [[ "$5" == "HTTPS" && "$6" != null ]]; then
                CERT=`echo $6 | cut -d'/' -f2`
                CERT_DOMAIN_NAME+=(`aws acm describe-certificate --certificate-arn $6 | grep DOMAINVALIDATIONOPTIONS | awk {'print $2'}`)
                echo "$4($5)->$2($3)/$CERT(`joinArray \"|\" \"${CERT_DOMAIN_NAME[@]}\"`)"
        else
                echo "$4($5)->$2($3)"
        fi
}
 
function printArray() {
        TITLE=$1
        shift
        ARRAY=("${@}")
        ARRAY_LENGTH=${#ARRAY[@]}
        if [[ $ARRAY_LENGTH == 0 ]]; then
                echo "$TITLE"
        else
                for (( i=0; i<${ARRAY_LENGTH}; i++ )); do
                        if [[ $i == 0 ]]; then
                                echo "$TITLE ${ARRAY[$i]}"
                        else
                                echo "                ${ARRAY[$i]}"
                        fi
                done
        fi
}
 
function printLoadBalancer() {
        if [[ "$AZ" != "" &amp;&amp; "$IS_DOMAIN_MATCH" == "true" ]]; then
                VAR=$((VAR + 1))
                echo "[$VAR] $ELB_NAME"
                echo "     SCHEMA   : $SCHEMA"
                echo "     ZONE     : $ZONE"
                echo "     DNS Name : $DNS_NAME"
                echo "     Created  : $CREATED"
                printArray "     Instance :" "${INSTANCE[@]}"
                printArray "     Listener :" "${LISTENER[@]}"
                printArray "     AZ       :" "${AZ[@]}"
                printArray "     Subnet   :" "${SUBNET[@]}"
                echo ""
        fi
        init
}
 
SCHEMA_INTERNAL_COUNT=0
SCHEMA_INTERNAL_FACING_COUNT=0
 
aws elb describe-load-balancers > lb_tmp.txt
aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /' > ec2_tmp.txt
 
init
 
if [[ "$1" != "" ]]; then
        IS_DNS_NAME_CONTAIN=true
        DNS_NAME_CONTAIN=$1
        echo "Finding ... \"$1\" load balancer ..."
        echo ""
else
        IS_DNS_NAME_CONTAIN=false
        echo "Finding all load balancer ..."
        echo ""
fi
 
while read LINE; do
        if [[ "$LINE" == "LOADBALANCERDESCRIPTIONS"* ]]; then
                printLoadBalancer
                getElbInfo $LINE
        elif [[ "$LINE" == "INSTANCES"* ]]; then
                INSTANCE_ID=`get $LINE`
                INSTANCE_NAME=`grep $INSTANCE_ID ec2_tmp.txt | awk {'print $3'}`
                INSTANCE+=("$INSTANCE_NAME($INSTANCE_ID)")
        elif [[ "$LINE" == "LISTENER"* ]]; then
                LISTENER+=(`getListener $LINE`)
        elif [[ "$LINE" == "AVAILABILITYZONES"* ]]; then
                AZ+=(`get $LINE`)
        elif [[ "$LINE" == "SUBNETS"* ]]; then
                SUBNET+=(`get $LINE`)
        fi
done < lb_tmp.txt
printLoadBalancer
 
echo "  ** Internal load balancer        : $SCHEMA_INTERNAL"
echo "  ** Internet facing load balancer : $SCHEMA_INTERNET_FACING"
echo ""

3. Release

3-1. 2017-10-26