Search code examples
amazon-web-servicesshelltagstarget

Add instances in target group aws cli, shell script


Wrote a script to add instances to the AWS target group

#!/bin/bash
export AWS_PROFILE=***
export AWS_DEFAULT_REGION=eu-central-1

for INST_NAME in $(aws ec2 describe-instances --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' --output text | sort); do
    echo "check ${INST_NAME} in Target Group"
    TARGET_GROUP=$(aws elbv2 describe-target-groups|jq -r '.[]|.[].TargetGroupArn'| grep ${INST_NAME})
    RUNNING_INSTANCES=$(aws ec2 describe-instances| jq '.Reservations[].Instances[] | select(.Tags[].Value=="${INST_NAME}")'| jq -r .InstanceId| sort | uniq | wc -l)
    COUNT=$(aws elbv2 describe-target-health --target-group-arn ${TARGET_GROUP}|jq -r '.TargetHealthDescriptions[].Target.Id'| wc -l)
    if [[ ${RUNNING_INSTANCES} = ${COUNT} ]]; then
        echo "VSE OK"
    else 
        echo "dobavit ${RUNNING_INSTANCES} v ${TARGET_GROUP}"
        for INSTANCE_ID in $(aws ec2 describe-instances --filter Name=tag-key,Values=Name --query "Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key=='Name']|[0].Value}"|jq ".[][]|select(.Name==\"${TAGS}\")"|jq -r .Instance); do
            ASG=$(aws autoscaling describe-auto-scaling-instances|jq '.AutoScalingInstances'|jq ".[]|select(.InstanceId==\"${INSTANCE_ID}\")"|jq -r .InstanceId)
            echo "Updating ${TARGET_GROUP} to add instances from ${ASG}"
            aws elbv2 register-targets --target-group-arn ${TARGET_GROUP} --targets "Id="${ASG}
        done
    fi
done

but he doesn't add. Need select all instances by tag and compare with the number in the target group, if the number is different, then add all instances with the tag to the target group


Solution

  • Update, it's working

    for INSTANCE_NAME in $(aws ec2 describe-instances --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' --output text | sort | uniq ); do
    echo "check ${INSTANCE_NAME} in Target Group"
    TARGET_GROUP=$(aws elbv2 describe-target-groups|jq -r '.[]|.[].TargetGroupArn'| grep ${INSTANCE_NAME})
    if ! [ -z "${TARGET_GROUP}" ]; then
        for i in $(echo ${TARGET_GROUP}); do
            RUNNING_INSTANCES=$(aws ec2 describe-instances| jq ".Reservations[].Instances[] | select(.Tags[].Value==\"${INSTANCE_NAME}\")"| jq -r .InstanceId| sort | uniq | wc -l)
            COUNT=$(aws elbv2 describe-target-health --target-group-arn ${i}|jq -r '.TargetHealthDescriptions[].Target.Id'| wc -l)
            if ! [[ ${RUNNING_INSTANCES} = ${COUNT} ]]; then 
                for INSTANCE_ID in $(aws ec2 describe-instances --filter Name=tag-key,Values=Name --query "Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key=='Name']|[0].Value}"|jq ".[][]|select(.Name==\"${INSTANCE_NAME}\")"|jq -r .Instance); do
                    ASG=$(aws autoscaling describe-auto-scaling-instances|jq '.AutoScalingInstances'|jq ".[]|select(.InstanceId==\"${INSTANCE_ID}\")"|jq -r .InstanceId)
                    aws elbv2 register-targets --target-group-arn ${i} --targets "Id="${ASG}
                    echo "Updating ${TARGET_GROUP} to add instances from ${ASG}"
                    
                done
            fi
        done
    fi
    

    done