BLOG
AWS는 고객이 ASP.NET(on .NET Framework) 애플리케이션을 AWS로 사용하여 migration할 때 NET 플랫폼을 제공용 AWS Elastic Beanstalk를 사용하여 앱을 배포합니다. 이 AWS Elastic Beanstalk는 많은 사람들이 앱을 배포, 확장 그리고 업데이트할 수 있는 서비스입니다. ASP.NET(on .NET Framework) 애플리케이션은 Jenkins 인스턴트나 또는 기타 infrastructure를 관리할 필요가 없어 고객분들은 종종 해당 애플리케이션을 위한 CI/CD 파이프라인 생성법을 묻습니다.
이러한 파이프라인은 AWS CodePipeline을 orchestrator로 수행하고, AWS CodeBuild를 기반으로 AWS CodeCommi, GitHub, 또는 다른 시스템 소스 컨트롤 사용해 쉽게 만들 수 있습니다. 이번 블로그 포스팅으론 소스 제어를 위해 CodeCommit Git 저장소를 사용하여 추후 확장하거나 유닛 테스트를 포함할 수 있도록 어떻게 CI/CD 파이프라인을 어떻게 설정하면 되는지에 대해 다루어 보겠습니다.
프로젝트 생성 그리고 buildspec.yml 파일 추가
첫 번째 단계로는 CI/CD 파이프라인을 생성하여 buildspec.yml 파일을 추가하는 것입니다.
ASP.NET 웹 어플리케이션 생성 또는 선택(.NET Framework)
우선 ASP.NET 웹 어플리케이션(.NET Framework) 프로젝트를 새로 생성하거나 기존에 있던 어플리케이션을 선택해 줍니다. MVC, Web API 또는 ASP.NET 4.x.를 기반으로 한 Web Forms project types 선택하셔도 됩니다. 다만 어떠한 타입을 선택하여도 로컬에서 선택하고 실행한다는 점을 주의해 주십시오.
ASP.NET (.NET Framework) 어플리케이션의 첫 번째 코드 파이프라인을 설정하기 위해서는 데이터 베이스나 다른 리소스를 필요로 하지 않고 단일 프로젝트로 구성된 단순한 앱을 사용하여야 합니다. 아래의 스크린 샷은 Visual Studio 2019에서 새로운 프로젝트를 생성했을 때의 모습입니다.
CodeCommit에 새로운 프로젝트 추가하기
다음으로 CodeCommit Git 저장소에 새로운 프로젝트를 추가하십시오. CodeCommit 웹 콘솔에서 새로운 저장소를 생성하여 새로운 CodeCommit documentation을 따라 새로운 어플리케이션 또는 legacy 어플리케이션을 추가하거나 AWS Toolkit for Visual Studio를 활용하여 Visual Studio team Explorer에서 CodeCommit와 통합해 새 저장소를 생성할 수 있습니다.
만약 Team Explorer을 사용하여 CodeCommit Git 저장소를 생성하고 상호작용을 하려면 Integrate Visual Studio with AWS CodeCommit documentation 2단계를 참고하여 커넥션을 생성하고 그 다음에는 같은 섹션에 있는 ‘Creat a CodeCommit Repository from Visual Studio’ 의 단계를 따라해 주십시오. 다른 방법으로 Command Line에서 Git을 사용하여 작업할 수도 있습니다.
Visual Studio의 team explorer의 특정한 .NET 프로젝트에 특정 .gitignore 파일을 추가하여 Git에 저장되는 파일 수를 줄일 수 있습니다. :
- Team Explorer 툴 바에서 Home 아이콘을 찾으십시오.
- Setting 버튼을 선택한 뒤에 Repository Setting을 선택하십시오.
- Add 옵션 버튼을 클릭하고 Ignore File 아래에 있는 Ignore & Attributes Files를 다음의 스크린 샷을 참고하여 클릭하십시오.
.gitignore 파일을 추가한 뒤에 Visual Studio를 CodeCommit에 선택적으로 연결할 수 있으며, git push 또는 Team Explorer를 사용하여 CodeCommit에서 원격으로 코드를 푸시하십시오. 변경 사항을 적용한 후 브라우저에서 CodeCommit 관리 콘솔을 사용하여 모든 파일이 있는지 확인할 수 있습니다.
프로젝트에 Buildspec.yml 파일 추가하기
실제 컴파일을 수행하는 CodeBuild는 기본 도커 이미지를 사용하여 컨테이너를 시작합니다. 그 후 명령을 수행하고 실행하여 필요한 소프트웨어 설치 및 원하는 실제 빌드 및 빌드 테스트를 실행합니다. 지정 출력한 파일인artifacts를 가져와서 CodePipeLine 파이프라인에 다음 단계를 위해 .zip 파일로 Amazon S3에 업로드 합니다. 컨테이너에서 CodeBuild가 실행하는 명령은 프로젝트의 소스 코드의 일부인 buildspec.yml 파일에 지정됩니다. CodeBuild에 직접 추가도 가능 하지만 소스 컨트롤에서 추가하고 트랙하는 것이 더 편리합니다. Windows 컨테이너와 함께 CodeBuild를 실행할 때, 명령의 기본으로 설정된 shell은 PowerShell입니다.
이름이 buildspec.yml으로 설정된 ASP.NET 프로젝트의 루트에서 일반 텍스트 파일을 추가한 다음 editor에서 파일을 오픈하십시오. 그 후 나중에 쉽게 찾아서 수정할 수 있도록 파일을 프로젝트에 추가해 줍니다. Buildspec.yml 파일의 구조와 콘텐츠에 관한 자세한 내용은 CodeBuild documentation을 참고해 주시기 바랍니다.
다음의 샘플을 참고하여 buildspec.yml 파일의 값을 PROJECT 간단하게 대체하고 DOTNET_FRAMEWORK 의 프로젝트 이름과 프로젝트의 .NET Framwork 의 타겟 버전을 대체합니다.
version: 0.2
env:
variables:
PROJECT: AspNetMvcSampleApp
DOTNET_FRAMEWORK: 4.6.1
phases:
build:
commands:
– nuget restore
– msbuild $env:PROJECT.csproj /p:TargetFrameworkVersion=v$env:DOTNET_FRAMEWORK /p:Configuration=Release /p:DeployIisAppPath=”Default Web Site” /p:PackageAsSingleFile=false /p:OutDir=C:\codebuild\artifacts\ /t:Package
artifacts:
files:
– ‘**/*’
base-directory: ‘C:\codebuild\artifacts\_PublishedWebsites\${env:PROJECT}_Package\Archive\’
Buildspec 명령어
위에서 나타낸 buildspec.yml 파일을 보면 이 샘플 애플리케이션에 대해 정의된 유일한 단계는 build입니다. Build 전 또는 후에 진행해야 하는 작업으로는 pre_build 와 post_build 단계가 있습니다.
첫 번째 명령어는 nuget restore 프로젝트가 참조하는 NuGet 패키지를 다운로드 하는 것입니다. 그리고 나서 MS build가 자체 빌드를 시작합니다. /t:Package parameter를 사용하여 Elastic Beanstalk가 ASP.NET Framwork 어플리케이션에 필요한 웹 구조가 생성됩니다. 추가로 archive.xml, parameters.xml, 그리고 systemlnfo.xml 파일이 포함됩니다.
기본적으로 이러한 타입의 build에서 나오는 output은 .zip 파일입니다. 그러나 CodePipeline과 함께 사용한다면, CodeBuild가 이미 압축을 한 상태이어도 자체적으로 지정한 파일을 압축을 합니다. 이러한 두 번의 압축을 방지하기 위해서는 /p:PackageAsSingleFile=false parameter 폴더에서 Archive 대신 output 폴더의 구조를 출력 매개 변수로 사용하여야 합니다. /p:OutDir parameter 매개 변수는 MSBuild가 작성해야 하는 파일의 위치를 설정합니다. 이 예시는 C:\codebuild\artifacts\.을 사용합니다.
마지막으로는 artifacts 노드에서 Codebuild가 압축하고 CodePipeline에 제공해야 하는 파일 (또는 artifacts)를 지정하십시오.
위의 샘플에는 C:\codebuild\artifacts\_PublishedWebsites\${env:PROJECT}_Package\Archive\ 에 있는 모든 파일(the ‘**/*’)을 포함 해야 하며 ${env:PROJECT} 가 파일 맨 위의 프로젝트 이름의 변수로 자동 변경됩니다.
Buildspec.yml 파일 편집이 모두 끝났다면, commit 그리고 push 하여 파일의 CodeCommit Git 저장소에 잘 위치하였는지 확인하여야 합니다.
Elastic Beanstalk 어플리케이션 생성 및 최초 배포
Elastic Beanstalk CodePipeline를 배포하는 자는 기존 Elastic Beanstalk 어플리케이션 환경에 배포합니다. 따라서 파이프 라인을 구축하기 전에는 매뉴얼에 따라 어플리케이션을 배포하고 Elastic Beanstalk 에서 목적 어플리케이션 및 환경을 생성하십시오. 가장 쉬운 방법으로는 AWS Toolkit for Visual Studio을 사용하는 것입니다. 만약 설치되지 않았다면, Visual Studio Extensions 에서 aws를 검색하고 설치하십시오.
설치가 완료 되었다면, Visual Studio에서 프로젝트를 열고 Solutions Explorer에서 프로젝트 노드를 마우스 우측 클릭하여 Publish to AWS Elastic Beanstalk을 선택합니다. 그렇게 하면 Publish 마법사가 나타날 것입니다.
Publish 마법사를 사용하는 방법은 Deploy a Traditional ASP.NET Application to Elastic Beanstalk. 을 참고하여 단계별로 진행하시기 바랍니다.
Publish 마법사가 Elastic Beanstalk배포를 다 끝냈다면, 다음 스크린 샷 에서 보이는 것과 같이 Visual Studio의 환경 창에 URL이 표시 될 것입니다.
다른 방법으로는 브라우저에서 Elastic Beanstalk 관리 콘솔로 이동하여 어플리케이션과 environment를 선택하고 environment 대시 보드에서 URL을 확인할 수 있습니다. 브라우저에서 어플리케이션이 잘 보이는지 확인하십시오.
CI/CD Pipeline 생성하기
다음으로는 CodePipleline 파이프라인을 생성하십시오.
Source Stage 추가
소스 코드가 CodeCommit에 있고 기존 Elastic Beanstalk 앱이 있는 파이프라인을 생성하십시오.
- 브라우저에서 CodePipeline 관리 콘솔로 이동하십시오.
- Creat Pipeline을 선택하시고 이름을 설정하십시오. 조금 더 간단하게 하기 위해서는 CodeCommit 저장소와 같은 이름을 사용하십시오.
- Next 버튼을 클릭하십시오.
- Source 탭 아래에서 CodeCommit 버튼을 클릭하십시오.
- 드롭 다운 박스에서 저장소 이름을 선택하고 사용하고자 하는 branch를 선택하십시오. 만약 branch를 추가하지 않았다면 마스터 branch를 선택하시면 됩니다.
Build Stage 생성
다음으로 build stage를 생성하십시오.
- Next 버튼을 클릭한 뒤에 빌드 공급자로 AWS CodeBuild를 선택하십시오.
- Region을 선택한 다음에, Create project 버튼을 클릭하여 새 창에서 여십시오.
- CodeBuild window에서 빌드 프로젝트의 이름과 설명을 추가할 수 있습니다.
- Environment 탭 아래에서 Custom image 옵션을 선택하고 Windows 를 환경타입으로 선택하십시오.
- NET 4.x (.NET Framework) 웹 프로젝트를 빌드 하는 경우, 레지스트리에서 호스팅하는 Microsoft의 .NET Framework SDK docker image 를 사용하여 시작하는 것이 가장 쉽습니다.
Other registry 를 선택한 뒤에, 레지스트리 URL로 mcr.microsoft.com/dotnet/framework/sdk:[version-tag] 을 사용하십시오.
Version-tag를 .NET framework 버전으로 변경하십시오. .NET Framework 4.x 버전 중 가장 많이 사용되는 버전은 4.7.1, 4.7.2 그리고 4.8 입니다. 본 예제에서는 mcr.microsoft.com/dotnet/framework/sdk:4.7.2. 을 사용하였습니다.
.NET Framework SDK 컨테이너 이미지에 대하여 자세한 내용은 container image page on Dockerhub 을 참고하여 주십시오. SDK는 Visual Studio Build Tools, NuGet CLI, 그리고 ASP.NET 웹 타겟을 포함하고 있습니다.
다음으로는 Logs(페이지 하단부 위치)에서 Amazon CloudWatch log의 그룹 이름을 선택하십시오. 그러면 CloudWatch에 각 빌드에 대한 자세한 로그를 나타낼 것입니다. 나머지 설정은 그대로 두셔도 됩니다.
그리고 나서 Continue to CodePipeline 버튼을 선택하여 CodeBuild 구성을 저장하고 CodePipeline 마법사의 Add build stage 단계로 돌아가십시오. 새로 생성한 프로젝트의 빌드가 Project name에 지정되어 있는지 확인 후 Next 버튼을 선택하십시오.
Deploy Stage 추가
Add deploy stage 추가하는 방법은 다음과 같습니다:
- Deploy 공급자로 AWS Elastic Beanstalk을 선택하십시오.
- Region을 선택하십시오.
- Application 이름 필드에서 이전에 배포한 Elastic Beanstalk 어플리케이션을 선택하십시오.
- 이전에 배포한 환경을 선택한 후에 Next 버튼을 클릭하십시오.
- 세팅을 다시 한번 확인하고 Create pipeline 을 선택하십시오.
Pipeline 테스트
파이프라인을 테스트 하기 위해서는 홈페이지에서 텍스트 추가와 같은 어플리케이션 코드를 쉽게 볼 수 있도록 변경하십시오. 그리고는 변경사항을 적용하고 push 하십시오.
잠시 기다리시면, 파이프 라인의 source stage가 빌드 스테이지를 따라 in progress로 이동되는 것을 확인할 수 있습니다. 이 작업이 완료되기까지는 10분 또는 조금 더 걸릴 수 있으며, 배포 단계는 빨리 진행될 것입니다.
배포 단계가 Succeeded로 변경된 후에 아래의 스크린 샷과 같이 파이프라인에서 AWS Elastic Beanstalk을 선택하고 Elastic Beanstalk 어플리케이션으로 이동하십시오.
배포할 환경을 선택 한 뒤에 URL을 선택하십시오. 변경 사항이 적용된 것을 확인 할 수 있습니다. 빌드 및 배포가 완료된 후에는 파이프라인이 다음 스크린 샷과 같이 나타날 것입니다.
글을 마치며…
오늘은 CodeCommit, CodePipeline, CodeBuild, Elastic Beanstalk를 포함한 AWS 서비스를 사용하여 .NET Framework로 구축된 ASP.NET 4.x 웹 애플리케이션 용으로 간단한 CI/CD 파이프라인을 만드는 방법을 보여드렸습니다. CI/CD 파이프라인 생성 후에는 유닛 테스트와 같은 추가적인 build action을 통하여 파이프라인을 확장하거나 매뉴얼 추가로 파이프 라인을 확장할 수도 있습니다.
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 개제하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달드리도록 하겠습니다.