ASP.NET Core アプリを App Engine にデプロイする

1. 概要

ASP.NET Core は、インターネットに接続された最新のクラウドベースのアプリケーションを C# プログラミング言語を使用してビルドするための、オープンソースの新しいクロスプラットフォーム フレームワークです。

このラボでは、シンプルな ASP.NET Core アプリを App Engine フレキシブル環境にデプロイします。この Codelab は、Google Cloud Shell から ASP.NET Core アプリをビルドして起動する Codelab をベースにしています。このラボを実行する前に、先にラボを完了しておくことをおすすめします。

App Engine アプリケーションは構築やメンテナンスが簡単で、トラフィックやデータ ストレージの増加に応じたスケーリングも容易です。App Engine 環境では、サーバー管理の手間がかかりません。必要な作業は、アプリケーションをアップロードすることだけです。

App Engine アプリケーションは、受信したトラフィック量に応じて自動的にスケールします。App Engine は負荷分散やマイクロサービス、認証、SQL および NoSQL データベース、Memcache、トラフィック分割、ロギング、検索、バージョニング、ロールアウトとロールバック、セキュリティ スキャニングをネイティブでサポートしており、どれも高度にカスタマイズすることができます。

App Engine 環境にはスタンダード環境フレキシブル環境があり、C#、Java、Python、PHP、Node.js、Go をはじめとするプログラミング言語のホストをサポートしています。2 つの環境はそれぞれに固有の長所があるため、ユーザーは自身のアプリケーションの特徴に応じて柔軟に選ぶことができます。詳しくは、App Engine 環境の選択をご覧ください。

学習内容

  • シンプルな ASP.NET Core アプリを Docker コンテナとしてパッケージ化する
  • シンプルな ASP.NET Core アプリを App Engine にデプロイする

必要なもの

  • Google Cloud Platform プロジェクト
  • ブラウザ(ChromeFirefox など)

このチュートリアルの利用方法をお選びください。

通読するのみ 内容を読んで演習を完了する

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 を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 4292cbf4971c9786.png をクリックします。

bce75f34b2c53987.png

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面(スクロールしなければ見えない範囲)が表示されます。その場合は、[続行] をクリックします(今後表示されなくなります)。この中間画面は次のようになります。

70f315d7b402b476.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

fbe3a0674c982259.png

この仮想マシンには、必要な開発ツールがすべて含まれています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボでの作業のほとんどは、ブラウザまたは 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 >Images フォルダ内に、アプリケーションの画像が表示されます。

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

publish ディレクトリに移動します。

cd bin/Release/netcoreapp3.1/publish/

これで、アプリの新しいバージョン(この場合は v1)をデプロイできるようになりました。

gcloud app deploy --version v1

デプロイが完了したら、Google Cloud コンソールの [App Engine バージョン] セクションに移動して、すべてのトラフィックを処理する新しいバージョンのアプリを確認し、新しいメッセージを表示できます。

8cc0cc992b4e07ed.png

9. ダッシュボードとトラフィック分割

App Engine の [ダッシュボード] セクションには、レイテンシや CPU などに関するアプリケーションのダッシュボードが多数表示されます。ご自身で確認してみてください。

5c879431935b080d.png

[Versions] セクションには、デプロイされたアプリのバージョンが表示され、[Traffic Splitting] セクションで異なるバージョンにトラフィックを分割できます。トラフィックを 2 つのバージョンに分割します。

176a2e22e755b6d3.png

10. 完了

クリーンアップ

今こそ、アプリをシャットダウンして、費用を抑え、クラウド全般に精通するべきです。

App Engine のバージョン セクションに移動します。

7e9b3b4406e785b9.png

バージョンを選択して停止します。

7f80d9ff2c959e0.png

バージョンが停止すると、バッキング インスタンスが削除され、インスタンス数がゼロにプルダウン表示されます。

29f3cb5c71225b2d.png

学習した内容

ここでは、ASP.NET Core アプリを作成し、Docker コンテナとしてパッケージ化して、Google App Engine フレキシブル環境にデプロイしました。

  • シンプルな ASP.NET Core アプリを Docker コンテナとしてパッケージ化する
  • シンプルな ASP.NET Core アプリを App Engine にデプロイする

次のステップ

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。