Category: AWS CodeBuild


AWS CodeStar 및 CodeBuild에 신규 닷넷(.Net) 코어 앱 개발 지원

몇 달 전에 AWS 기반 애플리케이션을 신속하게 개발, 구축 및 배포 할 수있게 해주는 AWS CodeStar 서비스를 소개했습니다. AWS CodeStar는 개발팀이 훌륭한 소프트웨어를 하기 위한 다양한 개발 및 배포 도구를 활용하면서 서비스 출시 속도를 높이고, 인프라 관리 비용은 줄이는 최적의 관리 도구 입니다.

CodeStar 서비스 출시 당시 자바 스크립트, 자바, 파이썬, 루비, PHP 등 5가지 프로그래밍 언어와 Amazon EC2, AWS Elastic Beanstalk 및 AWS Lambda에 대한 다양한 프로젝트 템플릿을 출시했습니다. 각 템플릿은 AWS 기반 인프라에 AWS 코드 서비스를 함께 구성하여 빠른 데브옵스(DevOps) 파이프라인을 만들 수 있습니다.

오늘 AWS CodeStar 및 AWS CodeBuild에 닷넷(.NET) 코어 애플리케이션 개발, 구축 및 배포 기능을 추가하였습니다. 이 글에서는 CodeStar를 사용하여 EC2에서 .NET 기반 ASP.Net 웹 애플리케이션 빌드 및 배포를 하고, .NET 기반 Lambda 함수를 만들어 ASP.Net 앱을 CodeBuild를 통해 진행해 보도록 하겠습니다.

먼저 CodeStar 콘솔에 로그인하여 새로운 CodeStar 프로젝트를 시작하겠습니다. 프로젝트 템플릿을 선택하는 옵션이 표시됩니다.

지금은 .NET 핵심 프로젝트를 만드는 데 중점을 두고자하므로 프로그래밍 언어 섹션에서 C#을 선택하여 프로젝트 템플릿을 필터링 합니다.이제 CodeStar는 ASP.NET Core로웹 애플리케이션과 서비스를 작성하는 데 사용할 수있는 새로운 .NET Core 프로젝트 템플릿 만 보여줍니다. 프로젝트 템플릿 정보에서 볼 수 있듯이 Amazon EC2에 배포됩니다. 이는 .NET Core 코드가 AWS CodeBuild를 사용하여 컴파일 및 패키지되고 AWS CodeDeploy 서비스를 사용하여 EC2에 배포된다는 것을 의미합니다.

이제 프로젝트 이름을 ASPNetCore4Tara로 지정하면, Project ID 는 자동으로 지정됩니다. 이 화면에서는 CodeStar에서 닷넷 애플리케이션을 소스 코드로 부터 배포까지 필요한 절차 및 사용할 AWS 서비스를 볼 수 있습니다. Next를 클릭합니다.

ASP.Net 프로그램이 Amazon EC2 인스턴스에 배포되기 때문에 SSH를 통한 콘솔 접속을 위해 EC2 키 페어를 선택(없으면 EC2 콘솔에서 새로 작성 필요) 합니다.  키페어를 선택했으면 Create Project 버튼을 클릭합니다.


AWS CodeStar가 프로젝트 생성을 완료하고, 관련 AWS 서비스를 모두 프로비저닝 한 후에는 CodeStar 대시 보드에 표시된 애플리케이션 엔드 포인트에서 샘플 애플리케이션을 볼 수 있습니다.  Application Endpoints 아래 링크를 클릭하여 샘플 ASP.NET Core 웹 응용 프로그램을 봅니다.

이제 생성 된 프로젝트의 소스 코드를 로컬로 복제(clone)하고 Visual Studio IDE를 프로젝트 리포지토리에 연결합니다. 소스 코드가 변경 되면, AWS CodeBuild를 통해 자동으로 Amazon EC2 및 AWS Lambda에 .NET Core 빌드 및 배포를 지원하며, 변경 사항에 맞게 람다 함수의 빌드 사양 파일을 적절하게 변경합니다.

먼저 Visual Studio IDE를 열고 ASPNetCore4Tara 프로젝트에 제공되는 AWS CodeCommit 리포지토리에 연결합니다. Visual Studio 2017 IDE는 AWS CodeStar의 .NET Core 프로젝트에 필요하며, AWS Toolkit for Visual Studio 2017은 프로젝트 레포지토리를 IDE에 연결하기 전에 설치 해야합니다.

Visual Studio에서 자신의 Repo에 연결하려면 Team Explorer를 열고, Hosted Service Providers  아래의 AWS CodeCommit 옵션에서 연결 링크를 선택합니다. 기본 AWS 프로파일 툴킷 자격 증명을 유지하려면 Ok을 클릭합니다.

공급자 영역의 Manage ConnectionsAWS CodeCommit 아래의 Clone을 선택합니다.

일단 AWS CodeCommit에서 aspnetcore4tara 저장소를 선택하여 Clone AWS CodeCommit Repository 를 선택하면, Git Credentials 대화 상자에 IAM 역할 내 HTTPS Git 자격 증명을 입력합니다. 이제 전체 프로세스가 완료되었고, Git Credential Manager 로그인 대화 상자가 표시되면 동일한 IAM 역할의 Git 자격 증명을 입력해도 됩니다.

개발 프로젝트가 이제 aspnetcore4tara CodeCommit 저장소에 연결되고 웹 애플리케이션 편집이 가능합니다. 아래의 스크린 샷에서 알 수 있듯이 샘플 프로젝트는 표준 ASP.NET Core MVC 웹 응용 프로그램으로 구성되어 있습니다.

프로젝트가 생성되면 변경과 업데이트를 할 수 있습니다. 이 프로젝트를 .NET Lambda 함수로 업데이트하고자 하므로 Visual Studio에서 CodeStar 프로젝트로 컴파일 할 매우 간단한 C# Lambda 함수를 작성하는 새로운 프로젝트를 빠르게 시작합니다. 이 AWS Lambda 함수는 CodeStar ASP.NET Core 웹 앱 프로젝트에 포함됩니다.

아래 람다 함수는 NASA의 유명한 천문학 사진 (Astronomy Picture of the Day) 웹 사이트의 REST API를 호출합니다. API는 최신 행성 이미지 및 관련 정보를 JSON 형식으로 다시 보냅니다. 아래에서 람다 함수 코드를 볼 수 있습니다.

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using System.Net.Http;
using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace NASAPicOfTheDay
{
    public class SpacePic
    {
        HttpClient httpClient = new HttpClient();
        string nasaRestApi = "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY";

        /// <summary>
        /// A simple function that retreives NASA Planetary Info and 
        /// Picture of the Day
        /// </summary>
        /// <param name="context"></param>
        /// <returns>nasaResponse-JSON String</returns>
        public async Task<string> GetNASAPicInfo(ILambdaContext context)
        {
            string nasaResponse;
            
            //Call NASA Picture of the Day API
            nasaResponse = await httpClient.GetStringAsync(nasaRestApi);
            Console.WriteLine("NASA API Response");
            Console.WriteLine(nasaResponse);
            
            //Return NASA response - JSON format
            return nasaResponse; 
        }
    }
}

이제 C# Lambda 함수를 게시하고 NASAPicOfTheDay 프로젝트가있는 Visual Studio 용 AWS Toolkit에서 제공하는 AWS Lambda에 게시 옵션을 사용하여 테스트 할 것입니다. 함수를 게시 한 후 테스트하여 Visual Studio 및 / 또는 AWS Lambda 콘솔에서 올바르게 작동하는지 확인할 수 있습니다. C# 및 .NET을 사용하여 AWS Lambda 함수를 작성하는 방법에 대해 자세히 알아볼 수 있습니다. http://docs.aws.amazon.com/lambda/latest/dg/dotnet-programming-model.html

이제 람다 함수를 완성하고 테스트하였으므로, aspnetcore4tara라는 CodeStar 프로젝트에서 CodeBuild buildspec.yml 파일을 업데이트하여 람다 함수 배포를 포함합니다.

이 작업을 수행하기 위해 functions라는 새 폴더를 만들고 Lambda 함수 .NET 프로젝트가 포함 된 폴더를 aspnetcore4tara 웹 응용 프로그램 프로젝트 디렉토리에 복사합니다.

AWS Lambda 함수 빌드 및 배포를 위해,  aws-lambda-dotnet tools 에 사용된  buildspec.yml 파일에 명령을 사용합니다. 여기의 사용자 맞춤 프로파일 정보가 들어있는 NASAPicOfTheDay 폴더에 funcprof 파일을 추가합니다. 남아있는 작업은 NASAPictureOfDay를 배표하기 위해 AWS 람다 함수를 포함 ASPNetCore4Tara 프로젝트 빌드를 위해 CodeBuild가 사용하는 buildspec.yml 파일을 업데이트하는 것입니다. 업데이트 된 buildspec.yml은 다음과 같습니다 :

YAML
version: 0.2
phases:
  env:
  variables:
    basePath: 'hold'
  install:
    commands:
      - echo set basePath for project
      - basePath=$(pwd)
      - echo $basePath
      - echo Build restore and package Lambda function using AWS .NET Tools...
      - dotnet restore functions/*/NASAPicOfTheDay.csproj
      - cd functions/NASAPicOfTheDay
      - dotnet lambda package -c Release -f netcoreapp1.0 -o ../lambda_build/nasa-lambda-function.zip
  pre_build:
    commands:
      - echo Deploy Lambda function used in ASPNET application using AWS .NET Tools. Must be in path of Lambda function build 
      - cd $basePath
      - cd functions/NASAPicOfTheDay
      - dotnet lambda deploy-function NASAPicAPI -c Release -pac ../lambda_build/nasa-lambda-function.zip --profile-location funcprof -fd 'NASA API for Picture of the Day' -fn NASAPicAPI -fh NASAPicOfTheDay::NASAPicOfTheDay.SpacePic::GetNASAPicInfo -frun dotnetcore1.0 -frole arn:aws:iam::xxxxxxxxxxxx:role/lambda_exec_role -framework netcoreapp1.0 -fms 256 -ft 30  
      - echo Lambda function is now deployed - Now change directory back to Base path
      - cd $basePath
      - echo Restore started on `date`
      - dotnet restore AspNetCoreWebApplication/AspNetCoreWebApplication.csproj
  build:
    commands:
      - echo Build started on `date`
      - dotnet publish -c release -o ./build_output AspNetCoreWebApplication/AspNetCoreWebApplication.csproj
artifacts:
  files:
    - AspNetCoreWebApplication/build_output/**/*
    - scripts/**/*
    - appspec.yml
    

이제 끝났습니다. 이제 ASPNetCore4Tara 프로젝트를 위해 제공된 CodeCommit 저장소에 수정할 파일 추가 및 업데이트를 진행하면, 전체적으로 AWS CodePipeline을 자동 시작하여,  AWS CodeCommit에서 부터 CodeBuild까지 .NET Core에 대한 새로운 기능을 사용하여 ASP.NET Core 웹 애플리케이션과 .NET 기반 AWS Lambda 기능을 모두 처리할 수 있습니다.

요약하기
AWS CodeStar 및 AWS CodeBuild의 .NET Core에 대한 지원은 .NET 개발자가 AWS에서 .NET 기반 솔루션을 빌드 할 때 지속적인 통합(CI) 및 전달(CD)의 이점을 활용할 수 있습니다. AWS CodeStar 및 AWS CodeBuild의 .NET Core 지원에 대한 자세한 내용을 보거나 AWS CodeStar에 대한 소개는 지난 온라인 세미나 영상을 참고하시기 바랍니다.

.NET Core를 AWS CodeStar 및 AWS CodeBuild와 함께 사용함으로서 AWS 기반.NET 프로젝트를 보다 효율적으로 구축 할 수 있습니다.

Tara;

이 글은 Launch – .NET Core Support In AWS CodeStar and AWS Codebuild의 한국어 요약입니다.

AWS CodeBuild – 완전 관리형 빌드 서비스 출시

모든 개발자는 소스 코드 변경이 일어날 때, 지속적인 통합 빌드(build) 생성 및 테스트를 실행하기 위해 공유 빌드 서버를 설정하고 운영 해야합니다. 유지 관리에 대한 부담으로 인해 다수 개발자들이 로컬 컴퓨터에서만 빌드를 만들어, 정식 서버에서 실행함으로서 한 명의 개발자에게는 동작하는데 다른 개발자에게는 동작하지 않는 상황을 초래합니다. 많은 개발 팀은 지속적 통합(Continuous Integration, CI) 및 배포 (Continuous Deployment, CD) 파이프 라인의 일부를 사용할 수 있습니다. 이러한 빌드팜의 설치 및 유지 보수 비용은 여전히 높으며 전혀 다른 운영 기술이 필요합니다. 사용률이 100%에 도달하고 빌드 요청 백 로그가 증가하는 경우를 제외하고는 가볍게 사용합니다.

AWS CodeBuild 서비스 소개
오늘 이러한 문제를 해결 해줄 AWS CodeBuild를 출시합니다. 빌드 서버를 설치, 설정 및 확장 및 패치 등에 신경쓰지 않고, CodeBuild를 활용하여 개발 과정에서 유연상을 보장하고 여러 형태의 빌드 상태나 호환성의 불일치 문제를 해결할 수 있습니다.

CodeBuild를 사용 하면, 사전에 빌드 서버를 프로비저닝 할 필요가 없으며, 대기중인 빌드를 쌓아 두는 대신에 빌드 볼륨을 활용할 수 있도록 자동으로 확장됩니다. 분당 $0.005부터 시작하는 가격으로 분당 기준으로 빌드 리소스에 비용을 지불하기 때문에 사용한 시간만 비용을 지불합니다.

CodeBuild는 완전 관리형 빌드 서비스로서, 탄력성과 확장 가능하며 사용하기 쉽습니다. 처음 빌드 서비스를 시작하려면 빌드를 수행하는 데 필요한 정보가 들어있는 빌드 프로젝트를 만들기만 하면 됩니다 빌드 프로젝트에 다음 요소가 포함됩니다.

  • 소스 레포지터리 – 소스 코드 위치 (AWS CodeCommit, GitHub 또는 S3 bucket).
  • 빌드 환경 – 언어 및 런타임 환경 (Android, Java, Python, Ruby, Go, Node.js, Docker).
  • IAM 역할 – 다른 AWS 자원으로 부터 CodeBuild  접근 허용.
  • 빌드 스펙 – YAML 양식 빌드 명령어.
  • 컴퓨팅 사양 – 사용할 컴퓨팅 및 메모리 사양  (최대 8vCPU 및 15 GB 메모리).

CodeBuild는 완전히 격리된 신규 콘테이너 기반 환경에서 각 빌드를 수행합니다. 빌드를 시작하면 아래와 같이 진행합니다.

  1. CodeBuild는 빌드 프로젝트에서 지정한 빌드 환경을 기반으로 콘테이너를 시작합니다. Android, Java, Python, Ruby, Go, Node.js 및 Docker (Docker 이미지 작성용)에 대한 맞춤형 발드 환경을 제공합니다. Docker 허브 또는 EC2 Container Registry를 참조할 수 있습니다. 선별된 빌드 환경에는 AWS SDK 및 AWS 명령 줄 인터페이스 (CLI)를 사용할 수 있습니다.
  2. CodeBuild는 빌드 도중 생긴 모든 커맨드 라인을 모아서 AWS 관리 콘솔에서 볼수 있습니다.
  3. CodeBuild는 빌드 프로젝트에 지정된 소스 저장소에서 코드를 가져옵니다.
  4. CodeBuild는 빌드 프로젝트에서 지정한 명령을 실행합니다. 각 명령은 프로젝트 빌드 스펙에서 식별된 설치, 사전 빌드, 빌드 및 빌드 후 단계를 포함 할 수 있습니다.
  5. CodeBuild 생성된 실행 파일 또는 결과물(artfacts)를 S3에 업로드합니다. AWS Key Management Service (KMS) 암호화는 선택 사항입니다.
  6. CodeBuild는 빌드에 사용 된 콘테이너를 삭제합니다.

AWS CodePipeline 빌드 서비스 공급자 중 하나로 CodeBuild를 사용할 수 있습니다. 기존 CI/CD 프로세스를 도입하고 있는 경우, 개발 프로세스를 완전히 자동화 할 수 있습니다. CodeBuild는 S3 및 AWS Identity and Access Management (IAM)와 같은 다른 AWS 서비스를 사용합니다.

선별된 빌드 환경에는 AWS CLI 및 AWS SDK가 포함됩니다. 이를 통해 CodePipelineAWS SAM를 사용하여 서버가 필요없는 응용 프로그램을 위한 완전 자동화된 CI/CD 워크 플로우를 만들 수 있습니다. npm 또는 pip 패키지를 만들고 AWS CLI를 사용하여 패키징 및 배포할 수 있습니다.

CodeBuild의 모든 기능은 AWS 관리 콘솔, API 또는 AWS 명령 줄 인터페이스(CLI)를 통해 실행할 수 있습니다.

AWS CodeBuild 사용해 보기
우선 전체 빌드 작업을 다 해 보기 보다는 우선 AWS CodeBuild  스크린샷을 통애 주요 기능에 대해 먼저 알려드리겠습니다.

아래는 빌드 목록 입니다.

하나의 빌드에 대한 상세 정보를 볼 수 있습니다.

빌드 기록도 볼 수 있습니다.

AWS CodeBuildAWS CodePipeline 빌드 서비스 제공자로 사용 가능합니다.

정식 출시
AWS CodeBuild는 정식 출시 되어 오늘부터 사용할 수 있습니다. 현재 리눅스 빌드 지원이 되며 향후 윈도 지원도 추가할 예정입니다.

Jeff;

이 글은 AWS re:Invent 2016 신규 출시 소식으로 AWS CodeBuild – Fully Managed Build Service의 한국어 번역입니다. re:Invent 출시 소식에 대한 자세한 정보는 12월 온라인 세미나를 참고하시기 바랍니다.