본문으로 건너뛰기
버전: docs v25.02

Update AI Conductor


Updated 2024.10.02

Topics

  1. AI Conductor 업데이트
  2. AI Conductor 버전 업데이트


자세한 단계

{변수}의 자세한 설명은 Terminology 페이지를 참고하세요

# env for update variables
export AIC_RELEASE_VERSION=
export AIC_BACKEND_IMAGE_TAG=
export AIC_FRONTEND_IMAGE_TAG=

# env for fixed variables
export AWS_ACCOUNT_ID=
export AWS_DEFAULT_REGION=
export AWS_DEFAULT_REGION_ALIAS=
export DOMAIN_NAME=
export INFRA_NAME=
export DEPLOY_ENV=
export REDIS_HOST=
export REDIS_PORT=

export AIC_BACKEND_IMAGE_URL=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ai-advisor/ai-conductor/aic-webserver
export AIC_FRONTEND_IMAGE_URL=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/ai-advisor/ai-conductor/aic-frontend
export AWS_SECRETS_MANAGER_RDS=/parameter/${AWS_DEFAULT_REGION}/${INFRA_NAME}/${DEPLOY_ENV}/rds
export AIC_ECR_BASE_PATH=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-repo-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}/
export DASHBOARD_PREFIX=https://aicond-mon.${DOMAIN_NAME}.com/d/

# env for update version
export AIC_BACKEND_URL=aicond-${DOMAIN_NAME}/api/v1/docs
export AIC_ADMIN_USER=admin
export AIC_ADMIN_PASSWD=


1. AI Conductor 업데이트

AI Conductor 초기 배포의 자세한 설명은 AI Conductor 배포하기 페이지를 참고하세요



[OPTION] AI Conductor DB 업데이트

AI Conductor DB 업데이트가 필요한 경우 아래와 같은 순서로 업데이트를 진행 합니다.

  • ai-conductor-{AIC_RELEASE_VERSION}.sql 파일을 개발자로부터 전달 받습니다.

  • AI Conductor Table을 업데이트 합니다.

    mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_ADMIN_USERNAME} -p < ai-conductor-${AIC_RELEASE_VERSION}.sql
    # insert : ${DB_ADMIN_PASSWORD}
  • AI Conductor Table 업데이트를 확인 합니다.

    • ai-conductor-{AIC_RELEASE_VERSION}.sql 과 AI Conductor Table의 alembic_version이 일치하는지 확인합니다.


  • 아래 명령어로 AI Conductor Deployment를 clone 합니다.

    git clone https://github.com/mellerikat/AI-Conductor.git
  • AI Conductor Backend를 업데이트 합니다.

    • AI Conductor Backend 설정을 업데이트합니다.
      • NOTE : 기존 설정된 경우 무시합니다.
    # path : ${TOP}/AI-Conductor/backend

    # redis 를 설정 합니다.
    sed -i "s|host=.*|host=${REDIS_HOST}|g" params/redis.env
    sed -i "s|port=.*|port=${REDIS_PORT}|g" params/redis.env

    # Secrets Manager의 RDS를 설정합니다.
    yq e -i '.spec.parameters.objects |= sub("/parameter.*rds",env(AWS_SECRETS_MANAGER_RDS))' base/secret-provider-class.yaml

    # Environment 설정합니다.
    yq e -i '.spec.template.spec.containers[].env += {"name" : "AIC_ECR_BASE_PATH"}' base/deployment/ai-conductor-backend.yaml
    yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : env(AIC_ECR_BASE_PATH)}' base/deployment/ai-conductor-backend.yaml

    # 모니터링 Dashboard의 prefix를 설정 합니다.
    yq e -i '.spec.template.spec.containers[].env += [{"name" : "DASHBOARD_PREFIX"}]' base/deployment/ai-conductor-backend.yaml
    yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : env(DASHBOARD_PREFIX)}' base/deployment/ai-conductor-backend.yaml
    yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml
    • AI Conductor Backend LDAP 설정을 업데이트합니다. (LDAP 사용 시 설정 필요)

      • NOTE : 기존 설정된 경우 무시합니다.
      [Expand AI Conductor LDAP 설정]
      # path : ${TOP}/AI-Conductor/backend

      # LDAP Secret 설정 합니다.
      yq e -i '. += {"secretGenerator"}' kustomization.yaml
      yq e -i '.secretGenerator += [{"name":"ldap-secret"}]' kustomization.yaml
      yq e -i '.secretGenerator[-1] += {"namespace":"ai-conductor"}' kustomization.yaml
      yq e -i '.secretGenerator[-1].options += {"disablenamesuffixhash":true}' kustomization.yaml
      yq e -i '.secretGenerator[-1].files += ["./params/lge_root_ca.crt"]' kustomization.yaml

      # LDAP Secret 사용 설정 합니다.
      yq e -i '.spec.template.spec.volumes += [{"name" : "aic-volume"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.volumes[-1].secret += {"secretName" : "ldap-secret"}' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].volumeMounts += [{"name" : "aic-volume"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].volumeMounts[-1] += {"readOnly":true}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].volumeMounts[-1] += {"mountPath":"/etc/aic"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].volumeMounts[-1].mountPath |= . style="double"' base/deployment/ai-conductor-backend.yaml

      # LDAP 설정 합니다.
      yq -i '(.spec.template.spec.containers[] | select(.env[] | select(.name == "LDAP_ENABLED")).env[] | select(.name == "LDAP_ENABLED")).value = "true"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_HOST_NAME"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "ldaps://lgesaapds01.lge.net"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_HOST_PORT"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "636"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_BASE_DN"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "OU=LGE Users,dc=LGE,dc=NET"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_SEARCH_DN"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "dc=lge,dc=net"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_BIND_ID"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "{login_id}@lge.net"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAP_QUERY"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "(cn={login_id})"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml

      yq e -i '.spec.template.spec.containers[].env += [{"name" : "LDAPS_CA_CERT"}]' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1] += {"value" : "/etc/aic/lge_root_ca.crt"}' base/deployment/ai-conductor-backend.yaml
      yq e -i '.spec.template.spec.containers[].env[-1].value |= . style="double"' base/deployment/ai-conductor-backend.yaml
      • 인프라 담당자로부터 lge_root_ca.crt 전달 받아 {TOP}/AI-Conductor/backend/params/lge_root_ca.crt 위치에 저장합니다.
    • AI Conductor Backend 이미지를 업데이트합니다.

    # path : ${TOP}/AI-Conductor/backend
    cd AI-Conductor/backend

    # AI Conductor Backend 업데이트 이미지 설정
    yq e -i '.images[].newName = env(AIC_BACKEND_IMAGE_URL)' kustomization.yaml
    yq e -i '.images[].newTag = env(AIC_BACKEND_IMAGE_TAG)' kustomization.yaml

    # AI Conductor Backend 업데이트
    kubectl apply -k .
  • AI Conductor Frontend를 업데이트 합니다.

    • NOTE : Backend 업데이트 후 Frontend 업데이트합니다.
    # path : ${TOP}/AI-Conductor/frontend

    # AI Conductor Frontend 업데이트 이미지 설정
    yq e -i '.images[].newName = env(AIC_FRONTEND_IMAGE_URL)' kustomization.yaml
    yq e -i '.images[].newTag = env(AIC_FRONTEND_IMAGE_TAG)' kustomization.yaml

    # AI Conductor Frontend 업데이트
    kubectl apply -k .
  • AI Conductor 업데이트 확인을 합니다.

    • AI Conductor 이미지가 정상적으로 업데이트 되었는지 확인합니다.

      [Expand AI Conductor 업데이트 확인]

      업데이트가 완료되면 아래와 같이 pod의 STATUS 가 'Running' 상태입니다.

      kubectl get pod -n ai-conductor

      # 출력
      NAME READY STATUS RESTARTS AGE
      ai-conductor-web-749bcd95d5-jjg9d   1/1 Running 0 15s
      ai-conductor-web-749bcd95d5-r7jk5   1/1 Running 0 15s
      frontend-server-6b6994d545-5x4cc 1/1 Running 0 1m2s
      frontend-server-6b6994d545-cgq8s 1/1 Running 0          1m2s
    • AI Conductor 이미지가 {AIC_BACKEND_IMAGE_TAG} 와 {AIC_FRONTEND_IMAGE_TAG} 로 업데이트 되었는지 확인합니다.

      [Expand AI Conductor 이미지 업데이트 확인]

      {AIC_BACKEND_IMAGE_TAG} 와 {AIC_FRONTEND_IMAGE_TAG} 업데이트 이미지를 확인합니다.

      kubectl describe pod -n ai-conductor ai-conductor-web-749bcd95d5-7f9qc

      # 출력
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal Scheduled 29m default-scheduler Successfully assigned ai-conductor/ai-conductor-web-58497c76d6-77mg9 to ip-10-0-128-222.ap-northeast-2.compute.internal
      Normal Pulling 29m kubelet Pulling image "339713051385.dkr.ecr.ap-northeast-2.amazonaws.com/ecr-repo-an2-meerkat-dev/ai-advisor/ai-conductor/aic-webserver:${AIC_BACKEND_IMAGE_TAG}"

      kubectl describe pod -n ai-conductor frontend-server-6b6994d545-5x4cc

      # 출력
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal Scheduled 29m default-scheduler Successfully assigned ai-conductor/frontend-server-6b6994d545-5x4cc to ip-10-0-128-222.ap-northeast-2.compute.internal
      Normal Pulling 29m kubelet Pulling image "339713051385.dkr.ecr.ap-northeast-2.amazonaws.com/ecr-repo-an2-meerkat-dev/ai-advisor/ai-conductor/aic-frontend:${AIC_FRONTEND_IMAGE_TAG}"


2. AI Conductor 버전 업데이트

  • {AIC_BACKEND_URL} 접속
  • POST/api/v1/auth/login 에서 admin 으로 로그인
    • login_id : {AIC_ADMIN_USER}
    • login_pw : {AIC_ADMIN_PASSWD}
  • POST/api/v1/versions 으로 버전 업데이트
    • ver_str : {AIC_RELEASE_VERSION}
    • frontend_hash : {AIC_FRONTEND_TAG}
    • backend_hash : {AIC_BCAKEND_TAG}
    • description : 원하는 문장 (사용자에게 노출되지 않음)