Amazon Web Services 한국 블로그
AWS App2Container – Java 및 .NET 애플리케이션을 위한 컨테이너화 도구 출시
컨테이너와 서버리스 기술로 새 애플리케이션을 개발하는 고객이 점점 늘어나고 있고, 이들은 최신 지속적 통합 및 전달(CI/CD) 도구를 사용하여 소프트웨어 전달 수명 주기를 자동화하고 있습니다. 또한, 수작업이나 기존 시스템을 사용하여 개발하고 관리하는 기존 애플리케이션도 다수 보유 중입니다. 이러한 두 종류의 애플리케이션은 별도의 도구로 관리하기 때문에 운영 오버헤드가 증가하고, 새로운 비즈니스 기능을 제공하는 속도가 둔화됩니다. 저희 고객들은 기존 애플리케이션과 새 애플리케이션 모두에서 관리 도구와 CI/CD 프로세스를 가능한 한 표준화하기를 바랍니다. 그 목표를 달성하기 위한 첫 단계로 기존 애플리케이션을 컨테이너에 패키징하는 옵션을 눈여겨보고 있습니다.
그러나, 기존 애플리케이션을 컨테이너화하려면 애플리케이션 종속성 확인, dockerfiles
작성, 각 애플리케이션의 구축 및 배포 프로세스 설정 등과 같이 수많은 수작업이 필요합니다. 이런 수작업은 시간이 오래 걸리고 오류가 발생하기 쉬우며, 현대화 작업을 둔화시킬 수 있습니다.
AWS에서는 AWS App2Container를 오늘 출시했습니다. 이는 온프레미스, Amazon Elastic Compute Cloud(EC2) 또는 다른 클라우드에서 코드 변경 없이 기존 애플리케이션을 컨테이너화하여 실행하는 데 도움이 되는 새로운 명령줄 도구입니다. App2Container는 서버에서 실행되는 애플리케이션을 검색하고, 종속성을 식별하고, 관련 아티팩트를 생성하여 Amazon ECS와 Amazon EKS에 원활하게 배포합니다. 또한, AWS CodeBuild 및 AWS CodeDeploy와의 통합을 제공하여 컨테이너화된 애플리케이션의 구축과 배포를 반복할 수 있도록 지원합니다.
AWS App2Container는 각 애플리케이션 구성 요소에 아티팩트를 생성합니다. 예를 들어 애플리케이션 파일/폴더와 같은 애플리케이션 아티팩트, Dockerfiles, Amazon Elastic Container Registry(ECR)의 컨테이너 이미지, ECS 작업 정의, Kubernetes 배포 YAML, 애플리케이션을 Amazon ECS 또는 EKS에 배포하기 위한 CloudFormation 템플릿, AWS Codepipeline에서 빌드/출시 파이프라인을 설정하기 위한 템플릿(AWS CodeBuild 및 CodeDeploy도 활용) 등이 있습니다.
오늘부터 App2Container를 사용하여 Windows의 IIS 7.5+에서 실행되는 ASP.NET(.NET 3.5+) 웹 애플리케이션과 Linux에서 실행되는 Java 애플리케이션(독립형 JBoss, Apache Tomcat), 일반 Java 애플리케이션(예: Spring Boot, IBM WebSphere, Oracle WebLogic 등)을 컨테이너화할 수 있습니다.
컨테이너를 사용하여 기존 애플리케이션을 현대화하면 이동이 가능해지고 개발 민첩성이 향상되며 CI/CD 프로세스가 표준화되고 운영 비용이 절감됩니다. 이제 작동 방식을 살펴보도록 하겠습니다!
AWS App2Container – 시작하기
AWS App2Container는 애플리케이션을 호스팅하는 서버에 AWS 명령줄 인터페이스(CLI) 1.14버전 이상, Docker 도구, (ASP.NET의 경우) Windows에서 실행되는 애플리케이션용 Powershell 5.0+를 미리 설치해야 합니다. 또한, App2Container가 AWS 서비스와 상호작용하는 데 적절한 IAM 권한도 필요합니다.
기존 Java 애플리케이션을 컨테이너화하는 방법을 예로 들어 보겠습니다. App2Container CLI for Linux는 tar.gz
아카이브로 패키징됩니다. 이 파일은 사용자에게 대화형 셸 스크립트인 install.sh
를 제공해 App2Container CLI를 설치합니다. 스크립트를 실행하면 설치 단계 안내가 표시되고, App2Container CLI 명령을 포함하도록 사용자 경로를 업데이트합니다.
먼저 App2Container CLI가 설치된 서버를 init
명령으로 한 번 초기화합니다.
$ sudo app2container init
Workspace directory path for artifacts[default: /home/ubuntu/app2container/ws]:
AWS Profile (configured using 'aws configure --profile')[default: default]:
Optional S3 bucket for application artifacts (Optional)[default: none]:
Report usage metrics to AWS? (Y/N)[default: y]:
Require images to be signed using Docker Content Trust (DCT)? (Y/N)[default: n]:
Configuration saved
이제 Workspace가 애플리케이션 컨테이너화 아티팩트를 저장하도록 설정됩니다(가용 디스크 공간 20GB 이상). AWS 서비스를 사용하도록 구성된 AWS 프로필을 사용하여 Amazon Simple Storage Service(S3) 버킷으로 해당 아티팩트를 내보낼 수 있습니다.
다음으로, inventory
명령을 사용하여 애플리케이션 서버에서 실행되는 Java 프로세스를 확인합니다. 각 Java 애플리케이션 프로세스에는 고유한 식별자, 즉 애플리케이션 ID(예: java-tomcat-9e8e4799
)가 있습니다. 이 ID를 사용하여 다른 App2Container CLI 명령으로 애플리케이션을 참조할 수 있습니다.
$ sudo app2container inventory
{
"java-jboss-5bbe0bec": {
"processId": 27366,
"cmdline": "java ... /home/ubuntu/wildfly-10.1.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/home/ubuntu/wildfly-10.1.0.Final -Djboss.server.base.dir=/home/ubuntu/wildfly-10.1.0.Final/standalone ",
"applicationType": "java-jboss"
},
"java-tomcat-9e8e4799": {
"processId": 2537,
"cmdline": "/usr/bin/java ... -Dcatalina.home=/home/ubuntu/tomee/apache-tomee-plume-7.1.1 -Djava.io.tmpdir=/home/ubuntu/tomee/apache-tomee-plume-7.1.1/temp org.apache.catalina.startup.Bootstrap start ",
"applicationType": "java-tomcat"
}
}
IIS 7.0버전 이상이 설치된 Windows Servers의 관리자 권한으로 실행된 PowerShell 세션에서 ASP.NET 애플리케이션을 초기화할 수도 있습니다. Docker 도구와 컨테이너 지원은 Windows Server 2016 이상 버전에서 제공됩니다. Docker 도구를 설치한 애플리케이션 서버에서 모든 app2container 작업을 실행하거나 Amazon ECS-optimized Windows Server AMI를 사용하여 Docker 도구가 있는 워커 머신을 사용할 수도 있습니다.
PS> app2container inventory
{
"iis-smarts-51d2dbf8": {
"siteName": "nopCommerce39",
"bindings": "http/*:90:",
"applicationType": "iis"
}
}
inventory
명령을 실행하면 애플리케이션 서버에서 컨테이너화할 수 있는 모든 IIS 웹 사이트가 표시됩니다. 각 IIS 웹 사이트 프로세스에는 고유한 식별자, 즉 애플리케이션 ID(예: iis-smarts-51d2dbf8
)가 있습니다. 이 ID를 사용하여 다른 App2Container CLI 명령으로 애플리케이션을 참조할 수 있습니다.
애플리케이션 ID를 참조하여 특정 애플리케이션을 선택하고 analyze
명령으로 애플리케이션의 분석 보고서를 생성할 수 있습니다.
$ sudo app2container analyze --application-id java-tomcat-9e8e4799
Created artifacts folder /home/ubuntu/app2container/ws/java-tomcat-9e8e4799
Generated analysis data in /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/analysis.json
Analysis successful for application java-tomcat-9e8e4799
Please examine the same, make appropriate edits and initiate containerization using "app2container containerize --application-id java-tomcat-9e8e4799"
애플리케이션 분석에서 생성된 analysis.json
템플릿을 사용하여 분석된 애플리케이션에 대한 정보를 수집하여 analysisInfo
섹션에서 모든 시스템 종속성을 식별할 수 있고, containerParameters
섹션을 사용하여 애플리케이션에 대해 생성된 컨테이너 이미지를 맞춤 설정하도록 컨테이너화 매개변수를 업데이트할 수 있습니다.
$ cat java-tomcat-9e8e4799/analysis.json
{
"a2CTemplateVersion": "1.0",
"createdTime": "2020-06-24 07:40:5424",
"containerParameters": {
"_comment1": "*** EDITABLE: The below section can be edited according to the application requirements. Please see the analyisInfo section below for deetails discoverd regarding the application. ***",
"imageRepository": "java-tomcat-9e8e4799",
"imageTag": "latest",
"containerBaseImage": "ubuntu:18.04",
"coopProcesses": [ 6446, 6549, 6646]
},
"analysisInfo": {
"_comment2": "*** NON-EDITABLE: Analysis Results ***",
"processId": 2537
"appId": "java-tomcat-9e8e4799",
"userId": "1000",
"groupId": "1000",
"cmdline": [...],
"os": {...},
"ports": [...]
}
}
또한, $ app2container extract --application-id java-tomcat-9e8e4799
명령을 실행하면 분석된 애플리케이션에 애플리케이션 아카이브가 생성됩니다. 이는 앞서 애플리케이션의 Workspace 폴더에서 생성된 analysis.json
파일에 따라 달라지며, 그곳에 정의된 컨테이너화 매개변수 업데이트를 따릅니다. extract
명령을 사용하면 애플리케이션 서버에서 첫 명령 세트를 실행한 다음, 워커 머신에서 워크플로를 계속 진행할 수 있습니다.
이제 선택한 애플리케이션에 대해 명령으로 생성된 Docker 이미지를 컨테이너화할 수 있습니다.
$ sudo app2container containerize --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Extracted container artifacts for application
Entry file generated
Dockerfile generated under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated dockerfile.update under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated deployment file at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json
Containerization successful. Generated docker image java-tomcat-9e8e4799
You're all set to test and deploy your container image.
Next Steps:
1. View the container image with \"docker images\" and test the application.
2. When you're ready to deploy to AWS, please edit the deployment file as needed at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json.
3. Generate deployment artifacts using app2container generate app-deployment --application-id java-tomcat-9e8e4799
이 명령을 사용하면 containerize 명령이 실행되는 머신에서 Docker 이미지를 사용하여 앞서 생성한 컨테이너 이미지를 확인할 수 있습니다. docker run
명령을 사용하여 컨테이너를 시작하고 애플리케이션 기능을 테스트할 수 있습니다.
containerize
명령은 컨테이너 이미지를 생성할 뿐만 아니라, 다음의 generate-appdeployment
명령과 사용할 수 있는 deployment.json
템플릿 파일도 생성합니다. deployment.json
템플릿 파일의 매개변수를 수정하여 Amazon ECR에 등록할 이미지 리포지토리 이름, ECS 작업 정의 매개변수 또는 Kubernetes 앱 이름을 변경할 수 있습니다.
$ cat java-tomcat-9e8e4799/deployment.json
{
"a2CTemplateVersion": "1.0",
"applicationId": "java-tomcat-9e8e4799",
"imageName": "java-tomcat-9e8e4799",
"exposedPorts": [
{
"localPort": 8090,
"protocol": "tcp6"
}
],
"environment": [],
"ecrParameters": {
"ecrRepoTag": "latest"
},
"ecsParameters": {
"createEcsArtifacts": true,
"ecsFamily": "java-tomcat-9e8e4799",
"cpu": 2,
"memory": 4096,
"dockerSecurityOption": "",
"enableCloudwatchLogging": false,
"publicApp": true,
"stackName": "a2c-java-tomcat-9e8e4799-ECS",
"reuseResources": {
"vpcId": "",
"cfnStackName": "",
"sshKeyPairName": ""
},
"gMSAParameters": {
"domainSecretsArn": "",
"domainDNSName": "",
"domainNetBIOSName": "",
"createGMSA": false,
"gMSAName": ""
}
},
"eksParameters": {
"createEksArtifacts": false,
"applicationName": "",
"stackName": "a2c-java-tomcat-9e8e4799-EKS",
"reuseResources": {
"vpcId": "",
"cfnStackName": "",
"sshKeyPairName": ""
}
}
}
이때 아티팩트가 생성되는 애플리케이션 Workspace는 반복 샌드박스 역할을 합니다. 여기에서 생성된 Dockerfile
을 편집하여 애플리케이션을 변경하고 docker build
명령으로 필요에 따라 새 컨테이너 이미지를 구축할 수 있습니다. generate-deployment
명령을 사용하여 Amazon EKS에 애플리케이션 컨테이너를 배포하는 데 필요한 아티팩트를 생성할 수 있습니다.
$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
EKS Cloudformation templates and additional deployment artifacts generated successfully for application java-tomcat-9e8e4799
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 /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml --capabilities CAPABILITY_NAMED_IAM --stack-name java-tomcat-9e8e4799
3. Setup a pipeline for your application stack:
app2container generate pipeline --application-id java-tomcat-9e8e4799
이 명령은 containerize
명령을 실행할 때 생성된 deployment.json
템플릿 파일을 기반으로 실행됩니다. 이제 App2Container에서 ECS/EKS CloudFormation 템플릿이 생성되고 해당 스택을 배포하기 위한 옵션이 제공됩니다.
이 명령을 실행하면 컨테이너 이미지가 사용자 지정 ECR 리포지토리에 등록되고, Amazon ECS 및 EKS 배포를 위한 CloudFormation 템플릿이 생성됩니다. Amazon ECS로 ECS 작업 정의를 등록하고 kubectl
로 기존 Amazon EKS에 컨테이너화된 애플리케이션을 시작하거나 App2Container에서 생성된 amazon-eks-master.template.deployment.yaml
로 자체 관리형 Kubernetes 클러스터를 시작할 수 있습니다.
또는 --deploy
옵션으로 Amazon EKS에 직접 컨테이너화된 애플리케이션을 배포할 수 있습니다.
$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799 --deploy
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
Initiated Cloudformation stack creation. This may take a few minutes. Please visit the AWS Cloudformation Console to track progress.
Deploying application to EKS
Windows 인증으로 .NET 애플리케이션 처리
ASP.NET 애플리케이션을 컨테이너화하는 작업은 Java 애플리케이션과 거의 차이가 없지만 Windows 컨테이너는 직접 도메인을 조인할 수 없습니다. 하지만 Active Directory(AD) 도메인 ID를 사용하여 여러 가지 인증 시나리오를 지원할 수는 있습니다.
App2Container는 사이트가 Windows 인증을 사용하는지 탐지하고 그에 따라 IIS 사이트의 애플리케이션 풀을 네트워크 서비스 ID로 실행할지 여부를 결정한 다음, Windows에서 인증된 IIS 애플리케이션에 새 CloudFormation 템플릿을 생성합니다. 이 템플릿에서 gMSA 및 AD 보안 그룹 생성, 도메인 조인 ECS 노드, 컨테이너에서 이 gMSA를 사용하도록 설정하는 작업까지 모두 처리합니다.
또한, $ app2container containerize
명령을 실행하면 사용 방법에 대한 지침 파일과 함께 PowerShell 스크립트 2개를 출력합니다.
출력 예시는 다음과 같습니다.
PS C:\Windows\system32> app2container containerize --application-id iis-SmartStoreNET-a726ba0b
Running AWS pre-requisite check...
Running Docker pre-requisite check...
Container build complete. Please use "docker images" to view the generated container images.
Detected that the Site is using Windows Authentication.
Generating powershell scripts into C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts required to setup Container host with Windows Authentication
Please look at C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts\WindowsAuthSetupInstructions.md for setup instructions on Windows Authentication.
A deployment file has been generated under C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b
Please edit the same as needed and generate deployment artifacts using "app2container generate-deployment"
첫 번째 PowerShell 스트립트 DomainJoinAddToSecGroup.ps1
은 컨테이너 호스트를 결합하고 Active Directory 보안 그룹에 추가합니다. 두 번째 스크립트 CreateCredSpecFile.ps1
은 그룹 관리형 서비스 계정(gMSA)을 생성하고 Active Directory 보안 그룹에 액세스 권한을 부여하며 이 gMSA에 자격 증명 사양을 생성하고 컨테이너 호스트에 로컬로 저장합니다. ECS 호스트에서 PowerShell 스크립트를 실행할 수 있습니다. 스크립트 사용 예시는 다음과 같습니다.
PS C:\Windows\system32> .\DomainJoinAddToSecGroup.ps1 -ADDomainName Dominion.com -ADDNSIp 10.0.0.1 -ADSecurityGroup myIISContainerHosts -CreateADSecurityGroup:$true
PS C:\Windows\system32> .\CreateCredSpecFile.ps1 -GMSAName MyGMSAForIIS -CreateGMSA:$true -ADSecurityGroup myIISContainerHosts
app2container generate-deployment
명령을 실행하기 전에 deployment.json
파일을 수정하여 dockerSecurityOption
의 값을 CreateCredSpecFile
스크립트가 생성한 CredentialSpec
파일 이름으로 변경합니다. 예를 들면 다음과 같습니다.
"dockerSecurityOption": "credentialspec:file://dominion_mygmsaforiis.json"
실질적으로 이 사이트의 컨테이너 내부에서 IIS 서버가 액세스하는 모든 네트워크 리소스는 상기 gMSA를 사용하여 인증을 받습니다. 마지막 단계는 IIS 서버에서 액세스하는 네트워크 리소스에서 이 gMSA 계정을 인증하는 것입니다. 일반적으로는 SQL 서버 내에서 이 gMSA를 인증받습니다.
마지막으로 애플리케이션을 데이터베이스에 연결해야 정상적으로 작동하고, Amazon ECS에서 컨테이너를 실행할 경우, 이 도구로 생성한 Docker 이미지에서 만든 애플리케이션 컨테이너가 해당 데이터베이스에 연결되는지 확인해야 합니다. 마이그레이션 옵션은 AWS의 Windows에서 Linux로 MS SQL 서버 이전, 데이터베이스 마이그레이션 서비스, MS SQL 서버를 Amazon RDS에 백업 및 복원 설명서를 참조하세요.
정식 출시
AWS App2Container는 무료로 제공됩니다. Amazon EC2, ECS, EKS, S3 등 AWS 서비스의 실제 사용량에 대해서만 요금을 지불합니다. 자세한 내용은 App2Container FAQ와 설명서를 참조하세요. 상기 내용을 시도해보시고 기존 AWS Support 담당자를 통해 또는 AWS ECS 포럼, AWS EKS 포럼, GitHub의 컨테이너 로드맵에서 피드백을 보내주시기 바랍니다.
— Channy