[AWS] App2Container를 사용한 애플리케이션 컨테이너화하기

2025. 1. 13. 11:25AWS/AWS_Service

반응형

안녕하세요, 달콤한달팽이입니다.🐌🫡

 

최근 다양한 기업에서 앱 최신화(Application Modernization)을 원하는 경우가 있습니다.

 

다양한 방향이 있겠지만, 가장 먼저 생각난 방식은 컨테이너를 사용한 MSA 환경의 도입이 그 중 하나였습니다.

 

그래서 오늘은 AWS CLI 툴을 사용하여 애플리케이션을 컨테이너화 하는 방법에 대해 알아보겠습니다.


App2Container란?

App2Container(A2C)란, 애플리케이션을 컨테이너화된 애플리케이션으로 현대화하는 CLI 도구를 의미합니다.

 

이를 사용하여 온프레미스 혹은 가상 머신(EC2)에서 실행되는 애플리케이션을 AWS ECS, EKS 등의 컨테이너 환경으로 쉽게 마이그레이션할 수 있습니다.

 

사전 준비사항

이번 실습을 위해 필요한 사전 준비사항은 아래와 같습니다.

 

 1) 애플리케이션이 설치되어 있는 서버: 애플리케이션을 컨테이너화할 서버가 필요해요. 이번 실습에서는 JAVA를 사용했어요.

 2) 최소 20GB의 스토리지 보유: App2Container이 동작하기 위한 최소 스토리지(20GB)를 보유해주세요.

 3) tar와 Docker 설치: App2Container 압축 파일을 해제하고, 컨테이너화를 위한 Docker를 설치해주세요.

 4) AWS CLI 설치: App2Container 관련 CLI 사용을 위해 AWS CLI를 설치해주세요.

 

마지막으로 OS와 프레임워크 관련 호환성도 있지만, 이는 공식홈페이지에서 확인해주세요!

 

이제 본격적으로 애플리케이션을 컨테이너화 하는 방법에 대해 알아보겠습니다.


1) 애플리케이션 확인

우선 현재 서버에 떠있는 자바 기반 애플리케이션 목록을 확인해보도록 합시다.

(저는 테스트용 자바(HelloWorld_cp, HelloWorld1)을 가동해두었습니다. )

$ ps -ef | grep java

 

혹시나 테스트용 코드를 구하지 못하셨다면 아래 접힌글의 코드를 참고해주세요!

더보기

import cohttp://m.sun.net.httpserver.HttpServer;
import cohttp://m.sun.net.httpserver.HttpHandler;
import cohttp://m.sun.net.httpserver.HttpExchange;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class HelloWorld_cp {
    public static void main(String[] args) {
        try {
            // HTTP 서버를 8080 포트에서 시작
            HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
            server.createContext("/", new HelloHandler());
            server.setExecutor(null); // 기본 Executor 사용
            server.start();
            System.out.println("Server started on port 8080");

            // 무한 루프를 돌며 "Hello, World!" 출력
            while (true) {
                System.out.println("Hello, World!");
                Thread.sleep(2000); // 2초 대기
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    // HTTP 요청을 처리하는 핸들러
    static class HelloHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            String response = "Hello, World!";
            exchange.sendResponseHeaders(200, response.length());
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

 

저는 이번 실습에서 HelloWorld1 애플리케이션을 컨테이너화 시켜보도록 하겠습니다.

 

2) App2Container 설치

이제 애플리케이션 컨테이너화를 위해 사용될 App2Container를 설치해보도록 하겠습니다.

 

원하는 경로에 App2Container 설치해주세요!

$ mkdir app2con
$ cd app2con
$ curl -o AWSApp2Container-installer-linux.tar.gz https://app2container-release-us-east-1.s3.us-east-1.amazonaws.com/latest/linux/AWSApp2Container-installer-linux.tar.gz
$ ll

 

다운로드 받은 App2Container를 압축해제주도록 합시다.

$ tar xvf AWSApp2Container-installer-linux.tar.gz

 

이제 App2Container 사용이 가능하도록 설치 스크립트를 실행해주세요.

$ ./install.sh

 

이제 App2Container 사용을 위한 준비가 마무리되었습니다.

 

3) App2Container 초기화

App2Container 사용을 위해선 초기화 작업이 필요합니다.

초기화 작업을 통해 결과물(아티팩트)이 어디에 저장될지, 메트릭을 어디까지 사용할지 등을 정해줄 수 있습니다.

$ app2container init

--- 초기화 질문 ---
1. 아티팩트 생성 경로 지정 : /root/app2con/artifact
2. EC2 권한 지정 : y
3. 수행 리전 지정 : ap-northeast-2
4. S3에 아티팩트 저장 여부 : 
5. AWS에서 메트릭 사용 여부 : y
6. 내부 오류 시 로그와 아티팩트 자동 업로드 여부 : y
7. 도커 컨텐츠 신뢰를 사용한 이미지 서명 여부 : n

 

4) 애플리케이션 분석

이제 App2Container를 사용하여,

현재 실행 중인 애플리케이션에 대한 인벤토리를 작성하고 분석하는 과정을 수행해보도록 하겠습니다.

 

아래 명령어를 사용해 현재 실행 중인 Java 애플리케이션을 나열해주세요.

$ app2container inventory

 

이제 애플리케이션 ID를 사용하여 애플리케이션을 분석해보겠습니다.

 

Next Steps를 확인해보면, 다음과 같습니다.

 1) 분석 결과는 지정 경로에 json파일로 저장된다.

 2) 필요에 따라 분석 파일을 수정해도 된다.

 3) 주어진 명령어를 수행하여 해당 애플리케이션을 컨테이너화 시킬 수 있다.

$ app2container analyze --application-id java-generic-dec71651

 

1번 과정에서 애플리케이션 분석 결과의 경로가 나오는데, 해당 경로로 이동해보면 analysis.json 파일이 생긴 것을 확인 가능합니다.

$ cd /root/app2con/artifact/java-generic-dec71651/
$ ll

 

5) 애플리케이션 컨테이너화

이제 분석 결과를 토대로 애플리케이션을 컨테이너화 시켜보도록 하겠습니다.

$ app2container containerize --application-id java-generic-dec71651

 

만약 에러가 발생한다면 아래 접힌 글을 참고해주세요!

더보기

보통의 에러는 에러가 발생하는 원인이 기입되어 있습니다.

이번 에러의 경우, 도커가 설치되어있지 않아 발생한다고 하네요!

 

docker를 설치하고 실행시키면 다시 정상적으로 수행될 거예요.

 

해당 과정을 마쳤다면 서버내 docker에 컨테이너화된 이미지가 저장되어 있음을 확인할 수 있습니다.

$ docker images

 

6) 애플리케이션 배포

이제 마지막으로 컨테이너화 된 이미지를 배포해보도록 하겠습니다.

 

App2Container에서 제공하는 명령어가 존재하지만, init 수행 시 S3 버킷을 지정하지 않았던 저는 아래와 같은 에러가 발생했습니다.

$ app2container generate app-deployment --application-id java-generic-dec71651

 

App2Container를 다시 초기화하고 해당 명령어를 재수행하게 될 경우, java-app-id로 ECR 레포지토리가 신규생성되게 됩니다.

(ECR 레포지토리 이름이 자동으로 지정되는 단점이 있으나 편해요!)

 

이제 기존과 동일하게 컨테이너 이미지를 ECR에 푸시한 후 해당 이미지를 ECR, EKS 등에 사용하시면 완료입니다!

 

번외) 신규 ECR 레포지토리 자동생성

신규 ECR 레포지토리가 생성되어도 무관한 경우, 다시 app2container를 초기화하고 아래 명령어를 수행해주세요!

(초기화는 기존 내용과 모두 동일하지만 2번 질문에 S3 버킷명만 추가했습니다.)

$ app2container generate app-deployment --application-id java-generic-dec71651

 

이후 ECR을 확인하면 java-app-id로 ECR 레포지토리가 신규생성되고 이미지 하나가 등록되어있음을 확인할 수 있습니다.

 

이와 동일하게 S3 버킷에도 java-app-id로 객체가 생겨있는 것을 확인할 수 있습니다.

 

지금까지 App2Container를 활용하여 애플리케이션을 컨테이너화하고, 이를 ECR에 푸시하는 방법까지 알아보았습니다.


A2C를 사용해보니 생각보다 간단하다는 생각도 들었지만,

사용을 위한 제약사항도 꽤나 있고 결과물로 생긴 컨테이너 이미지의 크기가 생각보다 크다는 단점도 있었습니다.

 

다만, 온프레미스 또는 가상 환경에 WEB/WAS/DB가 모두 뒤섞여 있어 분리하기 어려운 상황이라면

초기 컨테이너화에 대한 가이드를 제시하는 방향으로 사용하면 좋을 것 같습니다.

 

감사합니다!

반응형