.NET スタートガイド

このチュートリアルは、Google Cloud の導入において主なアプリ開発のコンセプトを学習したいエンジニアやウェブ デベロッパーなど、クラウドにアプリをビルドするのが初めての人を対象にしています。

目標

アプリのビルドに関する言語固有の他のチュートリアルについては、以下のガイドをご覧ください。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

このチュートリアルでは、Google Cloud の Always Free 枠の上限内でリソースの使用が維持されるよう設計されています。 料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Firestore データベースをネイティブ モードで作成するには、次の手順に沿って操作してください。
    1. Cloud Console で、[Firestore Viewer] ページに移動します。
      Firestore Viewer に移動
    2. [Cloud Firestore モードの選択] 画面から、[ネイティブ モードを選択] をクリックします。
    3. Firestore データベースのロケーションを選択します。このロケーション設定は、Cloud プロジェクトのデフォルトの Google Cloud リソースのロケーションです。このロケーションは、特にデフォルトの Cloud Storage バケットおよび App Engine アプリの、ロケーション設定を必要とする Cloud プロジェクト内の Google Cloud サービスで使用されます。
    4. [データベースを作成] をクリックします。
  5. Cloud Run, Cloud Storage JSON, Cloud Logging, and Error Reporting API を有効にします。

    API を有効にする

  6. Cloud Shell で、アプリのソースコードを開きます。
    Cloud Shell に移動

    Cloud Shell を使用すると、ブラウザからコマンドラインで直接 Google Cloud リソースにアクセスできます。

  7. サンプルコードをダウンロードしてアプリのディレクトリに移動するには、[続行] をクリックします。
  8. Cloud Shell で、gcloud ツールを構成して新しい Google Cloud プロジェクトを使用します。

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    PROJECT_ID を、Cloud Console を使用して作成した Google Cloud プロジェクト ID に置き換えます。

    gcloudコマンドライン ツールは、コマンドラインから Google Cloud リソースを操作する基本的な方法です。このチュートリアルでは、gcloud ツールを使用してアプリをデプロイおよびモニタリングします。

アプリを実行する

  1. アプリを実行します。
    GOOGLE_CLOUD_PROJECT=PROJECT_ID dotnet run
    
    PROJECT_ID は、作成した Google Cloud プロジェクト ID で置き換えます。
  2. Cloud Shell で、[ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] を選択します。新しいウィンドウが開き、実行中のアプリが表示されます。

アプリを Cloud Run にデプロイする

Google Cloud には、コードを実行するためのいくつかのオプションが用意されています。この例では、Cloud Run を使用してスケーラブルなアプリを Google Cloud にデプロイします。Cloud Run ではサーバーの管理が不要なため、コーディングに集中できます。また、トラフィックが急激に跳ね上がった場合も Cloud Run が自動的にスケーリングしてサポートします。

Dockerfile は Cloud Run にアプリの実行方法を指示します。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "Bookshelf.dll"]

Dockerfiles はよりリッチになる可能性がありますが、この構成は多くのアプリで機能します。

Cloud Run は、PORT 環境変数を設定して、リッスンするポートをアプリに指示します。Bookshelf の Program.cs には、PORT 変数を監視してそのポートでリッスンするコードが含まれています。

using Google.Cloud.Diagnostics.AspNetCore;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using System;

namespace Bookshelf
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseGoogleDiagnostics(Startup.GetProjectId(), "Bookshelf", "0.01")
                .UseStartup<Startup>().UsePortEnvironmentVariable();
    }

    static class ProgramExtensions
    {
        // Google Cloud Run sets the PORT environment variable to tell this
        // process which port to listen to.
        public static IWebHostBuilder UsePortEnvironmentVariable(
            this IWebHostBuilder builder)
        {
            string port = Environment.GetEnvironmentVariable("PORT");
            if (!string.IsNullOrEmpty(port))
            {
                builder.UseUrls($"http://0.0.0.0:{port}");
            }
            return builder;
        }
    }
}

ターミナル ウィンドウで、gcloud ツールを使用してアプリを Cloud Run にデプロイします。

  1. アプリをローカルでビルドします。
    dotnet publish -c Release
    
  2. Cloud Build を使用して Docker コンテナをビルドし、Container Registry に公開します。
    gcloud builds submit --tag gcr.io/PROJECT_ID/bookshelf \
        bin/Release/netcoreapp2.1/publish
    
  3. Cloud Run(フルマネージド)でコンテナを実行します。
    gcloud run deploy bookshelf --region us-central1 --platform managed \
        --image gcr.io/PROJECT_ID/bookshelf --allow-unauthenticate
    
    これで、アプリは gcloud run の出力に表示される URL で確認できるようになりました。
    Service [bookshelf] revision [bookshelf-00001] has been deployed and is serving traffic at
    https://bookshelf-lwuhslogjlnpofsxugoc.a.run.app
    
  4. URL を Web ブラウザーにコピーして、アプリを表示します。 Bookshelf アプリのホームページ

Cloud Run へのデプロイの詳細については、Cloud Run のドキュメントをご覧ください。

Firestore でデータを永続化する

Cloud Run インスタンスに情報を保存することはできません。インスタンスを再起動すると情報が失われ、新しいインスタンスが作成されたときにはその情報は存在しないためです。代わりに、すべてのインスタンスが読み取りおよび書き込みするデータベースを使用します。

Google Cloud にはデータ保存のためのいくつかのオプションがあります。この例では、Firestore を使用して各書籍のデータを保存します。Firestore はフルマネージドでサーバーレスの NoSQL ドキュメント データベースであり、データを保存および照会できます。Firestore はアプリのニーズを満たすために自動でスケーリングし、使用しない場合はゼロにスケーリングします。最初の書籍を追加しましょう。

  1. デプロイしたアプリ用の書籍を作成するには、[Add book] をクリックします。

    Bookshelf アプリに書籍を追加する
  2. [Title] フィールドに「Moby Dick」と入力します。
  3. [Author] フィールドに「Herman Melville」と入力します。
  4. [Save] をクリックします。Bookshelf アプリにエントリが追加されました。

    Moby Dick の Bookshelf アプリのエントリ
  5. Cloud Console で、[Cloud Firestore] に移動します。Cloud Firestore に移動します

    データが Firestore に表示されます。Bookshelf アプリは、各書籍を一意の ID とともに Firestore ドキュメントとして保存し、これらのドキュメントはすべて Firestore コレクション内に保存されます。このチュートリアルでは、コレクションを書籍と呼びます。

    Firestore ドキュメントの例。

Firestore は Firestore クライアント ライブラリを使用して書籍を保存します。Firestore ドキュメントを取得する例を次に示します。

using Google.Cloud.Firestore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Bookshelf.Models
{
    class FirestoreBookStore : IBookStore
    {
        private FirestoreDb _firestore;
        private CollectionReference _books;

        public FirestoreBookStore(string projectId)
        {
            _firestore = FirestoreDb.Create(projectId);
            _books = _firestore.Collection("Books");
        }

Firestore の使用の詳細については、Firestore にデータを追加するをご覧ください。

Cloud Storage にファイルのアップロードを保存する

書籍を追加したので、書籍の表紙の画像を追加します。ファイルをインスタンスに保存することはできません。データベースは画像ファイルに適していません。代わりに、Cloud Storage を使用します。

Cloud Storage は Google Cloud 向けのメインの blob ストアです。Cloud Storage を使用して、Google Cloud で共有したいアプリのアセットをホストできます。Cloud Storage を使用するには、データを保存する基本的なコンテナである Cloud Storage バケットを作成する必要があります。

  1. Cloud Console で、[Cloud Storage ブラウザ] ページに移動します。

    Cloud Storage ブラウザページに移動

  2. [バケットを作成] をクリックします。
  3. [バケットを作成] ダイアログで、Google Cloud のプロジェクト ID を文字列 _bucket に付け加えてバケットの名前を入力して、名前を YOUR_PROJECT_ID_bucket のようにします。この名前はバケット名の要件を満たしている必要があります。他のすべてのフィールドはデフォルト値のままにします。
  4. [作成] をクリックします。
  5. バケットの作成後、[Edit book] をクリックして、書籍の表紙としてアップロードする画像を選択します。たとえば、このパブリック ドメインの画像を使用できます。
    Moby Dick の書籍の表紙
  6. [Save] をクリックします。Bookshelf アプリのエントリがあるホームページにリダイレクトされます。
    Moby Dick の Bookshelf アプリのエントリ

Bookshelf アプリは、Cloud Storage クライアント ライブラリを使用して、アップロードされたファイルを Cloud Storage に送信します。

using Google.Cloud.Storage.V1;
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;
using System.Web;

namespace Bookshelf.Services
{
    public class ImageUploader
    {
        private readonly string _bucketName;
        private readonly StorageClient _storageClient;

        public ImageUploader(string bucketName)
        {
            _bucketName = bucketName;
            _storageClient = StorageClient.Create();
        }

Cloud Storage の使用の詳細については、入門ガイドのリストをご覧ください。

Google Cloud のオペレーション スイートを使用したアプリのモニタリング

アプリをデプロイし、書籍を作成して修正しました。ユーザーのためにこのようなイベントをモニタリングするには、アプリケーション パフォーマンス管理を使用します。

Cloud Logging でログをモニタリングする

  1. Google Cloud で、ログビューアに移動します。

    ログビューアに移動する

    アプリをリアルタイムでモニタリングできます。アプリに問題が発生した場合は、まずこちらの画面を確認してください。

    Stackdriver ログビューア
  2. [リソース] プルダウン リストで、[Cloud Run Revision, bookshelf] を選択します。

Error Reporting でエラーをモニタリング

  1. Cloud Console で、[Error Reporting] ページに移動します。
    [Error Reporting] ページに移動
    Error Reporting では、アプリ内のエラーと例外が強調表示され、そのアラートを設定できます。
  2. ブラウザで、アプリの /Home/Throw URL に移動します。
    たとえば、アプリが https://bookshelf-lwuhslogjlnpofsxugoc.a.run.app でホストされている場合は、https://bookshelf-lwuhslogjlnpofsxugoc.a.run.app/Home/Throw に移動します。

    これにより、新しいテストの例外が生成され、Google Cloud のオペレーション スイートに送信されます。

  3. Cloud Console で、[Error Reporting] ページに戻り、しばらくすると新しいエラーが表示されます。[自動再読み込み] をクリックすると、ページを手動で更新する必要がなくなります。

    Error Reporting のエラー メッセージ。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ