자습서: Elastic Beanstalk를 사용하여 ASP.NET Core 애플리케이션 배포 - AWS Elastic Beanstalk

자습서: Elastic Beanstalk를 사용하여 ASP.NET Core 애플리케이션 배포

이 자습서에서는 새 ASP.NET Core 애플리케이션을 구축하고 이를 AWS Elastic Beanstalk에 배포하는 프로세스를 안내합니다.

먼저, .NET Core SDK의 dotnet 명령줄 도구를 사용하여 기본 .NET Core 명령줄 애플리케이션을 생성하고, 종속 항목을 설치하며, 코드를 컴파일하고, 애플리케이션을 로컬로 실행합니다. 그런 다음, 기본 Program.cs 클래스를 생성하고, ASP.NET Startup.cs 클래스 및 구성 파일을 추가하여 ASP.NET 및 IIS로 HTTP 요청을 처리하는 애플리케이션을 만듭니다.

마지막으로, Elastic Beanstalk는 배포 매니페스트를 사용하여 단일 서버에 .NET Core 애플리케이션, 사용자 지정 애플리케이션 및 여러 .NET Core 또는 MSBuild 애플리케이션의 배포를 구성합니다. .NET Core 애플리케이션을 Windows Server 환경에 배포하려면 배포 매니페스트로 애플리케이션 소스 번들에 사이트 아카이브를 추가합니다. dotnet publish 명령은 web.config 파일로 번들링할 수 있는 컴파일된 클래스와 종속 항목을 생성하여 사이트 아카이브를 만듭니다. 배포 매니페스트는 Elastic Beanstalk에 사이트를 실행해야 하는 경로를 알리며, 배포 매니페스트를 사용하여 애플리케이션 풀을 구성하고 여러 경로에서 여러 애플리케이션을 실행할 수 있습니다.

애플리케이션 소스 코드는 dotnet-core-tutorial-source.zip에서 확인할 수 있습니다.

배포 가능한 소스 번들은 dotnet-core-tutorial-bundle.zip에서 확인할 수 있습니다.

사전 조건

이 자습서에서는 .NET Core SDK를 사용하여 기본 .NET Core 애플리케이션을 생성하고 이를 로컬로 실행하며 배포 가능한 패키지를 구축합니다.

요구 사항
  • .NET Core(x64) 1.0.1, 2.0.0 이상

.NET Core SDK를 설치하려면
  1. microsoft.com/net/core에서 설치 관리자를 다운로드합니다. Windows를 선택합니다. Download .NET SDK(.NET SDK 다운로드)를 선택합니다.

  2. 설치 관리자를 실행하고 지침을 따릅니다.

이 자습서에서는 명령줄 ZIP 유틸리티를 사용하여 Elastic Beanstalk에 배포할 수 있는 소스 번들을 생성합니다. Windows에서 zip 명령을 사용하려면 UnxUtilszip와 같은 유용한 명령줄 유틸리티의 경량 모음인 ls를 설치하면 됩니다. 또는 Windows Explorer나 기타 ZIP 유틸리티를 사용하여 소스 번들 아카이브를 만들 수도 있습니다.

UnxUtils를 설치하려면
  1. UnxUtils를 다운로드합니다.

  2. 로컬 디렉터리로 아카이브의 압축을 풉니다. 예: C:\Program Files (x86).

  3. Windows PATH 사용자 변수에 바이너리 경로를 추가합니다. 예: C:\Program Files (x86)\UnxUtils\usr\local\wbin.

    1. Windows 키를 누르고 environment variables를 입력합니다.

    2. 계정의 환경 변수 편집을 선택합니다.

    3. 경로를 선택한 다음 편집을 선택합니다.

    4. 세미콜론으로 구분하여 경로를 변수 값 필드에 추가합니다. 예: C:\item1\path;C:\item2\path

    5. 확인을 두 번 선택하여 새 설정을 적용합니다.

    6. 실행 중인 명령 프롬프트 창을 모두 닫은 후 명령 프롬프트 창을 다시 엽니다.

  4. 새 명령 프롬프트 창을 열고 zip 명령을 실행하여 작동하는지 확인합니다.

    > zip -h Copyright (C) 1990-1999 Info-ZIP Type 'zip "-L"' for software license. ...

.NET Core 프로젝트 생성

dotnet 명령줄 도구를 사용하여 새 C# .NET Core 프로젝트를 생성하고 이를 로컬로 실행합니다. 기본 .NET Core 애플리케이션은 Hello World!를 인쇄한 후 종료하는 명령줄 유틸리티입니다.

새 .NET Core 프로젝트를 생성하려면
  1. 새 명령 프롬프트 창을 열고 사용자 폴더로 이동합니다.

    > cd %USERPROFILE%
  2. dotnet new 명령을 사용하여 새 .NET Core 프로젝트를 생성합니다.

    C:\Users\username> dotnet new console -o dotnet-core-tutorial Content generation time: 65.0152 ms The template "Console Application" created successfully. C:\Users\username> cd dotnet-core-tutorial
  3. dotnet restore 명령을 사용하여 종속 항목을 설치합니다.

    C:\Users\username\dotnet-core-tutorial> dotnet restore Restoring packages for C:\Users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj... Generating MSBuild file C:\Users\username\dotnet-core-tutorial\obj\dotnet-core-tutorial.csproj.nuget.g.props. Generating MSBuild file C:\Users\username\dotnet-core-tutorial\obj\dotnet-core-tutorial.csproj.nuget.g.targets. Writing lock file to disk. Path: C:\Users\username\dotnet-core-tutorial\obj\project.assets.json Restore completed in 1.25 sec for C:\Users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj. NuGet Config files used: C:\Users\username\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config Feeds used: https://api.nuget.org/v3/index.json C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
  4. dotnet run 명령을 사용하여 애플리케이션을 구축하고 로컬로 실행합니다.

    C:\Users\username\dotnet-core-tutorial> dotnet run Hello World!

Elastic Beanstalk 환경 시작

Elastic Beanstalk 콘솔을 사용하여 Elastic Beanstalk 환경을 시작합니다. 이 예에서는 .NET 플랫폼을 사용하여 시작합니다. 환경을 시작하고 구성한 후 언제든 새 소스 코드를 배포할 수 있습니다.

환경을 시작하려면(콘솔)
  1. 미리 구성된 다음 링크를 사용하여 Elastic Beanstalk 콘솔을 엽니다. console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. [플랫폼]에서 애플리케이션에 사용되는 언어와 일치하는 플랫폼 및 플랫폼 브랜치를 선택합니다.

  3. 애플리케이션 코드에서 샘플 애플리케이션을 선택합니다.

  4. 검토 및 시작을 선택합니다.

  5. 사용할 수 있는 옵션을 검토하십시오. 사용할 수 있는 옵션을 선택하고 준비가 되면 앱 생성을 선택합니다.

환경을 생성하는 데 약 10분이 걸립니다. 이 시간 동안 소스 코드를 업데이트할 수 있습니다.

소스 코드 업데이트

기본 애플리케이션을 ASP.NET과 IIS를 사용하는 웹 애플리케이션으로 수정합니다.

  • ASP.NET는 .NET용 웹 사이트 프레임워크입니다.

  • IIS는 Elastic Beanstalk 환경의 Amazon EC2 인스턴스에서 애플리케이션을 실행하는 웹 서버입니다.

다음에 대한 소스 코드 예제는 dotnet-core-tutorial-source.zip에서 확인할 수 있습니다.

참고

다음 절차에서는 프로젝트 코드를 웹 애플리케이션으로 변환하는 방법을 보여 줍니다. 프로젝트를 처음부터 웹 애플리케이션으로서 생성하면 프로세스를 간소화할 수 있습니다. 이전 섹션인 .NET Core 프로젝트 생성에서 다음 명령으로 dotnet new 단계의 명령을 수정합니다.

C:\Users\username> dotnet new web -o dotnet-core-tutorial
코드에 ASP.NET 및 IIS 지원을 추가하려면
  1. Program.cs를 애플리케이션 디렉터리로 복사하여 웹 호스트 빌더로 실행합니다.

    예 c:\users\username\dotnet-core-tutorial\Program.cs
    using System; using Microsoft.AspNetCore.Hosting; using System.IO; namespace aspnetcoreapp { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } } }
  2. Startup.cs를 추가하여 ASP.NET 웹 사이트를 실행합니다.

    예 c:\users\username\dotnet-core-tutorial\Startup.cs
    using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; namespace aspnetcoreapp { public class Startup { public void Configure(IApplicationBuilder app) { app.Run(context => { return context.Response.WriteAsync("Hello from ASP.NET Core!"); }); } } }
  3. web.config 파일을 추가하여 IIS 서버를 구성합니다.

    예 c:\users\username\dotnet-core-tutorial\web.config
    <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\dotnet-core-tutorial.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" /> </system.webServer> </configuration>
  4. dotnet-core-tutorial.csproj를 추가합니다. 이 파일은 IIS 미들웨어를 포함하고 web.config 출력의 dotnet publish 파일을 포함합니다.

    참고

    다음 예제는 .NET Core Runtime 2.2.1을 사용하여 개발되었습니다. TargetFramework 요소의 Version 또는 PackageReference 속성 값을 해당 사용자 지정 프로젝트에서 사용하는 .NET Core Runtime 버전과 일치하도록 수정해야 할 수 있습니다.

    예 c:\users\username\dotnet-core-tutorial\dotnet-core-tutorial.csproj
    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.0" /> </ItemGroup> <ItemGroup> <None Include="web.config" CopyToPublishDirectory="Always" /> </ItemGroup> </Project>

다음으로 새 종속 항목을 설치하고 ASP.NET 웹 사이트를 로컬로 실행합니다.

웹 사이트를 로컬로 실행하려면
  1. dotnet restore 명령을 사용하여 종속 항목을 설치합니다.

  2. dotnet run 명령을 사용하여 앱을 구축하고 로컬로 실행합니다.

  3. localhost:5000을 열어 사이트를 봅니다.

웹 서버에서 애플리케이션을 실행하려면 컴파일된 소스 코드를 web.config 구성 파일 및 실행 시간 종속 항목과 번들링해야 합니다. dotnet 도구에는 dotnet-core-tutorial.csproj의 구성에 따라 이러한 파일을 디렉터리에 수집하는 publish 명령이 있습니다.

웹 사이트를 구축하려면
  • dotnet publish 명령을 사용하여 컴파일된 코드와 종속 항목을 site라는 폴더에 출력합니다.

    C:\users\username\dotnet-core-tutorial> dotnet publish -o site

애플리케이션을 Elastic Beanstalk에 배포하려면 사이트 아카이브를 배포 매니페스트와 함께 번들링합니다. Elastic Beanstalk에 실행 방법을 알려 줍니다.

소스 번들을 만들려면
  1. ZIP 아카이브에 사이트 폴더의 파일을 추가합니다.

    참고

    다른 ZIP 유틸리티를 사용하는 경우 결과 ZIP 아카이브의 루트 폴더에 모든 파일을 추가해야 합니다. 이 작업은 애플리케이션을 사용자의 Elastic Beanstalk 환경에 성공적으로 배포하는 데 필요합니다.

    C:\users\username\dotnet-core-tutorial> cd site C:\users\username\dotnet-core-tutorial\site> zip ../site.zip * adding: dotnet-core-tutorial.deps.json (164 bytes security) (deflated 84%) adding: dotnet-core-tutorial.dll (164 bytes security) (deflated 59%) adding: dotnet-core-tutorial.pdb (164 bytes security) (deflated 28%) adding: dotnet-core-tutorial.runtimeconfig.json (164 bytes security) (deflated 26%) adding: Microsoft.AspNetCore.Authentication.Abstractions.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Authentication.Core.dll (164 bytes security) (deflated 57%) adding: Microsoft.AspNetCore.Connections.Abstractions.dll (164 bytes security) (deflated 51%) adding: Microsoft.AspNetCore.Hosting.Abstractions.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Hosting.dll (164 bytes security) (deflated 60%) adding: Microsoft.AspNetCore.Hosting.Server.Abstractions.dll (164 bytes security) (deflated 44%) adding: Microsoft.AspNetCore.Http.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.AspNetCore.Http.dll (164 bytes security) (deflated 55%) adding: Microsoft.AspNetCore.Http.Extensions.dll (164 bytes security) (deflated 50%) adding: Microsoft.AspNetCore.Http.Features.dll (164 bytes security) (deflated 50%) adding: Microsoft.AspNetCore.HttpOverrides.dll (164 bytes security) (deflated 49%) adding: Microsoft.AspNetCore.Server.IISIntegration.dll (164 bytes security) (deflated 46%) adding: Microsoft.AspNetCore.Server.Kestrel.Core.dll (164 bytes security) (deflated 63%) adding: Microsoft.AspNetCore.Server.Kestrel.dll (164 bytes security) (deflated 46%) adding: Microsoft.AspNetCore.Server.Kestrel.Https.dll (164 bytes security) (deflated 44%) adding: Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll (164 bytes security) (deflated 56%) adding: Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll (164 bytes security) (deflated 51%) adding: Microsoft.AspNetCore.WebUtilities.dll (164 bytes security) (deflated 55%) adding: Microsoft.Extensions.Configuration.Abstractions.dll (164 bytes security) (deflated 48%) adding: Microsoft.Extensions.Configuration.Binder.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.Configuration.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.Configuration.EnvironmentVariables.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.Configuration.FileExtensions.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.DependencyInjection.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.Extensions.DependencyInjection.dll (164 bytes security) (deflated 53%) adding: Microsoft.Extensions.FileProviders.Abstractions.dll (164 bytes security) (deflated 46%) adding: Microsoft.Extensions.FileProviders.Physical.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.FileSystemGlobbing.dll (164 bytes security) (deflated 49%) adding: Microsoft.Extensions.Hosting.Abstractions.dll (164 bytes security) (deflated 47%) adding: Microsoft.Extensions.Logging.Abstractions.dll (164 bytes security) (deflated 54%) adding: Microsoft.Extensions.Logging.dll (164 bytes security) (deflated 48%) adding: Microsoft.Extensions.ObjectPool.dll (164 bytes security) (deflated 45%) adding: Microsoft.Extensions.Options.dll (164 bytes security) (deflated 53%) adding: Microsoft.Extensions.Primitives.dll (164 bytes security) (deflated 50%) adding: Microsoft.Net.Http.Headers.dll (164 bytes security) (deflated 53%) adding: System.IO.Pipelines.dll (164 bytes security) (deflated 50%) adding: System.Runtime.CompilerServices.Unsafe.dll (164 bytes security) (deflated 43%) adding: System.Text.Encodings.Web.dll (164 bytes security) (deflated 57%) adding: web.config (164 bytes security) (deflated 39%) C:\users\username\dotnet-core-tutorial\site> cd ../
  2. 사이트 아카이브를 가리키는 배포 매니페스트를 추가합니다.

    예 c:\users\username\dotnet-core-tutorial\aws-windows-deployment-manifest.json
    { "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "test-dotnet-core", "parameters": { "appBundle": "site.zip", "iisPath": "/", "iisWebSite": "Default Web Site" } } ] } }
  3. zip 명령을 사용하여 이름이 dotnet-core-tutorial.zip인 소스 번들을 만듭니다.

    C:\users\username\dotnet-core-tutorial> zip dotnet-core-tutorial.zip site.zip aws-windows-deployment-manifest.json adding: site.zip (164 bytes security) (stored 0%) adding: aws-windows-deployment-manifest.json (164 bytes security) (deflated 50%)

애플리케이션 배포

소스 번들을 생성한 Elastic Beanstalk 환경에 배포합니다.

소스 번들은 dotnet-core-tutorial-bundle.zip에서 다운로드할 수 있습니다.

소스 번들을 배포하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  3. 환경 개요 페이지에서 [업로드 및 배포]를 선택합니다.

  4. 화면에 표시되는 대화 상자를 사용하여 소스 번들을 업로드합니다.

  5. 배포(Deploy)를 선택합니다.

  6. 배포가 완료되면 사이트 URL을 선택하여 새 탭에서 웹 사이트를 열 수 있습니다.

애플리케이션은 단순히 Hello from ASP.NET Core!를 응답에 작성하고 반환합니다.

환경을 시작하면 다음 리소스가 만들어집니다.

  • EC2 인스턴스(EC2 instance) - 선택한 플랫폼에서 웹 앱을 실행하도록 구성된 Amazon Elastic Compute Cloud(Amazon EC2) 가상 머신입니다.

    특정 언어 버전, 프레임워크, 웹 컨테이너 또는 그 조합을 지원하도록 각 플랫폼마다 특정 소프트웨어, 구성 파일 및 스크립트 세트를 실행합니다. 대부분의 플랫폼에서는 웹 앱 앞에 위치해 웹 앱으로 요청을 전달하고, 정적 자산을 제공하고, 액세스 및 오류 로그를 생성하는 역방향 프록시로 Apache 또는 NGINX를 사용합니다.

  • 인스턴스 보안 그룹(Instance security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 로드 밸런서의 HTTP 트래픽이 웹 앱을 실행하는 EC2 인스턴스에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

  • 로드 밸런서(Load balancer) - 애플리케이션을 실행하는 인스턴스로 요청을 분산하도록 구성된 Elastic Load Balancing 로드 밸런서입니다. 또한 로드 밸런서가 있으면 인터넷에 인스턴스를 직접 노출할 필요가 없습니다.

  • 로드 밸런서 보안 그룹(Load balancer security group) - 포트 80에서 인바운드 트래픽을 허용하도록 구성된 Amazon EC2 보안 그룹입니다. 이 리소스를 통해 인터넷의 HTTP 트래픽이 로드 밸런서에 도달할 수 있습니다. 기본적으로 다른 포트에서는 트래픽이 허용되지 않습니다.

  • Auto Scaling 그룹(Auto Scaling group) - 인스턴스가 종료되거나 사용할 수 없게 될 경우 인스턴스를 대체하도록 구성된 Auto Scaling 그룹입니다.

  • Amazon S3 버킷(Amazon S3 bucket) - Elastic Beanstalk 사용 시 생성된 소스 코드, 로그 및 기타 아티팩트의 스토리지 위치입니다.

  • Amazon CloudWatch 경보(Amazon CloudWatch alarms) - 환경의 인스턴스에 대한 로드를 모니터링하는 두 개의 CloudWatch 경보로, 로드가 너무 높거나 너무 낮은 경우 트리거됩니다. 경보가 트리거되면 이에 대한 응답으로 Auto Scaling 그룹이 확장 또는 축소됩니다.

  • AWS CloudFormation 스택 – Elastic Beanstalk은 AWS CloudFormation을 사용하여 환경의 리소스를 시작하고 구성 변경 사항을 전파합니다. 리소스는 AWS CloudFormation 콘솔에서 볼 수 있는 템플릿에서 정의됩니다.

  • 도메인 이름(Domain name) - subdomain.region.elasticbeanstalk.com 형식으로 웹 앱으로 라우팅되는 도메인 이름입니다.

이러한 모든 리소스는 Elastic Beanstalk에서 관리합니다. 사용자가 환경을 종료하면 Elastic Beanstalk는 환경에 있는 모든 리소스를 종료합니다.

참고

Elastic Beanstalk에서 생성하는 Amazon S3 버킷은 환경 간에 공유되며 환경을 종료해도 삭제되지 않습니다. 자세한 내용은 Amazon S3에서 Elastic Beanstalk 사용 섹션을 참조하세요.

정리

Elastic Beanstalk 작업을 완료하면 환경을 종료할 수 있습니다. Elastic Beanstalk는 Amazon EC2 인스턴스, 데이터베이스 인스턴스, 로드 밸런서, 보안 그룹, 경보 등 환경과 연결된 모든 AWS 리소스를 종료합니다.

Elastic Beanstalk 환경을 종료하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경의 이름을 선택합니다.

    참고

    환경이 많은 경우 검색 창을 사용하여 환경 목록을 필터링합니다.

  3. 작업(Actions)을 선택한 후 환경 종료(Terminate Environment)를 선택합니다.

  4. 화면에 표시되는 대화 상자를 사용하여 환경 종료를 확인합니다.

Elastic Beanstalk로 언제든지 애플리케이션을 위한 새로운 환경을 쉽게 생성할 수 있습니다.

다음 단계

애플리케이션을 계속 개발하다 보면 .zip 파일을 수동으로 생성하여 이를 Elastic Beanstalk 콘솔에 업로드하지 않고도 환경을 관리하고 애플리케이션을 배포할 수 있습니다. Elastic Beanstalk 명령줄 인터페이스(EB CLI)는 명령줄에서 애플리케이션을 만들고 구성하고 Elastic Beanstalk 환경에 배포하기 위한 사용하기 쉬운 명령을 제공합니다.

Visual Studio를 사용하여 애플리케이션을 개발하는 경우 AWS Toolkit for Visual Studio를 사용하여 변경 사항을 배포하고, Elastic Beanstalk 환경을 관리하고, 다른 AWS 리소스를 관리할 수도 있습니다. 자세한 내용은 The AWS Toolkit for Visual Studio를 참조하십시오.

개발 및 테스트를 위해 환경에 관리형 DB 인스턴스를 직접 추가하는 Elastic Beanstalk 기능을 사용할 수도 있습니다. 환경 내부에서 데이터베이스를 설정하는 지침은 Elastic Beanstalk 환경에 데이터베이스 추가 단원을 참조하세요.

마지막으로, 프로덕션 환경에서 애플리케이션을 사용하려는 경우 환경의 사용자 지정 도메인 이름을 구성하고 보안 연결을 위해 HTTPS를 활성화합니다.