소프트웨어 관리 시작하기

소프트웨어 관리 기능은 사용자가 생성/운영하고자 하는 서비스를 소프트웨어 기반으로 관리하고 실행하기 위한 기능을 제공합니다. 이를 위해서 세렝게티 플랫폼은 다음의 3가지 컴포넌트를 통해서 사용자의 서비스를 관리할 수 있도록 지원합니다.

각각의 컴포넌트간 연관 관계는 아래 그림과 같습니다.

management

소프트웨어 관리 기능에서 사용하는 주요 용어 및 간략한 설명은 다음과 같습니다.

  • 어플리케이션 : 서비스 실행 환경의 최소 단위로 서비스 실행에 필요한 소프트웨어 패키지 및 소프트웨어 실행을 위한 제어 모듈로 구성되어져 있습니다. 보다 자세한 설명은 4.1 어플리케이션 정보 관리에서 제공합니다.

  • 워크플로우 : 서비스에 필요한 제어 모듈을 순차적으로 실행하기 위한 실행 단위입니다. 서비스의 특정한 목적을 달성하기 위해서 구성이 되며 목적 달성에 필요한 어플리케이션의 제어 모듈을 사용해서 구성이 됩니다. 보다 자세한 설명은 4.2 워크플로우 관리 기능에서 제공합니다.

  • 서비스 카탈로그 : 카탈로그는 서비스의 소프트웨어 기능과 서비스 운영에 필요한 자원 카탈로그를 묶어서 관리하는 단위로 서비스 카탈로그를 통해서 서비스에서 운영되는 각종 기능을 정의할 수 있습니다.

    • 서비스 카탈로그 인스턴스 : 서비스 카탈로그를 기반으로 실행되는 카탈로그 객체로 서비스 카탈로그가 실행될 때마다 생성이 되며 실행되는 순간의 카탈로그 정보를 기반으로 인스턴스 정보가 생성이 되며 다음의 정보는 카탈로그 인스턴스에 독립적으로 존재하게 됩니다.
      • 카탈로그에 설정된 워크플로우 실행 정보
      • 카탈로그에 설정된 라이프사이클 정보
      • 카탈로그 인스턴스에 생성된 사용자 변수

    보다 자세한 설명은 4.3 서비스 카탈로그 관리 기능에서 제공합니다.

  • 서비스 카탈로그 템플릿 : 카탈로그 템플릿은 서비스 카탈로그를 구성하는 기본 단위로 서비스 구동에 필요한 자원 카탈로그와 해당하는 자원을 바탕으로 실행되는 어플리케이션을 연결하는 역할을 합니다.
    서비스 템플릿은 리소스 카탈로그에서 지정된 리소스 템플릿을 포함하고 있으며 리소스 템플릿에는 실행할 컴퓨팅 자원에 대한 상세 정보를 포함하고 있습니다.

    리소스 카탈로그 구성 예시 서비스 카탈로그 템플릿 구성 예시

    리소스 카탈로그 구성 예시 서비스 카탈로그 템플릿 구성 예시

  • 트랜잭션(Transaction) : 트랜잭션은 제어 모듈의 연속적인 실행을 보장하기 위한 제어 모듈의 실행 순서를 정의합니다.

    • 트랜잭션의 실행 : 트랜잭션은 사용자 또는 시스템에 의해서 실행될 수 있으며 필수적으로 연관된 리소스가 지정이 되어야 합니다.
      • 이벤트 스크립트 실행을 통한 트랜잭션 생성 : 어플리케이션의 특정 이벤트 스크립트 실행을 통해서 단일 실행 모듈로 구성된 트랜잭션 생성
      • 워크플로우 실행을 통한 트랜잭션 생성 : 워크플로우에 정의된 실행 모듈로 구성된 트랜잭션 생성
        • 실행 모듈의 실행 순서는 트랜잭션 생성 시점에 결정되지는 않으며 실행 요청이 이루어진 경우, 시작점으로 지정된 제어 모듈부터 순차적으로 실행이 이루어짐.
        • 트랜잭션의 종료는 더 이상 실행할 실행 모듈이 존재하지 않는 경우에 종료됨.
      • 라이프 사이클 실행을 통한 트랜잭션 생성 : Catalog Instance의 라이프 사이클 이벤트와 연계된 워크플로우 또는 이벤트 스크립트 실행
  • Runtime Context Environment : 제어 모듈의 실행에 따라서 생성되는 실행 단위(Transaction) 별로 할당되는 실행 환경에 대한 정보를 의미함.

    • RCE의 생성 : RCE는 Transaction이 생성될 때 생성이 되며, Transaction의 실행 주기 내내 해당하는 값이 유지됨.

      • Transaction이 Catalog Instance를 통해서 실행된 경우, 생성되는 RCE의 상태 정보는 Catalog Instance의 상태 정보를 통해서 초기화가 됨.
    • RCE의 삭제 : RCE는 Transaction이 종료될 때 삭제됨.

      • Transaction이 Catalog Instance를 통해서 실행된 경우, 최종 RCE의 상태 정보를 Catalog Instance의 상태 정보로 저장함.
    • RCE가 제공하는 함수 명세

      • void setVariable(String variable, Object value); 지정된 변수명으로 값을 설정합니다.

        설정된 값은 기본적으로 VariableScope은 Global로 저장이 됩니다.

      • void setVariable(String variable, Object value, VariableScope scope); 지정된 변수명으로 값을 저장합니다.

        변수가 지정되는 변수의 생명 주기(Variable Scope)을 지정할 수 있으며, 다음의 3가지로 구성이 됩니다.

        • Local : 현재 실행되고 있는 이벤트 스크립트에서만 사용되고 해당하는 스크립트의 실행이 끝나면 자동으로 삭제됩니다.
        • Transaction : 현재 실행되고 있는 이벤트 스크립트가 포함된 Transacction에서만 사용이 되고, 해당하는 Transaction이 종료되면 자동으로 삭제됩니다.
        • Global : 현재 Transaction이 실행되고 있는 카탈로그 인스턴스의 생명 주기와 동일하게 유지되고 카탈로그 인스턴스가 삭제되면 같이 삭제됩니다. 변수의 Scope을 지정하는 방식은 아래 예제와 같이 사용하면 됩니다.
        env.setVariable("var1", "value1", "Local");
        env.setVariable("var2", "value2", "Transaction");
        env.setVariable("var3", "value3", "Global");
        
      • Object getVariable(String variable)

      • Object getVariableScope(String variable, VariableScope scope);

      • RuntimeContextTransaction getTransaction();

        • String getResultType();
        • void setResultType(String mimeType);
        • byte[] getResult();
        • void setResult(byte[] result);
        • void setResult(String result);
  • 변수 : 제어 모듈에서 참조하는 값으로 제어 모듈의 실행 환경에 따라서 서비스나 어플리케이션을 정의하는 사용자(또는 개발자)에 의해서 정의되고 사용될 수 있습니다. 변수는 아래와 같이 3가지 유형으로 분류될 수 있습니다.

    • 변수 유형

      • 시스템 변수 : 시스템이 자동으로 생성하는 변수 입니다. 주로 시스템을 구성하는 자원과 소프트웨어 정보에 대해서 시스템이 자동으로 변수를 생성합니다.
      • 어플리케이션 변수 : 어플리케이션에 정의된 파라미터 값에 의해서 생성되는 변수 입니다. 어플리케이션에 포함된 실행 스크립트에 공통적으로 적용이 됩니다.
      • 실행 스크립트 변수 : 어플리케이션에 포함된 실행 스크립트 단위로 정의된 파라미터 값에 의해서 생성되는 변수입니다.
      • 사용자 변수 : 사용자가 지정하여 생성하는 변수 입니다. 사용자가 임의로 변수를 선언하고 해당하는 값을 설정할 수 있습니다.
    • 변수의 적용 순서

      1. 시스템 변수
      2. 어플리케이션 변수
      3. 어플리케이션 실행 스크립트 변수
      4. 사용자 변수
    • 변수의 Scope

      • 변수는 실행 단위(Transaction) 단위에서만 유효하면 Transaction이 종료되면 해당하는 변수는 삭제됩니다.
      • 카탈로그 인스턴스를 기반으로 실행되는 제어 모듈은 카탈로그 인스턴스의 생명 주기와 동일하게 존재하게 됩니다.
    • 변수 사용 방법

      • 변수 관리

        • 변수 선언은 시스템 변수, 어플리케이션 변수, 어플리케이션 실행 스크립트 변수의 경우에는 스크립트가 실행되는 경우 자동으로 설정이 됩니다.

          • 해당하는 변수가 이미 사용자 변수에 의해서 선언된 경우에는 변수를 선언하지 않고 시스템에 의해서 값이 변경되지 않습니다.
        • 사용자 변수 선언은 Runtime Context Environment에 의해서 선언할 수 있습니다.

          • Groovy Script에서 변수 관리 : RCE(Runtime Context Environment)의 내부 지정 키워드인 env를 통해서 변수를 관리할 수 있습니다.

            • 변수 선언 및 업데이트

              env.putVariable("a_new_variable", "new_variable_value");
              
            • 변수 삭제

              env.remove("a_existing_variable");
              
            • 변수 참조

              def variable = env.getVariable("a_existing_variable");
              
          • Shell Script에서 변수 관리 : Shell Script 내부에서 특정 Keyword를 사용해서 변수를 관리할 수 있습니다.

            • 변수 선언 및 업데이트

              echo "_{Variable}_=a_new_variable";
              echo "a_new_variable=${instance_privateIp}"; 
              
            • 변수 삭제

              echo "_{Variable}_=a_new_variable";
              echo "a_new_variable="; 
              
            • 변수 참조

              echo "${a_new_variable}";
              
      • 변수 활용 : 변수는 각 실행 스크립트별로 사용할 수 있는 다양한 방법을 지원하고 있습니다.

        • 콜백 알림(Notification) : 콜백 알림 타입의 경우에는 실행하는 Groovy 스크립트 내부에서 다음과 같이 사용할 수 있습니다.

          def variable = env.getVariable("a_existing_variable");
          
        • REST 기반 API(RESTful API) : RESTful API 타입으로 사용하는 경우에는 다음의 3가지 방법으로 활용할 수 있습니다.

          • Request URL에서 사용하는 방법

            https://serengeti.aifrica.co.kr/collect/run/{변수명}/utter
            

            호출하고자 하는 RESTful API에 “{변수명}”이 포함된 경우, 해당하는 변수가 선언되어져 있으면 해당하는 값이 자동으로 변수 값으로 대체됩니다.

          • Request Body에서 사용하는 방법

            {
              "host":"628",
              "session":"test_0001",
              "data": {
                  "utter": "{sttText}"
              },
              "lang": "1"
            }
            

            Request Body에 설정된 필드는 자동으로 변수로 인식이 되며, 각 필드명에 해당하는 변수 값이 선언되어져 있는 경우에는 해당하는 필드의 값이 선언된 변수 값으로 대체됩니다. 필드 값이 Object 타입의 내부에 있는 경우(위의 예시에서 utter 필드의 경우)에는 Object의 Field 명에 ‘.’ 를 추가하여 data.utter의 형태로 변수명을 지정하여 사용할 수 있습니다.
            또한 필드 값에 “{변수명}” 으로 선언된 경우, 자동으로 선언된 변수 명에 해당하는 값으로 Body의 값이 대체됩니다.

          • 변수 값 지정을 통한 활용 방법 변수 지정을 통한 설정 예시

            생성된 변수 값의 변수Id(변수 Id가 없는 경우 변수명)에 해당하는 변수 값이 자동으로 생성된 변수 값으로 대체됩니다.

          • Groovy 스크립트 내부에서 활용

            def variable = env.getVariable("a_existing_variable");
            
        • 실행 스크립트(Shell Script)

          • Shell Script 내부에서 사용하는 변수는 환경 변수를 통해서 제공이 됩니다. 따라서 설정된 변수를 사용하기 위해서는 Shell Script가 지원하는 환경 변수 이용 가이드에 따라서 사용하면 됩니다.

            echo "${a_new_variable}";
            
          • 사용하는 변수가 Array 형태인 경우에는 내부적으로 다음과 같은 규칙에 의해서 변수를 사용할 수 있도록 치환이 되어서 환경 변수로 제공이 됩니다.

            • Bash Shell 기준(변수명 : app_artifact)

              • Array의 크기 : app_artifact_count

              • 각 Array에 선언된 필드 값 조회

                artifact_file_name="app_artifact_${index}_name"
                artifact_file_name="${!artifact_file_name}"
                echo "${artifact_file_name}
                
              • 각 Array에 선언된 필드 값이 없는 경우

                artifact_file_name="app_artifact_${index}"
                artifact_file_name="${!artifact_file_name}"
                echo "${artifact_file_name}
                
            • Bourne Shell 기준(변수명 : app_artifact)

              • Array의 크기 : app_artifact_count

              • 각 Array에 선언된 필드 값 조회

                artifact_file_name=$(eval "echo \$app_artifact_${index}_name")
                echo "${artifact_file_name}
                
              • 각 Array에 선언된 필드 값이 없는 경우

                artifact_file_name=$(eval "echo \$app_artifact_${index}")
                echo "${artifact_file_name}
                
        • 지정 명령어(MMC)

          • 명령어 실행 줄의 변수 값 지정

            ls -al {currentDirectory}
            

            실행 명령어에 “{변수명}” 형태의 값이 있는 경우, 변수명으로 선언된 변수의 값을 대체하여 추가합니다.

          • 변수 값 지정을 통한 활용 방법 변수 지정을 통한 설정 예시

            생성된 변수 값의 변수Id(변수 Id가 없는 경우 변수명)에 해당하는 변수 값이 자동으로 생성된 변수 값으로 대체됩니다.

    • 자세한 내용은 실행 스크립트 설정 부분을 참고하시면 되겠습니다.

  • Transaction 실행에 따른 결과값 처리

    • Transaction이 실행되어 각각의 어플리케이션에 속한 이벤트 스크립트가 실행이 되면, 앞에서 설명한 것과 같이 RCE(Runtime Context Environment) 변수를 통해서 시스템에 등록된 변수를 참조할 수 있습니다.

    • 실행중인 결과값을 설정하는 기능은 이벤트 스크립트 내부에서 다음과 같은 방법으로 설정이 가능합니다.

      • 사용 예시

        env.getTransaction().setResult(...);
        

        RCE의 시스템 변수인 env를 통해서 Transaction 정보를 가져오고 Transaction에 결과를 설정할 수 있습니다. 설정된 결과는 결과로 저장되거나 동기 방식으로 실행되는 경우, 요청한 클라이언트 프로그램에 응답의 Body로 전달이 됩니다.