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

今回は、シンプルな ASP.NET Core アプリを Google App Engine フレキシブル環境にデプロイします。このコードラボは、別のコードラボ「Google Cloud Shell で ASP.NET Core アプリをビルドして起動する」の内容に基づいています。したがって、本コードラボの前にそちらのコードラボに取り組んでいただくことをお勧めします。

Google App Engine のアプリケーションは簡単に作成、メンテナンスでき、トラフィックやデータ ストレージのニーズの変化に応じたスケーリングも容易に行えます。Google App Engine があれば、サーバーを管理する必要はありません。アプリケーションをアップロードするだけで、すぐに運用を開始できます。

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

Google App Engine の環境にはスタンダード環境フレキシブル環境があり、C# や Java、Python、PHP、Node.js、Go をはじめとするプログラミング言語のホストをサポートしています。この 2 つの環境それぞれが一定の強度を持っているので、ユーザーはアプリケーションの動作方法をとても柔軟に決めることができます。詳細については「Google App Engine 環境の選択」をご覧ください。

学習すること

必要になるもの

チュートリアルの使用目的を教えてください

通読のみ 通読して、演習を行う

Google Cloud Platform の使用経験を教えてください

初心者 中級者 上級者

自分のペースで進める環境のセットアップ

まだ Google Account(Gmail または G Suite)をお持ちでない場合は、アカウントを作成する必要があります。アカウントを作成後、Google Cloud Platform Console(console.cloud.google.com)にサインインして、新規プロジェクトを作成します。

プロジェクト ID を覚えておいてください(プロジェクト名とは異なります)。この ID は、すべての Google Cloud Platform プロジェクトに使用する一意の名前です。プロジェクト ID はこのコードラボの後半で PROJECT_ID として参照します。

次に、Google Cloud Platform のリソースを使用できるように、Google Cloud Console で課金を有効にする必要があります。

Google Cloud Shell を起動する

Google Cloud はラップトップからリモートで操作できるため、本コードラボでは、Cloud で動作するコマンドライン環境である Google Cloud Shell を使用します。この Debian ベース仮想マシンには、必要なすべての開発ツール (docker、gcloud、kubectl など) がロードされています。それは、永続的な 5GB ホームディレクトリを提供し、Google Cloud で動作し、ネットワーク性能と認証を大幅に改善します。そのため、本コードラボに必要なものは、ブラウザのみです (本コードラボは Chromebook でも動作します)

Google Cloud Shell をアクティブにするには、開発者コンソールで右上のボタンをクリックするだけです (プロビジョニングと環境への接続には数分しかかかりません)。

クラウド シェルに接続すると、すでに認証済みであり、プロジェクトがすでに PROJECT_ID に設定されていることが分かります。

$ gcloud auth list
認定済みアカウント:
 - <myaccount>@<mydomain>.com (アクティブ)
$ gcloud config list project
[core]
project = <PROJECT_ID>

何かしらの理由でプロジェクトが設定されていない場合、次のコマンドを発行してください。

$ gcloud config set project <PROJECT_ID>

PROJECT_ID が分かりませんか?セットアップステップでどの ID を使用したかを確認するか、コンソール ダッシュボードで検索してください。

Cloud Shellのプロンプトにてはコマンドラインツールがインストールされているので、dotnet コマンドを実行して確認してみましょう。

dotnet

インストールされている .NET Coreのバージョンが確認できます

Microsoft .NET Core Shared Framework Host
  Version  : 1.0.1
  Build    : cee57bf6c981237d80aa1631cfe83cb9ba329f12
...

次に最初の ASP.NET Coreアプリケーションのためにプロジェクトフォルダを作成します

mkdir HelloWorldAspNetCore

そのフォルダに移動します

cd HelloWorldAspNetCore

ASP.NET Coreのウェブアプリケーションのスケルトンを dotnet コマンドを使って作成します。

dotnet new -t web

dotnet コマンドを使うのが初めてなので、初期化メッセージがいくつか表示にされた後プロジェクト作成についてのメッセージが表示されます

Welcome to .NET Core!
---------------------
Learn more about .NET Core @ https://aka.ms/dotnet-docs

..
Decompressing 100% 2568 ms
Expanding 100% 11018 ms
Created new C# project in /home/atameldev/HelloWorldAspNetCore.

これにより、プロジェクトフォルダにたくさんのファイルが作成されます。デフォルトではASP.NET Core アプリケーションは5000ポートを使いますが、8080ポートに変更しましょう

This creates a number of files in your project folder. By default, ASP.NET Core apps use port 5000. Let's change that to port 8080.

Program.cs を見つけます。任意のエディター(emacs、vim、nano など)を使用してメイン メソッドを変更し、UseUrls メソッドを追加してホストをポート 8080 に結合します。メイン メソッドは以下のようになります。

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseUrls("http://*:8080")
                .Build();
    host.Run();
}

もうすぐアプリケーションを動かせるところまできましたが、依存関係をリストアさせる必要があります。

dotnet restore

このコマンドはNuGet依存関係を全てダウンロードします。最後にリストア完了メッセージを確認することができます。

...
log  : Restore completed in 16298ms.

最後にアプリケーションを実行しましょう。いくつか依存関係についての警告メッセージが表示されると思いますが、これは無視して問題ありません。

dotnet run

アプリケーションがポート8080でリッスンしながら起動します。

...
Now listening on: http://*:8080
Application started. Press Ctrl+C to shut down.

アプリケーションが動作していることを確認するため、「Preview on port 8080」を選択して、webプレビューを見てみましょう

新しいタブにASP.NET Coreのデフォルトページが確認できるかと思います。

それでは、dotnet publish コマンドを用いてアプリケーションをパブリッシュし、自己完結型のDLLを入手しましょう

dotnet publish -c Release

publish を実行するといくつかのメッセージが続いたあと、プロセスの最後にパブリッシュが成功したというメッセージが表示されます

...
Publishing HelloWorldAspNetCore for .NETCoreApp,Version=v1.0
[16:47:53] Using gulpfile ~/HelloWorldAspNetCore/gulpfile.js
...
Published 1/1 projects successfully

次に、Google App Engine フレキシブル環境で実行するアプリを準備します。最初に、コンテナとその内容を定義します。Docker のインストールについては心配いりません。Google App Engine フレキシブルではデプロイ プロセスの一環として、リモートで Docker イメージを作成できるので、Docker をインストールする必要はありません。

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

cd bin/Release/netcoreapp1.0/publish/

Docker イメージを定義するための Dockerfile を作成します。

touch Dockerfile

任意のエディター(vimnano または emacs)を使用して、以下の内容を Dockerfile に追加します。

FROM microsoft/dotnet:1.0.1-runtime
COPY . /app
WORKDIR /app

EXPOSE 8080/tcp
ENV ASPNETCORE_URLS http://*:8080

ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

Dockerfile は公式なMicrosoft イメージを基盤にしています。このイメージは .NET Core アプリを実行するようにあらかじめ構成されており、アプリの実行に必要なアプリ ファイルやツールをディレクトリから追加します。

使用する Dockerfile の重要な構成の 1 つは、アプリが受信トラフィックをリッスンするポートをGoogle App Engine フレキシブル環境の要件に従って 8080 に設定していることです。これは、ASP.NET Core アプリがリッスンするポートを決めるために使用する環境変数の ASPNETCORE_URLS を設定することによって行います。

app.yaml ファイルには、アプリを Google App Engine にデプロイする方法が記述されており、この場合は Google App Engine フレキシブル環境です。app.yaml の生成には、Google Cloud SDK の gcloud コマンドライン ツールを使用できます。以下のコマンドを publish フォルダで実行します。

gcloud beta app gen-config --custom

app.yaml ファイルが生成されました。

Writing [app.yaml] to [/home/<project-id>/HelloWorldAspNetCore/bin/Release/netcoreapp1.0/publish].

生成された app.yaml ファイルを見てみましょう。このファイルでは環境がフレキシブルに、ランタイムがカスタムに指定されています。

env: flex
runtime: custom

Dockerfile ファイルと app.yaml ファイルを publish ディレクトリに保存したら、gcloud を使用してアプリを Google App Engine フレキシブル環境にデプロイできるようになります。以下のプロンプトを実行するだけで、Google App Engine アプリケーションが作成されます。

gcloud app deploy

デプロイの最中に、アプリケーションのリージョンを選択するように求められます。その際は、必ずフレキシブル環境をサポートするリージョンを選択してください。

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)
 [2] us-central    (supports standard and flexible)
 [3] us-east1      (supports standard and flexible)
 [4] asia-northeast1 (supports standard and flexible)
 [5] cancel

アプリがデプロイされたことが表示されます。

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

アプリケーションがデプロイされたら、ウェブ ブラウザで URL:http://<project-id>.appspot.com を開いてアプリにアクセスします。

新しいタブにデフォルトの ASP.NET Core ウェブページが表示されます。

クリーンアップ

本コードラボ終了後に不要な請求を防ぐためにアプリをシャットダウンしましょう。

[App Engine] の [バージョン] に移動します。

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

バージョンを停止させるとバッキング インスタンスが削除され、インスタンス数が減少してゼロになるのがわかります。

学習したこと

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

次のステップ

ライセンス

この資料は、Creative Commons 表示 2.0 ジェネリック・ライセンスの許可を得ています。