AWS CLI를 사용하여 EC2 인스턴스의 상태 확인 및 시작을 중지하는 셸 구현 예

4896 단어 ShellScriptawscliEC2

EC2의 Name 태그에서 인스턴스 ID 확인


HOST="server-1"
INSTANCE_ID=`aws ec2 describe-tags \
    --filters \
      "Name=resource-type,Values=instance" \
      "Name=key,Values=Name" \
      "Name=tag-key,Values=Name" \
      "Name=tag-value,Values=${HOST}" \
    --query "Tags[*].{InstanceId:ResourceId}" \
    --output text`

echo "hostname:    ${HOST}"
echo "instance-id: ${INSTANCE_ID}"

EC2 인스턴스 상태 확인(describe-instance-status)



아래에서 AWS 콘솔에서 볼 수 있는 상태를 확인 가능.
다만 인스턴스 정지시는 아웃풋은 Null가 되므로 정지시도 스테이터스를 취하고 싶으면 describe-instances 쪽을 사용하는 것이 좋다.
aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} --output table

결과는 이런 느낌.


이 근처를 참고로 query로 좁히기
htps : // 이 m/도키의 1985/에 ms/417483아 91b5682400150
$ aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} \
    --query "[InstanceStatuses[*].{InstanceId:InstanceId}, \
    InstanceStatuses[*].InstanceState[].{InstanceState:Name}, \
    InstanceStatuses[*].InstanceStatus[].{InstanceStatus:Status}, \
    InstanceStatuses[*].SystemStatus[].{SystemStatus:Status}]" \
    --output json

[
    [
        {
            "InstanceId": "i-99a9aa9a99999a00a"
        }
    ],
    [
        {
            "InstanceState": "running"
        }
    ],
    [
        {
            "InstanceStatus": "ok"
        }
    ],
    [
        {
            "SystemStatus": "ok"
        }
    ]
]

EC2 인스턴스 상태 확인(describe-instances)



결과는 running 또는 stopped로 반환되므로 결과를 변수에 할당하고 if 문으로 분기
INSTANCE_STATE=`aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
    --query "Reservations[].Instances[].State.Name" --output text`

if [ ${INSTANCE_STATE} == "running" ]; then
    echo "Instance ${INSTANCE_ID} is running state" 
elif [ ${INSTANCE_STATE} == "stopped" ]; then
    echo "Instance ${INSTANCE_ID} is stopped state" 
fi

EC2 인스턴스 중지



정지 명령 실행 후, 10초 간격으로 최대 30회 정지 상태가 된 것을 확인하는 스크립트.
${INSTANCE_ID} 는 사전에 취득되고 있는 것이 전제.
MAX_RETRY_NUM=30
CHECK_INTERVAL=10

aws ec2 stop-instances --instance-ids=${INSTANCE_ID}
if [ $? -ne 0 ]; then
    echo "`date` Executing stop nstance ${INSTANCE_ID} (${HOST}) was failed."
    exit 2
fi

RTN=0
i=0
while true
do
    sleep ${CHECK_INTERVAL}
    i=`expr $i + 1`
    INSTANCE_STATE=`aws ec2 describe-instances  --instance-ids ${INSTANCE_ID} --query "Reservations[].Instances[].State.Name" --output text`
    if [ ${INSTANCE_STATE} == "stopped" ]; then
        RTN=0
        echo "Instance ${INSTANCE_ID} was stopped successfully."
        break
    fi
    if [ ${i} -ge ${MAX_RETRY_NUM} ]; then
        RTN=2
        echo "Stopping instance ${INSTANCE_ID} was failed."
        break
    fi
    echo "Waiting for stopped status"
done
echo ${RTN}

EC2 인스턴스 시작



기동 명령 실행 후, 10초 간격으로 최대 30회 정지 상태가 된 것을 확인하는 스크립트.
스테이터스 체크는 인스턴스의 상태 뿐만이 아니라 스테이터스 체크가 양쪽 모두 OK가 되어 있는 것을 확인해 종료.
${INSTANCE_ID} 는 사전에 취득되고 있는 것이 전제.
MAX_RETRY_NUM=30
CHECK_INTERVAL=10

aws ec2 start-instances --instance-ids=${INSTANCE_ID} >> ${LOG} 2>&1
if [ $? -ne 0 ]; then
    echo "ERROR Executing start instance was failed."
    exit 2
fi

RTN=0
i=0
while true
do
    sleep ${INSTANCE_CHK_WAIT}
    i=`expr $i + 1`

    # Assign result to the positional parameters using "set --"
    set -- `aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} \
            --query "[InstanceStatuses[*].InstanceState[].{InstanceState:Name}, \
            InstanceStatuses[*].InstanceStatus[].{InstanceStatus:Status}, \
            InstanceStatuses[*].SystemStatus[].{SystemStatus:Status}]" \
            --output text`

    # Check if all status is ok
    if [ "$1" == "running" ] && [ "$2" == "ok" ] && [ "$3" == "ok" ] ; then
        RTN=0
        echo "Start instance ${INSTANCE_ID} was executed sucessfully."
        breadk
    fi

    # Error exit if retry count is exceeded
    if [ ${i} -ge ${INSTANCE_CHK_RETRY} ]; then
        RTN=2
        echo "Start instance ${INSTANCE_ID} was failed."
        breadk
    fi

    echo "Waiting for status check is ok"
done
echo ${RTN}

좋은 웹페이지 즐겨찾기