サービスの健全性を使用してクロスリージョン フェイルオーバーを自動化する

このガイドでは、外部トラフィックの自動フェイルオーバーとフェイルバックを備えた高可用性のマルチリージョン Cloud Run サービスをデプロイする方法について説明します。サーバーレス NEG、グローバル外部アプリケーション ロードバランサ、準備状況プローブを設定することで、これらの機能を備えた Cloud Run サービスを構成できます。詳細については、複数のリージョンからのトラフィックを処理するをご覧ください。

目標

このチュートリアルの内容は次のとおりです。

  1. サンプル アプリケーションを準備する
  2. 準備状況プローブを使用して 2 つのリージョンに Cloud Run サービスをデプロイする
  3. グローバル外部アプリケーション ロードバランサを設定する
  4. サーバーレス NEG を介してサービスを追加する
  5. フェイルオーバーをテストする

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Artifact Registry、Cloud Build、Cloud Run Admin API、Network Services API、Compute Engine の API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API を有効にする

  7. gcloud CLI をインストールして初期化します
  8. コンポーネントを更新します。
    gcloud components update
  9. このチュートリアルで使用する構成変数を設定します。
    PROJECT_ID= gcloud config set core/project PROJECT_ID
    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    SERVICE=health-example
    REGION_A=us-west1
    REGION_B=europe-west1
    PROJECT_ID は Google Cloud プロジェクト ID に置き換えます。

必要なロールを設定する

ビルドを使用してソースからデプロイするには、ユーザーまたは管理者が Cloud Build サービス アカウントに次の IAM ロールを付与する必要があります。

クリックして Cloud Build サービス アカウントに必要なロールを表示

この動作をオーバーライドしない限り、Cloud Build は、ソースコードと Cloud Run リソースのビルドにデフォルトの Cloud Build サービス アカウントとして Compute Engine のデフォルトのサービス アカウントを自動的に使用します。Cloud Build がソースをビルドできるようにするには、プロジェクトの Compute Engine のデフォルトのサービス アカウントに Cloud Run ビルダーroles/run.builder)を付与するよう管理者に依頼します。

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

PROJECT_NUMBER は Google Cloudプロジェクト番号に、PROJECT_ID は Google Cloudプロジェクト ID に置き換えます。プロジェクト ID とプロジェクト番号を確認する方法については、プロジェクトの作成と管理をご覧ください。

Compute Engine のデフォルト サービス アカウントに Cloud Run ビルダーのロールを付与すると、反映されるまでに数分かかることがあります。

ファイルと Cloud Storage バケットにアクセスするためにサービス ID に必要な権限を取得するには、サービス ID に ストレージ管理者roles/storage.admin)ロールを付与するよう 管理者に依頼してください。 Cloud Storage のロールと権限の詳細については、 Cloud Storage の IAM をご覧ください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、 デプロイ権限アクセスの管理をご覧ください。

サンプル アプリケーションを準備する

使用するコードサンプルを取得するには:

  1. ローカルマシンにサンプル リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/golang-samples
    
  2. Cloud Run のサンプルコードが含まれているディレクトリに移動します。

    cd golang-samples/run/service-health
    

準備状況プローブを使用して 2 つのリージョンに Cloud Run サービスをデプロイする

フェイルオーバーには、異なるリージョンのサービスが 少なくとも 2 つ必要です。準備状況プローブを使用して 2 つの異なるリージョンにソースからサービスをデプロイするには、次のコマンドを実行します。

  1. ソース ディレクトリから us-west1europe-west1 にサービス health-example をデプロイします。準備状況プローブを使用してサービスのヘルスチェックを構成するには、少なくとも 1 つの最小インスタンスが必要です。

    gcloud beta run deploy $SERVICE \
    --source=. \
    --regions=$REGION_A,$REGION_B \
    --min=10 \
    --readiness-probe httpGet.path="/are_you_ready"
    
  2. プロンプトが表示されたら、「y」と応答して、必要な API をインストールします。これが必要なのはプロジェクトに対して 1 回だけです。始める前にセクションで説明したように、デフォルト値を設定しない場合は、別の プロンプトにプラットフォームとリージョンを指定して応答します。

グローバル外部アプリケーション ロードバランサを設定する

us-west1europe-west1 の間でトラフィックをルーティングするようにグローバル外部アプリケーション ロードバランサを設定する手順は次のとおりです。

  1. バックエンド サービスを作成します。

    gcloud compute backend-services create $SERVICE-bs \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --global
    
  2. ロードバランサに到達するようにグローバル静的外部 IP アドレスを設定します。

    gcloud compute addresses create $SERVICE-ip \
      --network-tier=PREMIUM \
      --ip-version=IPV4 \
      --global
    
  3. 受信リクエストをバックエンド サービスに転送するための URL マップを作成します。

    gcloud compute url-maps create $SERVICE-lb \
      --default-service $SERVICE-bs
    
  4. 作成した URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成します。

    gcloud compute target-http-proxies create $SERVICE-hp \
    --url-map=$SERVICE-lb
    
  5. 受信リクエストをプロキシに転送する転送ルールを作成します。

    gcloud compute forwarding-rules create $SERVICE-fr \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=PREMIUM \
      --address=$SERVICE-ip \
      --target-http-proxy=$SERVICE-hp \
      --global \
      --ports=80
    

サーバーレス NEG を介してサービスを追加する

サーバーレス NEG を使用して us-west1europe-west1 にデプロイしたサービスを追加する手順は次のとおりです。

  1. us-west1europe-west1 に、Cloud Run サービスのサーバーレス ネットワーク エンドポイント グループ(NEG) を作成します。

    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_A \
        --region $REGION_A \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_B \
        --region $REGION_B \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
  2. サーバーレス NEG をバックエンドとして us-west1europe-west1 のバックエンド サービスに追加します。

    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_A \
        --network-endpoint-group-region=$REGION_A
    
    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_B \
        --network-endpoint-group-region=$REGION_B
    

その他の構成オプションについては、Cloud Run を使用してグローバル外部アプリケーション ロードバランサを設定する をご覧ください。

フェイルオーバーをテストする

Cloud Run サービスの信頼性と復元力を確保するためにフェイルオーバーをテストする手順は次のとおりです。

  1. 次のコマンドを実行して、ロードバランサの IP アドレスを取得します。

    LBIP=$(gcloud compute addresses describe $SERVICE-ip --global --format='value(address)')
    
  2. 省略可: サービスで認証が必要な場合は、ロードバランサにリクエストを送信します。

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LBIP
    
  3. echo $LBIP コマンドを実行して、LBIP 変数の値を取得します。これにより、ロードバランサの IP アドレスが出力されます。例: 11.22.33.44

  4. フェイルオーバーをテストするには、http://LOAD_BALANCER_IP URL に移動します。ここで、LOAD_BALANCER_IP は前の手順で取得した値です。 [サービス提供地域] セクションで、リージョンの切り替えボタンをクリックします。これにより、正常なリージョンとトラフィックを処理するインスタンスが指定されます。

    Cloud Run サービスの健全性を使用してクロスリージョン フェイルオーバーを自動化する

クリーンアップ

Google Cloud アカウントで追加料金が発生しないようにするには、このチュートリアルでデプロイしたすべてのリソースを削除します。

プロジェクトを削除する

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで行った変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. コンソールで [**リソースの管理**] ページに移動します。 Google Cloud

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

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

チュートリアル リソースの削除

  1. このチュートリアルでデプロイした Cloud Run サービスを削除します。Cloud Run サービスの費用は、リクエストを受け取るまでは発生しません。

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

    gcloud run services delete SERVICE-NAME

    SERVICE-NAME は、サービスの名前に置き換えます。

    Cloud Run サービスは Google Cloud コンソールで削除することもできます。

  2. チュートリアルの設定時に追加した gcloud のデフォルトのリージョン構成を削除します。

     gcloud config unset run/region
    
  3. プロジェクト構成を削除します。

     gcloud config unset project
    

次のステップ