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

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

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는 다음과 같은 작업을 순차적으로 수행합니다.

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

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

bookmark

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

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

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

Workshop 테스트

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:

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:

NON-EDITABLE 섹션:

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

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

Notion Image
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

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

"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