Amazon Web Services 한국 블로그

ASP.NET Core를 위한 AWS CodeStar 사용 방법

AWS CodeStar 팀이 최근 ASP.NET Core 프로젝트 템플릿 2개를 추가로 발표했습니다.  AWS CodeStar는 개발자를 대신해 CI/CD(코드 통합 및 코드 배포) 파이프라인을 생성하므로 개발자는 인프라를 구축하는 대신 애플리케이션 빌드에 집중할 수 있습니다. 새로운 ASP.NET Core 프로젝트 템플릿을 사용하여 .NET 개발자는 처음부터 AWS 애플리케이션을 빌드하고 배포할 수 있습니다. AWS CodeStar에서 ASP.NET Core 애플리케이션을 생성하는 방법이 Tara Walker의 우수 블로그 게시물에 나와 있습니다. 이 블로그 게시물에서는 AWS CodeStar용 ASP.NET Core 프로젝트에 테스트를 추가하는 방법을 배우고 그 이면에서 이루어지는 일을 자세히 살펴볼 수 있습니다.

단위 테스트 프로젝트 추가

HelloController 기능을 연습하는 간단한 테스트 사례를 추가하는 것이 목적입니다. 새로운 ASP.Net Core 웹 서비스 프로젝트가 있다고 가정해 보겠습니다. 이 프로젝트가 없으면 Tara 블로그 게시물(위 내용 참조)에 따라 만드십시오. ASP.NET Core 웹 서비스 템플릿을 선택해야 합니다. AWS CodeStar용 ASP.NET Core를 만들고 Team Explorer를 통해 프로젝트 리포지토리를 복제한 후 AspNetCoreWebService 솔루션을 로드한 다음 블로그 게시물의 나머지 부분에 따르면 됩니다. Team Explorer를 통해 repo를 설정하기 위한 지침이 필요하면 Steve Robert의 Visual Studio 및 AWS CodeCommit 통합 5월자 발표를 참조하십시오.

먼저 AspNetCoreWebServiceTest라는 새 xUnit 프로젝트를 AspNetCoreWebService 솔루션에 추가하십시오. 새로운 테스트 프로젝트는 HelloController 클래스와 JsonResult를 참조하므로 AspNetCoreWebService를 프로젝트 참조로 추가하고 Microsoft.AspNetCore.Mvc를 NuGet 참조로 추가해야 합니다. 이 참조를 테스트 프로젝트에 추가한 후에  AspNetCoreWebServiceTest.csproj에 다음 내용이 추가되어야 합니다.

Xml
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
    ...
</ItemGroup>
...
<ItemGroup>
    <ProjectReference Include="..\AspNetCoreWebService\AspNetCoreWebService.csproj" />
</ItemGroup>

그러면 HelloController 클래스의 직접 참조를 만들고 JsonResult의 압축을 풀 수 있습니다. 다음과 같이 간단한 테스트 사례를 추가해 보겠습니다.

C#
using System;
using Xunit;
using Microsoft.AspNetCore.Mvc;
using AspNetCoreWebService.Controllers;

namespace AspNetCoreWebServiceTest
{
    public class HelloControllerTest
    {
        [Fact]
        public void SimpleTest()
        {
            HelloController controller = new HelloController();
            var response = controller.Get("AWS").Value as Response;
            Assert.Equal(response.output, "Hello AWS!");
        }
    }
}

파일 이름, 네임스페이스, 클래스 이름 및 메서드 이름이 바뀌었습니다. 테스트를 실행하고 통과하는지 확인하십시오. [Solution Explorer]에 다음과 같이 표시되어야 합니다.

이제 테스트 프로젝트가 작동하므로 애플리케이션을 배포하기 전에 파이프라인을 업데이트하여 테스트를 빌드하고 실행해야 합니다.

AWS CodeBuild 작업 업데이트

먼저 프로젝트가 어떻게 빌드되는지 살펴보겠습니다. 개발자나 팀 구성원이 repo에 변경 사항을 푸시하면 파이프라인이 최신 변경 사항에 따라 자동으로 빌드 프로세스를 시작합니다. 이 단계에서 AWS CodeBuild가 리포지토리 루트에 있는 buildspec.yml 파일을 사용하여 빌드 프로세스를 진행합니다.

YAML
version: 0.2
phases:
  pre_build:
    commands:
      - echo Restore started on `date`
      - dotnet restore AspNetCoreWebService/AspNetCoreWebService.csproj
  build:
    commands:
      - echo Build started on `date`
      - dotnet publish -c release -o ./build_output AspNetCoreWebService/AspNetCoreWebService.csproj
artifacts:
  files:
    - AspNetCoreWebService/build_output/**/*
    - scripts/**/*
    - appspec.yml

AWS CodeBuild용 .NET Core 이미지가 AWS CodeBuild 작업에 사용됩니다. buildspec.yml에서 호출할 .NET Core SDK 및 CLI가 이 이미지에 포함되어 있습니다.  이 프로젝트는 웹 서비스 1개로 구성되므로 buildspec.yml 파일 하나면 충분합니다. 프로젝트가 커지고 빌드 프로세스가 복잡해지면 셸 스크립트나 MSBuild .proj 파일을 통해 외부적으로 빌드 프로세스를 진행하고 buildspec.yml에서 간단하게 스크립트/빌드 파일을 호출할 수 있습니다.

dotnet publish 명령에 주목해 주십시오. 이 게시 단계에서는 호스트 머신에서 즉시 사용할 수 있도록 모든 종속성을 함께 패키지하므로 매우 중요합니다. 위에 나온 buildspec.yml 파일의 artifacts 섹션에서 정의한 대로 파일 목록이 Amazon S3 버킷에 저장되어 AWS CodeDeploy가 호스트에 애플리케이션을 배포하는 데 사용할 수 있습니다.  scripts/**/*에는 appsec.yml이 종속된 모든 스크립트가 포함됩니다. appsec.yml에 익숙하지 않거나 이 파일에 대해 자세히 알아보려면 다음 단원에서 다시 다루겠습니다.

이전 단원에서는 AWS CodeCommit 리포지토리에 테스트 프로젝트를 추가했습니다. 이제 buildspec.yml을 업데이트하여 새 테스트 프로젝트를 빌드하겠습니다. 빌드 단계의 일부로 dotnet vstest를 실행할 수 있습니다. 하지만 이 연습에서는 별도의 빌드 및 테스트 단계를 만들어 모범 사례를 따르겠습니다. buildspec.yml을 수정하여 테스트 바이너리를 빌드하고 비트를 AspNetCoreWebServiceTest/test_output 디렉터리에 게시합니다.

YAML
pre_build:
    commands:
        ...
        - dotnet restore AspNetCoreWebServiceTest/AspNetCoreWebServiceTest.csproj
post_build:
    commands:
        ...
        - dotnet publish -c release -o ./test_output AspNetCoreWebServiceTest/AspNetCoreWebServiceTest.csproj  
artifacts:
    files:
        ...
        - AspNetCoreWebServiceTest/test_output/**/*

AspNetCoreWebServiceTest/test_output/**/*을 아티팩트로 추가했습니다. 그래서 실제로 AWS CodeBuild 서비스가 게시된 테스트 바이너리를 Amazon S3에 업로드하므로 다음에 만들 테스트에서 이 테스트 바이너리를 참조할 수 있습니다.

AWS CodePipeline 업데이트

이전 단원에서는 새로운 테스트 프로젝트를 추가하고 buildspec.yml을 수정하여 테스트 실행에 필요한 바이너리를 빌드하고 저장했습니다. 이제 파이프라인에 테스트 단계를 추가하는 방법을 계속 설명하겠습니다. 먼저 콘솔에서 Test 단계와 UnitTest 작업을 파이프라인에 추가합니다.

나머지 UI를 따르고 다음 파라미터를 입력하십시오.

  • [Action category]: Test
  • [Action name]: UnitTest
  • [Test provider]: AWS CodeBuild
  • [Create a new build project] 선택
  • [Project name]: <your project name>-test
  • [Operating system]: Ubuntu
  • [Runtime]: .NET Core
  • [Version]: aws/codebuild/dot-net:core-1
  • [Build specification]에 대해nbsp;[Insert build Commands] 선택
  • [Build command]: dotnet vstest AspNetCoreWebServiceTest/test_output/AspNetCoreWebServiceTest.dll
  • [Role name]에 대해 목록에서 [CodeStarWorker-<your project name>-CodeBuild] 선택
  • [Input artifacts #1]에 대해 목록에서 [<your project name>-BuildArtifact] 선택

여기서 중요한 정보는 제공된 빌드 명령입니다. 이전 단계에서 빌드한 test .dll에 따라 테스트 작업이 dotnet vstest를 실행합니다. 이제 파이프라인이 다음과 같아야 합니다.

거의 끝났습니다. [Release change]를 눌러 이 파이프라인을 실행하면 [Error Code: AccessDeniedException] 메시지와 함께 Test 단계에서 파이프라인이 실패합니다. AWS CodeStar 서비스에는 새 Test 단계를 실행할 권한이 없기 때문입니다. AWS CodeStar 프로젝트에 적절한 액세스 권한을 부여하는 방법을 알아보겠습니다.

IAM 역할 및 정책 업데이트

AWS CodeStar 프로젝트는 여러 서비스와 작업자가 애플리케이션을 동기화, 빌드 및 배포할 수 있는 최소한의 권한에 대한 정책을 만들었습니다. 새로운 AWS CodeBuild 작업을 추가했기 때문에 [CodeStarWorkerCodePipelinePolicy]에서 새 리소스에 대한 액세스 권한을 부여해야 합니다. IAM 콘솔로 이동하여 변경해 보겠습니다. [Roles] 탭에서 “codebuild” 키워드를 사용하여 검색하십시오 역할은 CodeStarWorker-<project name>-CodePipeline 형식이어야 합니다. 그런 다음 역할에 연결된 정책을 편집하십시오. 편집 과정은 아래와 같습니다.

변경할 내용은 정책에서 AWS CodeBuild 작업과 연결된 새 codebuild 리소스 arn:aws:codebuild:us-east-1:532345249509:project/<your project name>-test를 추가하는 것입니다.

Js
{
    "Action": [
        "codebuild:StartBuild",
        "codebuild:BatchGetBuilds",
        "codebuild:StopBuild"
    ],
    "Resource": [
        "arn:aws:codebuild:us-east-1:532345249509:project/<your project name>"
        "arn:aws:codebuild:us-east-1:532345249509:project/<your project name>-test"
    ],
    "Effect": "Allow"
}

완료되었습니다. 이제 AWS CodeStar 프로젝트에 새 작업을 빌드하는 데 적절한 권한이 생겼습니다. [Release change]를 눌러 시도해 보십시오.

ASP.NET Core 애플리케이션 배포

이제까지 AWS CodeStar를 사용하여 프로젝트를 빌드하고 테스트하는 방법을 알아보았습니다. 이 단원에서는 배포 프로세스를 자세히 살펴보겠습니다. AWS CodeStar 프로젝트를 생성하는 동안 AWS CodeStar 서비스가 애플리케이션을 호스팅하기 위해 Amazon EC2 인스턴스를 만듭니다. appspec.yml의 지침에 따라 해당 인스턴스에서 배포 프로세스를 실행하는 code-deploy-agent도 설치합니다. appspec.yml을 살펴보겠습니다.

YAML
version: 0.0
os: linux
files:
  - source: AspNetCoreWebService/build_output
    destination: /home/ubuntu/aspnetcoreservice
  - source: scripts/virtualhost.conf
    destination: /home/ubuntu/aspnetcoreservice 
hooks:
  ApplicationStop:
    - location: scripts/stop_service
      timeout: 300
      runas: root

  BeforeInstall:
    - location: scripts/remove_application
      timeout: 300
      runas: root

  AfterInstall:
    - location: scripts/install_dotnetcore
      timeout: 500
      runas: root

    - location: scripts/install_httpd
      timeout: 300
      runas: root

  ApplicationStart:
    - location: scripts/start_service
      timeout: 300
      runas: root

배포 프로세스의 여러 단계에서 각 스트립트가 실행됩니다.

  • install_dotnetcore – 아직 설치되지 않은 경우 dotnet core를 설치하고 처음 실행할 때 패키지 캐시를 업데이트합니다. Microsoft에서는 이 방식으로 Ubuntu에서 .NET Core를 설치하도록 권장합니다.
  • install_httpd – HTTPD 대몬과 mod를 설치하고 HTTPD 구성 파일을 덮어써 reverse-proxy를 활성화합니다.
  • start_service – HTTPD 서비스를 다시 시작하고 기존의 ASP.NET 애플리케이션/서비스 프로세스를 다시 시작합니다.
  • scripts/stop_service – HTTPD 서비스를 중지하고, 아직 실행 중인 경우 ASP.NET 애플리케이션/서비스를 중지합니다.
  • remove_application – 배포된 애플리케이션을 인스턴스에서 제거합니다.

애플리케이션 배포 중에 인스턴스의 code-deploy-agent가 이 후크를 실행하여 서비스를 설치하고 시작합니다. AWS CodeDeploy 콘솔에서 이벤트 활동을 모니터링할 수 있으며 EC2 인스턴스에서 자세한 로그를 볼 수 있습니다. 인스턴스와의 SSH 연결을 열고 /var/log/aws/codedeploy-agent로 이동하여 배포 로그를 찾으십시오.

결론

이 블로그 게시물에서는 애플리케이션 파이프라인에 테스트 단계를 추가하는 예제를 통해 AWS CodeStar용 ASP.NET Core 프로젝트가 빌드 및 배포되는 방법을 알아보았습니다. 다양한 구성 요소와 AWS 서비스가 상호 작용하여 AWS CodeStar의 전체 CI/CD 시스템을 제공하는 방법을 이해하는 데 이 게시물이 도움이 되었기를 바랍니다.

이 글은 AWS 개발자 블로그의 Steven Kang이 작성한 ASP.NET Core and AWS CodeStar Deep Dive의 한국어 번역입니다.