Hello Cloud Run with C#

6a5cf23c8e20491f.png

Cloud Runは、HTTPリクエストを介して呼び出し可能なステートレスコンテナを実行できるようにするマネージドコンピューティングプラットフォームです。 Cloud Runはサーバーレスです。すべてのインフラストラクチャ管理を抽象化するため、最も重要なことに集中できます。つまり、優れたアプリケーションを構築できます。

これは、から構築されKnativeあなたは、完全にクラウドランで管理、またはあなたにあなたのコンテナを実行することを選択させる、 GoogleのKubernetesエンジンGKE上の雲を実行してクラスタ。

このコードラボの目標は、コンテナーイメージを構築し、それをCloudRunにデプロイすることです。

セルフペース環境のセットアップ

  1. Cloud Consoleにサインインして、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します。 (GmailまたはG Suiteアカウントをまだお持ちでない場合は、作成する必要があります。)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXG

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQ

8-tA_Lheyo8Ss​​cAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6

プロジェクトIDを覚えておいてください。これは、すべてのGoogle Cloudプロジェクトで一意の名前です(上記の名前はすでに使用されているため、機能しません。申し訳ありません)。このコードラボでは、後でPROJECT_IDと呼びます。

  1. 次に、Google Cloudリソースを使用するには、 CloudConsole課金有効にする必要があります。

このコードラボを実行することは、たとえあったとしても、それほど費用がかからないはずです。このチュートリアル以外に請求が発生しないように、リソースをシャットダウンする方法を説明する「クリーンアップ」セクションの指示に必ず従ってください。 Google Cloudの新規ユーザーは、 300米ドルの無料トライアルプログラムの対象となります。

Google Cloud Shell

Google Cloudはラップトップからリモートで操作できますが、このコードラボでは、クラウドで実行されるコマンドライン環境であるGoogle CloudShellを使用します

このDebianベースの仮想マシンには、必要なすべての開発ツールがロードされています。永続的な5GBのホームディレクトリを提供し、Google Cloudで実行されるため、ネットワークのパフォーマンスと認証が大幅に向上します。つまり、このコードラボに必要なのはブラウザだけです(はい、Chromebookで動作します)。

  1. クラウドコンソールからクラウドシェルをアクティブ化するには、[クラウドシェルのアクティブ化]をクリックするだけです。 fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7 (プロビジョニングして環境に接続するのに少し時間がかかるはずです)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe

スクリーンショット2017-06-14at 10.13.43 PM.png

Cloud Shellに接続すると、認証済みであり、プロジェクトがPROJECT_ID設定されていることがわかります。

gcloud auth list

コマンド出力

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

PROJECT_IDをお探しですか?セットアップ手順で使用したIDを確認するか、CloudConsoleダッシュボードで確認してください。

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3h

Cloud Shellは、デフォルトでいくつかの環境変数も設定します。これは、将来のコマンドを実行するときに役立つ場合があります。

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>
  1. 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
gcloud config set compute/zone us-central1-f

さまざまなゾーンを選択できます。詳細については、「リージョンとゾーン」を参照してください。

Cloud RunAPIを有効にする

Cloud Shellから、Cloud RunAPIを有効にします。

gcloud services enable run.googleapis.com

これにより、次のような成功したメッセージが生成されます。

$ gcloud services enable run.googleapis.com
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

HTTPリクエストに応答する単純なASP.NETC#アプリケーションを構築します。

アプリケーションを作成するには、 dotnetコマンドラインツールを使用します。

dotnet new web -o helloworld-csharp

helloworld-csharpディレクトリに移動します。

cd helloworld-csharp

次に、更新CreateHostBuilder中に定義Program.csするためのポートURL指定して.UseUrls()サービングポートを定義します。サンプルはポート8080を示していますが、他のポートを使用することもできます。サーバーは、ここで指定したポートをリッスンする必要があります。

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

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

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            string port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
            string url = String.Concat("http://0.0.0.0:", port);

            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls(url);
                });
        }
    }
}

更新app.Run(...)内のステートメントStartup.cs読んで、返すためにTARGET環境変数を:

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace helloworld_csharp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    var target = Environment.GetEnvironmentVariable("TARGET") ?? "World";
                    await context.Response.WriteAsync($"Hello {target}!\n");
                });
            });
        }
    }
}

このコードは、 PORT環境変数で定義されたポートをリッスンし、 HelloTARGET環境変数の値で応答する基本的なWebサーバーを作成します。これで、アプリをコンテナ化してテストし、Google ContainerRegistryにアップロードする準備が整いました。

Cloud Shellでローカルに実行することで、アプリをテストできます。ポート8080でリッスンしていることがわかります。

$ dotnet run
Using launch settings from /home/atameldev/helloworld-csharp/Properties/launchSettings.json...
Hosting environment: Development
Content root path: /home/atameldev/helloworld-csharp
Now listening on: http://0.0.0.0:8080
Application started. Press Ctrl+C to shut down.

サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリにDockerfileという名前の新しいファイルを作成し、次のコンテンツをコピーします。

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out


# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "helloworld-csharp.dll"]

次に、Dockerfileを含むディレクトリから次のコマンドを実行して、CloudBuildを使用してコンテナイメージをビルドします。

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld

レジストリにプッシュされると、イメージ名( gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld )を含むSUCCESSメッセージが表示されます。イメージはコンテナレジストリに保存され、必要に応じて再利用できます。

次のコマンドを使用して、現在のプロジェクトに関連付けられているすべてのコンテナイメージを一覧表示できます。

gcloud container images list

Cloud Shellからローカルでアプリケーションを実行してテストする場合は、次の標準のdockerコマンドを使用してアプリケーションを起動できます。

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld

...そして、 Webプレビュー機能を使用してポート8080をポイントします。CloudShellウィンドウで、Webプレビューをクリックし、[ポート8080でプレビュー]を選択します。これにより、「HelloWorld!」を表示するブラウザウィンドウが開きます。メッセージ。 curl localhost:8080使用することもできます。

コンテナ化されたアプリケーションのgcr.io/cloudrun/helloへのデプロイは、次のコマンドを使用して実行されます(これを、ビルドしたアプリの正しいイメージ名に調整するか、 gcr.io/cloudrun/helloビルド済みイメージを使用してgcr.io/cloudrun/hello )。

gcloud run deploy --image gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld --platform managed

プロンプトが表示されたら:

  • 地域を選択します(たとえば、 us-central1
  • サービス名を確認してください
  • yに応答して、認証されていない呼び出しを許可します(この最後の手順は重要であり、 --allow-unauthenticatedオプションを使用して回避することもできます)。

次に、展開が完了するまでしばらく待ちます。成功すると、コマンドラインにサービスURLが表示されます。

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

これで、WebブラウザーでサービスURLを開くことにより、デプロイされたコンテナーにアクセスできます。

63260b4d3aee42b8.png

おめでとう!コンテナイメージにパッケージ化されたアプリケーションをCloudRunにデプロイしました。 Cloud Runは、受信したリクエストを処理するためにコンテナイメージを自動的かつ水平方向にスケーリングし、需要が減少するとスケールダウンします。リクエストの処理中に消費されたCPU、メモリ、ネットワークに対してのみ料金を支払います。

サービスが使用されていない場合、Cloud Runは課金されませんが、ビルドされたコンテナーイメージの保存に対して課金される場合があります。

GCPプロジェクトを削除して料金が発生しないようにするか、プロジェクト内で使用されているすべてのリソースの請求を停止するか、次のコマンドを使用してhelloworldイメージを削除することができます。

gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld

Cloud Runサービスを削除するには、次のコマンドを使用します。

gcloud run services delete helloworld

次の良いステップは、GKEのクラウド実行にデプロイすることです

コードソースからクラウド実行に適したステートレスHTTPコンテナを構築し、それをコンテナレジストリにプッシュする方法の詳細については、以下を参照してください。