AWS App2Container를 사용하여 손쉽게 ECS로 전환하는 방법

App2Container는 온프레미스, AWS EC2 또는 다른 클라우드에서 코드 변경 없이 기존 애플리케이션을 컨테이너화하는 도구입니다.

AWS App2Container를 사용하여 손쉽게 ECS로 전환하는 방법
Photo by frank mckenna / Unsplash

AWS App2Container 소개

온프레미스, Amazon Elastic Compute Cloud(EC2) 또는 다른 클라우드에서 코드 변경 없이 기존 애플리케이션을 컨테이너화하여 실행하는 데 도움이 되는 새로운 명령줄 도구입니다.

App2Container는 서버에서 실행되는 애플리케이션을 검색하고, 종속성을 식별하고, 관련 아티팩트를 생성하여 Amazon ECS와 Amazon EKS에 원활하게 배포합니다. 또한, AWS CodeBuild 및 AWS CodeDeploy와의 통합을 제공하여 컨테이너화된 애플리케이션의 구축과 배포를 반복할 수 있도록 지원합니다.

작동 방식

App2Container를 사용하면 Open Containers Initiative(OCI)와 호환되는 Windows 또는 Linux 서버에서 실행되는 하나 이상의 애플리케이션에 대한 컨테이너 이미지를 생성할 수 있습니다. 여기에는 상용 기성품 애플리케이션(COT)이 포함됩니다. App2Container는 애플리케이션이 컨테이너화하기 위해 소스 코드가 필요하지 않습니다.

a2c는 다음과 같은 작업을 순차적으로 수행합니다.

  • 컨테이너화 후보인 실행 중인 모든 ASP.NET(Windows) 및 Java 애플리케이션(Linux)을 식별하는 애플리케이션 서버의 인벤토리 목록을 만듭니다.
  • 협력 프로세스 및 네트워크 포트 종속성을 포함하여 실행 중인 지원 애플리케이션의 런타임 종속성을 분석합니다.
  • 컨테이너화를 위해 애플리케이션 아티팩트를 추출하고 Dockerfile을 생성합니다.
  • 애플리케이션 컨테이너에 대한 빌드를 시작합니다.
  • AWS 아티팩트를 생성하고 선택적으로 Amazon ECS, Amazon EKS 또는 AWS App Runner에 컨테이너를 배포합니다. 예를 들어:
    • Amazon ECS, Amazon EKS 또는 AWS App Runner를 사용하여 컨테이너를 배포하는 데 필요한 컴퓨팅, 네트워크 및 보안 인프라를 구성하는 CloudFormation 템플릿입니다.
    • 다양한 AWS 서비스와 통합하여 애플리케이션의 보안 및 확장성을 위한 모범 사례를 통합한 Amazon ECR 컨테이너 이미지, Amazon ECS 작업 정의 또는 Amazon EKS나 AWS App Runner용 AWS CloudFormation 템플릿입니다.
    • 직접 배포하는 경우 App2Container는 AWS CloudFormation 리소스를 Amazon S3 버킷에 업로드하고 CloudFormation 스택을 생성할 수 있습니다.
  • 선택적으로 AWS CodePipeline 및 관련 서비스를 사용하여 CI/CD 파이프라인을 생성하여 애플리케이션 컨테이너의 빌드와 배포를 자동화합니다.

App2Container를 초기화할 때 AWS 자격 증명을 제공해야합니다. 이를 통해 App2Container는 다음을 수행할 수 있습니다.

  • Amazon S3에 아티팩트를 저장합니다(해당 작업을 수행하도록 구성한 경우).
  • Amazon ECS, Amazon EKS, AWS App Runner와 같은 AWS 서비스를 사용하여 애플리케이션 컨테이너를 만들고 배포합니다.
  • AWS CodePipeline을 사용하여 CI/CD 파이프라인을 만듭니다.

파이프라인의 자세한 과정은 아래 링크를 통해 참조해주세요

bookmark

a2c를 실행하는 것 자체는 추가 비용 없이 사용할 수 있습니다.Amazon ECR, Amazon ECS, Amazon EKS, AWS App Runner와 같은 다른 AWS 서비스를 사용하여 컨테이너화된 애플리케이션을 실행하는 경우에만 요금이 청구되는 구조입니다.

리눅스의 경우 현재는 AWS App2Container는 EC2의 ECS에 컨테이너화된 Java 애플리케이션을 배포하는 것을 지원하지 않으며 , Fargate만 허용되며, EKS의 경우엔 EC2 전용에서만 구성 가능합니다.

지원되는 배포 서비스의 자세한 내용은 아래 배포 기능을 참고하세요.

Workshop 테스트

  • CloudFormation으로 구축하였습니다
    • 기존 리소스와 충돌하는 것들을 제거

1) install & iniitalize a2c

  1. 생성된 Source-Java-Webserver 에 SSM으로 접근합니다.

인스턴스에 해당된 권한이 정상적으로 등록되어있는지 확인해볼 수 있습니다.

aws sts get-caller-identity

{
    "UserId": "AROA3BSYMHUR2KRUQ4SAN:i-094c9889dc6950f0e",
    "Account": "123123123",
    "Arn": "arn:aws:sts::123123123:assumed-role/bjchoi-a2c-workshop01-EC2InstanceRole-bEIIY0U8Cde6/i-094c9889dc6950f0e"
}
  1. Linux for App2Container 설치합니다
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
tar xvf AWSApp2Container-installer-linux.tar.gz
./install.sh
app2container help

  1. app2container 초기화

App2Container를 실행하기 위한 일회성 초기화 작업을 수행해야 합니다. init 대화형 명령어는 로컬 App2Container 환경을 설정하는 데 필요한 정보를 묻는 프롬프트를 표시합니다.

먼저, App2Container가 컨테이너화 과정에서 결과물을 저장할 수 있는 Amazon S3 버킷을 생성해야 합니다. 테스트를 위해 bjchoi-a2c-test-0220 테스트 버킷을 생성하였습니다.

App2Container 초기화 설정 Parameter 및 Value:

  • Workspace directory path (작업 공간 디렉토리 경로):
    • 기본값 유지 (기본값: /root/app2container)
      • App2Container가 컨테이너화 과정에서 결과물을 저장할 로컬 디렉토리입니다.
  • Use AWS EC2 Instance profile (AWS EC2 인스턴스 프로필 사용 여부):
    • 예 (Yes) 유지
      • EC2 인스턴스 프로파일을 사용할지 여부입니다.
  • Which AWS Region to use? (사용할 AWS 리전):
    • 기본값 유지
      • 사용할 AWS 리전을 설정합니다.
  • Amazon S3 bucket (Amazon S3 버킷):
    • 이전 단계에서 생성한 Amazon S3 버킷 이름 입력 (예: app2container-sd-jan-29)
      • 컨테이너화 과정의 결과물을 저장할 Amazon S3 버킷 이름입니다.
  • Permission to collect usage metrics (사용량 지표 수집 권한):
    • 기본값 유지
      • App2Container가 호스트 운영 체제, 애플리케이션 유형, 실행한 App2Container 명령어에 대한 정보를 수집하도록 허용할지 여부입니다.
  • Permission to Automatically upload logs and App2Container generated artifacts on crashes and internal errors (크래시 및 내부 오류 발생 시 로그 및 App2Container 생성 결과물 자동 업로드 권한):
    • 기본값 유지
      • 크래시 및 내부 오류 발생 시 로그 및 결과물을 자동으로 업로드하도록 허용할지 여부입니다.
  • Whether to enforce signed images (서명된 이미지 강제 적용 여부):
    • 기본값 유지
      • Docker Content Trust (DCT)를 사용하여 이미지를 서명하도록 요구할지 여부입니다.

2) Discover & Analyze

서버에서 실행 중인 애플리케이션 목록을 표시하려면 다음 명령을 실행합니다.

app2container inventory

{
    "java-tomcat-637f7918": {
                    "processId": 5209,                                
                    "cmdline": "/usr/lib/jvm/java-11-openjdk-amd64/bin/java ... -Dcatalina.home=/opt/tomcat/latest -Djava.io.tmpdir=/opt/tomcat/latest/temp org.apache.catalina.startup.Bootstrap start ",
                    "applicationType": "java-tomcat",
                    "webApp": "ROOT"
    }
}

java-tomcat-637f7918는 Java 애플리케이션 ID로 사용됩니다. 다음 단계에서 사용할 수 있도록 애플리케이션 ID를 메모장에 복사가 필요합니다.

{
  "java-tomcat-637f7918": {
    "processId": 5209,
    "cmdline": "/usr/lib/jvm/java-11-openjdk-amd64/bin/java ... -Dcatalina.home=/opt/tomcat/latest -Djava.io.tmpdir=/opt/tomcat/latest/temp org.apache.catalina.startup.Bootstrap start ",
    "applicationType": "java-tomcat",
    "webApp": "ROOT"
  }
}

분석을 실행합니다.

app2container analyze --application-id <java-app-id>

분석 결과가 /root/app2container/java-tomcat-637f7918/analysis.json 에 저장된 것을 확인할 수 있습니다.

✔ Created artifacts folder /root/app2container/java-tomcat-637f7918
✔ Generated analysis data in /root/app2container/java-tomcat-637f7918/analysis.json
👍 Analysis successful for application java-tomcat-637f7918

💡 Next Steps:
1. View the application analysis file at /root/app2container/java-tomcat-637f7918/analysis.json.
2. Edit the application analysis file as needed.
3. Start the containerization process using this command: app2container containerize --application-id java-tomcat-637f7918

확인한 분석 파일은 설정 파일로 사용되며 해당 값을 바꿔 적용이 가능합니다.

EDITABLE:

  • containerParameters 섹션을 포함하며, 여기에서 containerBaseImage 또는 imageTag와 같은 원하는 설정을 지정할 수 있습니다.
  • 이러한 매개변수는 나중에 컨테이너화 과정에서 사용됩니다.

NON-EDITABLE 섹션:

  • OS 데이터, 사용 중인 포트, 종속성, 소프트웨어 라이브러리 등과 같은 애플리케이션 수준의 분석 정보를 포함하며, app2container는 컨테이너화 중에 이 정보를 사용합니다.

3) 실행 중인 애플리케이션 컨테이너화

ECS 배포를 위해 containerize 명령을 실행합니다.

containerize 프로세스는 몇 분 정도 걸리며 App2Container는 모든 AWS 배포 관련 구성을 포함하는 docker 파일과 deployment.json 파일을 생성합니다. App2Container는 또한 컨테이너를 사전 검증하여 예상대로 작동하는지 확인하는 역할을 수행합니다.

app2container containerize --application-id <java-app-id>
docker images

image가 확인되면 docker run 명령어를 통해 정상적으로 실행 가능한지 확인할 수 있습니다.

정상적으로 실행되는 것을 확인하였다면 deployment.json을 확인하여 실행할 수 있습니다.

cat ./app2container/<java-deployment-id>/deployment.json

해당 deployment.json으로 확인해야할 것은 vpcId입니다. 현재 구성에서 공백으로 지정되어있으며 해당 vpcId를 설정하여 배포를 진행할 수 있습니다. deployment.json 파일에서 VPC-ID를 업데이트하지 않으면 app2container가 애플리케이션을 기본 VPC에 배포합니다.

"ecsParameters": {
      "createEcsArtifacts": true,
      "ecsFamily": "java-tomcat-637f7918",
      "cpu": 2,
      "memory": 4096,
      "dockerSecurityOption": "",
      "publicApp": true,
      "stackName": "a2c-java-tomcat-637f7918-ECS",
      "resourceTags": [
             {
                    "key": "example-key",
                    "value": "example-value"
             }
      ],
      "reuseResources": {

"vpcId": "",

             "reuseExistingA2cStack": {
                    "cfnStackName": "",
                    "microserviceUrlPath": ""
             },
             "sshKeyPairName": "",
             "acmCertificateArn": ""
      },
      "gMSAParameters": {
             "domainSecretsArn": "",
             "domainDNSName": "",
             "domainNetBIOSName": "",
             "createGMSA": false,
             "gMSAName": ""
      },

      "deployTarget": "FARGATE",

      "dependentApps": []
},
"fireLensParameters": {
      "enableFireLensLogging": true,
      "logDestinations": [
             {
                    "service": "cloudwatch",
                    "regexFilter": "^.*.$",
                    "streamName": "All-Logs"
             }
      ]
},

4) 배포 아티팩트 생성하기

Amazon ECS를 사용하기 위해 Amazon Elastic Container Register(Amazon ECR)에 애플리케이션 컨테이너를 배포합니다.

app2container generate app-deployment --application-id <java-app-id>
💡 You're all set to use AWS CloudFormation to manage your application stack.

Next Steps:
1. Edit the CloudFormation template as necessary.
2. Create an application stack using the AWS CLI or the AWS Console. AWS CLI command:

        aws cloudformation deploy --template-file /root/app2container/java-tomcat-637f7918/EcsDeployment/ecs-master.yml --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND --stack-name a2c-java-tomcat-637f7918-ECS


3. Set up a pipeline for your application stack using app2container:

        app2container generate pipeline --application-id java-tomcat-637f7918

해당 과정에서는 다음과 같은 과정을 수행합니다.

  • Amazon ECR 저장소를 만들고 사용자가 만든 애플리케이션 컨테이너 이미지를 거기에 복사합니다.
  • AWS 콘솔에 로그인하고 Elastic Container Service(ECS) 서비스로 이동하여 이를 확인하세요.
  • 왼쪽 창에서 "Amazon ECR"을 클릭합니다.
  • "개인 레지스트리"를 선택하세요
  • 컨테이너가 자동으로 이 ECR 저장소에 등록되어있는 것을 확인할 수 있습니다.
Notion Image
  • analysis.json 파일에서 이 태그와 다른 컨테이너 매개변수를 업데이트할 수 있습니다.
cat /root/app2container/<java-app-id>/EcsDeployment/ecs-master.yml

App2Container는 사용자 환경을 검토하고 이전 단계에서 정의된 구성, 애플리케이션 분석 결과를 반영하여 CloudFormation 템플릿을 업데이트합니다. CloudFormation 템플릿은 필요한 모든 리소스와 종속성을 설명하여 스택으로 함께 시작하고 구성할 수 있도록 합니다.

웹 서버에서 app2container generate app-deployment 명령 출력의 ecs-master.yml 파일 위치를 찾아서 파일을 엽니다.

5) ECS에 배포하기

이미지는 정상적으로 ECR에 배포되었고, ECS 배포하기 위한 CloudFormation은 정상적으로 로컬에서 생성되었습니다. 이제 해당 패키지를 사용하여 배포를 수행합니다.

app2container generate app-deployment --application-id <java-app-id> --deploy

작업이 실행되는 것을 확인합니다.

Notion Image

6) CI/CD를 위한 파이프라인 생성하기

/root/app2container/java-tomcat-637f7918/pipeline.json

이후 저장소와 연동하여 파이프라인을 구성할 수 있습니다.

  • GitRepo, ECS Cluster
"sourceInfo": {
        "CodeCommit": {
                "enabled": true,
                "repositoryName": "a2c-java-tomcat-637f7918-ecs",
                "branch": "main"
        },
        "ExistingGitRepo": {
                "enabled": false,
                "repositoryUri": "",
                "branch": "",
                "sshKeyArn": ""
        },
        "AzureRepo": {
                "enabled": false,
                "repositoryName": "a2c-java-tomcat-637f7918",
                "branch": "main"
        }
},

Reference