본문 바로가기

Infra

AMI 생성 간 컨테이너 상태에 관한 이슈

Ami create issue

회사 프로젝트 인프라 구축 간 HA 구현을 위한 Auto scaling을 진행하기 위해 먼저 이중화에 대한 테스트를 진행하였다.

이중화 테스트를 위한 시작 템플릿을 작성하기 위해서는 AMI를 생성을 해야했고

필요한 모든 컨테이너를 띄운 상태에서 AMI를 생성해서 진행하였다.

 

문제점
하지만 AMI를 생성할 때 모든 컨테이너를 일괄적으로 중지시킨 상태로 생성한다는 점을 간과하였고
이 결과 템플릿을 활용하여 만든 사본 인스턴스의 컨테이너들은 원본 인스턴스의 환경변수 세팅이 되어있는 상태.

해결방안
AMI를 생성할 때 모든 컨테이너가 떠 있지 않은 상태로 생성하고 aws의 사용자 데이터 기능을 활용하여 새로운 인스턴스가 생성될 때 컨테이너를 띄워줌으로서 해결할 수 있다.

사용자 데이터의 경우

-------------------------------------------------------------------------------------------------------------------------

#!/bin/bash
HOME_DIR="xxxxxxx"
APPS_DIR="xxxxxxx"
CONFIG_SERVER="http://xxxxxxx"
EUREKA="http://xxxxxxx"
IPARR=($(hostname -I))
SVC_ARR[0]="xxxxxxx-xxxxxxx"
SVC_ARR[1]="xxxxxxx-xxxxxxx"
SVC_ARR[2]="xxxxxxx-xxxxxxx"
SVC_ARR[3]="xxxxxxx-xxxxxxx"
SVC_ARR[4]="xxxxxxx-xxxxxxx"
SVC_ARR[5]="xxxxxxx-xxxxxxx"
SVC_ARR[6]="xxxxxxx-xxxxxxx"
SVC_ARR[7]="xxxxxxx-xxxxxxx"
SVC_ARR[8]="xxxxxxx-xxxxxxx"
ports[0]=xxxxxxx
ports[1]=xxxxxxx
ports[2]=xxxxxxx
ports[3]=xxxxxxx
ports[4]=xxxxxxx
ports[5]=xxxxxxx
ports[6]=xxxxxxx
ports[7]=xxxxxxx
ports[8]=xxxxxxx

for IDX in ${!SVC_ARR[@]}; do
  cd "$APPS_DIR/${SVC_ARR[IDX]}"
  if [ "${SVC_ARR[IDX]}" = "megatoi-config" ]; then
    sed -i '/CONFIG_SERVER/d' .env
    echo "CONFIG_SERVER=${CONFIG_SERVER}" >> .env
  elif [ -e ".env" ]; then
    echo "edit ${SVC_ARR[IDX]}/.env"
    sed -i '/IPADDRESS/d' .env
    echo "IPADDRESS=${IPARR[0]}" >> .env
    sed -i '/EUREKA_DEFAULT_ZONE/d' .env
    echo "EUREKA_DEFAULT_ZONE=${EUREKA}" >> .env
    sed -i '/CONFIG_SERVER/d' .env
    echo "CONFIG_SERVER=${CONFIG_SERVER}" >> .env
  fi
  docker-compose up -d
  cnt=1
  retry=1
  echo "check docker containers port:${ports[IDX]}"
  while [ ${cnt} -ne 0 ]; do
    if [ ${retry} -gt 10 ]; then
      echo -e "\033[31m${SVC_ARR[IDX]}: timeout.\033[0m"
      break
    fi
    echo -e "remain : $((10-$retry))"
    curl localhost:${ports[IDX]} --connect-timeout 5 > /dev/null 2>&1
    cnt=$?
    if [ ${cnt} -ne 0 ]; then
      echo -e "\033[31m${SVC_ARR[IDX]} is not ready... retry after 5sec\033[0m"
      retry=$(($retry+1))
      sleep 5
    else
      echo -e "\033[32m${SVC_ARR[IDX]} now ready!\033[0m"
      sleep 1
    fi
  done
done

-------------------------------------------------------------------------------------------------------------------------

IP를 따서 환경변수에 세팅해준 이후에 각 컨테이너를 실행시키는 쉘 스크립트를 활용하였다.

'Infra' 카테고리의 다른 글

AWS Role-base  (0) 2021.01.04
내부 로드 밸런서란?  (0) 2020.12.10
aws ec2 인스턴스 사용자 데이터  (0) 2020.12.09
Ha multiplexing  (0) 2020.12.09
HA of infra  (0) 2020.12.08