App Engine에 ASP.NET Core 앱 배포

1. 개요

ASP.NET Core는 C# 프로그래밍 언어를 사용하여 최신 클라우드 기반 인터넷 연결 애플리케이션을 빌드하기 위한 새로운 오픈소스 및 크로스 플랫폼 프레임워크입니다.

이 실습에서는 간단한 ASP.NET Core 앱을 App Engine 가변형 환경에 배포합니다. 이 Codelab은 Google Cloud Shell에서 ASP.NET Core 앱 빌드 및 실행 Codelab을 기반으로 합니다. 이 실습을 시작하기 전에 해당 실습을 먼저 수행하는 것이 좋습니다.

Google App Engine 애플리케이션은 쉽게 생성, 유지 관리 및 확장할 수 있어 트래픽 및 데이터 저장소의 요구사항이 변화합니다. App Engine을 사용하면 서버를 관리할 필요가 없습니다. 애플리케이션을 업로드하기만 하면 바로 사용할 수 있습니다.

App Engine 애플리케이션은 수신되는 트래픽에 따라 자동으로 확장됩니다. App Engine은 기본적으로 부하 분산, 마이크로서비스, 승인, SQL 및 NoSQL 데이터베이스, Memcache, 트래픽 분할, 로깅, 검색, 버전 관리, 출시 및 롤백, 보안 스캔을 지원하며, 이 모든 기능은 맞춤설정이 가능합니다.

App Engine의 환경인 표준 환경가변형 환경은 C#, Java, Python, PHP, Node.js, Go 등 다양한 프로그래밍 언어를 지원합니다. 각 환경에는 특정한 강점이 있기 때문에 두 가지 환경은 사용자가 애플리케이션 동작 방식에 최대한의 유연성을 제공합니다. 자세한 내용은 App Engine 환경 선택을 참조하세요.

학습할 내용

  • 간단한 ASP.NET Core 앱을 Docker 컨테이너로 패키징하는 방법
  • 간단한 ASP.NET Core 앱을 App Engine에 배포하는 방법

필요한 항목

  • Google Cloud Platform 프로젝트
  • 브라우저(Chrome 또는 Firefox)

본 가이드를 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다. 읽은 다음 연습 활동을 완료할 계획입니다.

귀하의 Google Cloud Platform 사용 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud Console은 고유한 문자열을 자동으로 생성합니다. 일반적으로 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID를 참조해야 하며(일반적으로 PROJECT_ID로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다.
  • 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화4292cbf4971c9786.png를 클릭합니다.

bce75f34b2c53987.png

이전에 Cloud Shell을 시작한 적이 없는 경우 기능을 설명하는 중간 화면 (스크롤해야 볼 수 있는 부분)이 표시됩니다. 이 경우 계속을 클릭합니다 (다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.

70f315d7b402b476.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

fbe3a0674c982259.png

가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. Cloud Shell에서 ASP.NET Core 앱 만들기

Cloud Shell 프롬프트에서 설치된 .NET SDK를 나열하여 dotnet 명령줄 도구가 이미 설치되어 있는지 확인할 수 있습니다.

dotnet --list-sdks

다음으로, 대상 프레임워크가 netcoreapp3.1인 새 기본 ASP.NET Core 웹 앱을 만듭니다.

dotnet new mvc -o HelloWorldAspNetCore -f netcoreapp3.1

그러면 프로젝트가 생성되고 해당 종속 항목이 복원됩니다. 다음과 비슷한 메시지가 표시됩니다.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. ASP.NET Core 앱 실행

앱을 실행할 준비가 거의 다 되었습니다. 앱 폴더로 이동합니다.

cd HelloWorldAspNetCore

마지막으로 앱을 실행합니다.

dotnet run --urls=http://localhost:8080

애플리케이션이 8080 포트에서 수신을 시작합니다.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

앱이 실행 중인지 확인하려면 오른쪽 상단의 웹 미리보기 버튼을 클릭하고 '포트 8080에서 미리보기'를 선택합니다.

Capture.PNG

기본 ASP.NET Core 웹페이지가 표시됩니다.

f579a9baedc108a9.png

앱이 실행되는지 확인한 후 Ctrl+C를 눌러 앱을 종료합니다.

5. ASP.NET Core 앱 게시

이제 dotnet publish 명령어를 사용하여 독립 실행형 DLL을 가져오도록 앱을 게시합니다.

dotnet publish -c Release

publish를 실행하면 프로세스 종료 시 성공적으로 게시된 DLL과 함께 일부 메시지가 표시됩니다.

...
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/HelloWorldAspNetCore.dll
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/HelloWorldAspNetCore.Views.dll
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/publish/

6. App Engine 가변형용 app.yaml 만들기

app.yaml 파일은 App Engine(이 경우 App Engine 가변형 환경)에 앱을 배포하는 방법을 설명합니다.

먼저 publish 폴더로 이동합니다. bin/Release 폴더 아래에 있어야 하지만 정확한 경로는 .NET 버전에 따라 다릅니다.

cd bin/Release/netcoreapp3.1/publish/

publish 폴더 내에 app.yaml 파일을 만듭니다.

cat <<EOT >> app.yaml
env: flex
runtime: aspnetcore
EOT

app.yaml 파일이 환경을 flex로 지정하고 런타임을 aspnetcore로 지정하는 방법을 확인하세요.

7. App Engine 가변형 환경에 배포

gcloud를 사용하여 App Engine 가변형 환경에 앱을 배포할 준비가 되었습니다. publish 디렉터리 내에서 다음을 실행합니다.

gcloud app deploy --version v0

배포 중에 애플리케이션의 리전을 선택하라는 메시지가 표시될 수 있습니다. 앱을 실행할 리전을 선택합니다.

Please choose a region for your application. After choosing a region, 
you cannot change it. Which region would you like to choose?
 [1] europe-west   (supports standard and flexible)
 [2] us-central    (supports standard and flexible)
 [3] us-east1      (supports standard and flexible)
 [4] asia-northeast1 (supports standard and flexible)
 [5] cancel

이렇게 하면 클라우드에 애플리케이션 이미지가 생성되어 이 이미지를 Google Container Registry에 저장하고 App Engine에 배포합니다. 배포 중에 컨테이너 이미지가 빌드되는 것을 실제로 볼 수 있습니다.

Operation completed over 1 objects/571.8 KiB.
BUILD
Step #0: Pulling image: gcr.io/gcp-runtimes/aspnetcorebuild@sha256:d7b7975acb374fc3a9655a4e529993e6270cfa78023885684626528bc379f8eb
Step #0: sha256:d7b7975acb374fc3a9655a4e529993e6270cfa78023885684626528bc379f8eb: Pulling from gcp-runtimes/aspnetcorebuild

최종적으로 앱이 배포되는 것을 확인할 수 있습니다.

...
Deployed service [default] to [https://<project-id>.appspot.com]

애플리케이션을 배포한 후 웹브라우저에서 URL(http://<project-id>.appspot.com)을 열어 애플리케이션을 방문합니다.

새 탭에 기본 ASP.NET Core 웹페이지가 표시됩니다.

f579a9baedc108a9.png

클라우드에서 생성된 컨테이너 이미지도 확인할 수 있습니다. Cloud 콘솔에서 Container Registry로 이동합니다. 이미지를 클릭하면 애플리케이션의 이미지가 appengine 폴더에 표시됩니다.

de788f4949d0c5a.png

8. 서비스의 새 버전 배포

프로덕션에 배포한 애플리케이션에는 버그 수정이나 추가 기능이 필요합니다. App Engine을 사용하면 사용자에게 영향을 주지 않으면서 프로덕션에 새 버전을 배포할 수 있습니다.

먼저 애플리케이션을 수정해 보겠습니다. Cloud Shell에서 코드 편집기를 엽니다.

868c4f615e2331fe.png

HelloWorldAspNetCoreViews/Home 폴더 아래에 있는 Index.cshtml로 이동하여 기본 메시지를 다음과 같이 업데이트합니다.

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud Platform!

변경사항을 저장한 다음 Cloud Shell로 돌아갑니다. HelloWorldAspNetCore, 내에서 앱을 게시하여 독립 실행형 DLL을 가져옵니다.

dotnet publish -c Release

게시 디렉터리로 이동합니다.

cd bin/Release/netcoreapp3.1/publish/

이제 앱의 새 버전 (이 경우 v1)을 배포할 수 있습니다.

gcloud app deploy --version v1

배포가 완료되면 Google Cloud 콘솔의 App Engine 버전 섹션으로 이동하여 새 메시지와 함께 모든 트래픽을 제공하는 새 버전의 앱을 확인할 수 있습니다.

8cc0cc992b4e07ed.png

9. 대시보드 및 트래픽 분할

App Engine의 대시보드 섹션에서 지연 시간, CPU 등에 대한 애플리케이션용 여러 대시보드를 볼 수 있습니다. 직접 탐색해 보세요.

5c879431935b080d.png

버전 섹션에서 앱의 배포된 버전을 확인하고 트래픽 분할 섹션에서 여러 버전 간에 트래픽을 분할할 수 있습니다. 두 버전 간 트래픽을 분할해 보겠습니다.

176a2e22e755b6d3.png

10. 축하합니다.

정리

이제 비용을 절감하고 클라우드를 최대한 활용하려면 앱을 종료해야 합니다.

App Engine의 버전 섹션으로 이동합니다.

7e9b3b4406e785b9.png

버전을 선택하고 중지합니다.

7f80d9ff2c959e0.png

버전이 중지되면 지원 인스턴스가 삭제되고 인스턴스 수가 0으로 내려가는 것을 볼 수 있습니다.

29f3cb5c71225b2d.png

학습한 내용

좋습니다. ASP.NET Core 앱을 만들어 Docker 컨테이너로 패키징한 후 Google App Engine 가변형 환경에 배포했습니다.

  • 간단한 ASP.NET Core 앱을 Docker 컨테이너로 패키징하는 방법
  • 간단한 ASP.NET Core 앱을 App Engine에 배포하는 방법

다음 단계

라이선스

이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.