Git ブランチと Cloud Build を使用した Cloud Run カナリア デプロイの実装

Last reviewed 2023-05-26 UTC

このドキュメントでは、自動カナリアテストと比率に基づくトラフィック管理を使用して、デベロッパー ブランチから本番環境へのコードの進行を実装する Cloud Run 用のデプロイ パイプラインを実装する方法を示します。これは、CI / CD パイプラインの作成と管理を担当する持つプラットフォーム管理者向けのドキュメントです。このドキュメントは、Git、Cloud Run、CI / CD パイプラインのコンセプトに関する基本的な理解があることを前提としています。

Cloud Run を使用すると、オーバーヘッドや手間をほとんどかけずにアプリケーションをデプロイして実行できます。多くの組織では、堅牢なリリース パイプラインを使用してコードを本番環境に移行しています。Cloud Run には独自のトラフィック管理機能が備わっており、高度なリリース管理技術をわずかな労力で実装できます。

目標

  • Cloud Run サービスを作成する
  • デベロッパー ブランチを有効にする
  • カナリアテストを実装する
  • 本番環境に安全にロールアウトする

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

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

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

環境の準備

  1. Cloud Shell で、このチュートリアルを通じて使用する環境変数を作成します。

    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
  2. 次の API を有効にします。

    • Resource Manager
    • GKE
    • Cloud Build
    • Container Registry
    • Cloud Run
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        secretmanager.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        run.googleapis.com
    
  3. Cloud Run 管理者ロール(roles/run.admin)を Cloud Build サービス アカウントに付与する

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member=serviceAccount:[email protected] \
      --role=roles/run.admin
    
  4. IAM サービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を Cloud Run ランタイム サービス アカウントの Cloud Build サービス アカウントに付与する

    gcloud iam service-accounts add-iam-policy-binding \
    [email protected] \
      --member=serviceAccount:[email protected] \
      --role=roles/iam.serviceAccountUser
    

Git 値を設定する

以前に Cloud Shell で Git を使用していない場合は、使用したい user.nameuser.email の値を設定します。

    git config --global user.email YOUR_EMAIL_ADDRESS
    git config --global user.name YOUR_USERNAME
    git config --global credential.helper store
  • YOUR_EMAIL_ADDRESS: GitHub アカウントで使用するメールアドレス
  • YOUR_USERNAME: GitHub のユーザー ID

GitHub で MFA を使用している場合は、個人用のアクセス トークンを作成し、コマンドラインから GitHub を操作するときにパスワードとして使用します。

アクセスしやすいよう、GitHub のユーザー ID を環境変数に格納します。

export GH_USER=YOUR_GITHUB_ID

プロジェクト リポジトリをフォークする

独自の書き込み可能なバージョンのラボリポジトリを作成するには、GitHub UI を使用してサンプル リポジトリを GitHub アカウントにフォークします。

サンプル リポジトリのクローンを作成する

サンプル リポジトリをクローニングして準備します。

git clone https://github.com/$GH_USER/software-delivery-workshop.git cloudrun-progression

cd cloudrun-progression/labs/cloudrun-progression

Git リポジトリを接続します。

Cloud Build を使用すると、Google Cloud コンソールを使用してソースコード リポジトリへの接続を作成し管理できます。第 1 世代または第 2 世代の Cloud Build リポジトリを使用して、接続を作成、管理できます。このチュートリアルでは、第 2 世代の Cloud Build リポジトリを使用します。

必要な権限を付与する

GitHub ホストを接続するには、Cloud Build 接続管理者(roles/cloudbuild.connectionAdmin)ロールをユーザー アカウントに付与します。

PN=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \
 --role="roles/secretmanager.admin"

ホスト接続を作成する

  1. Cloud Build リポジトリの接続を構成します。

    gcloud alpha builds connections create github $GH_USER --region=us-central1
    
  2. 出力に表示されたリンクをクリックして、画面の手順に沿って接続を完了します。

  3. GitHub 接続のインストールを確認します。

    gcloud alpha builds connections describe $GH_USER --region=us-central1
    

構成したホスト接続を使用して、フォークしたサンプル リポジトリにリンクします。

 gcloud alpha builds repositories create cloudrun-progression \
     --remote-uri=https://github.com/$GH_USER/software-delivery-workshop.git \
     --connection=$GH_USER \
     --region=us-central1

リポジトリ名変数を設定する

後で使用できるように、リポジトリ名を保存します。

export REPO_NAME=projects/$PROJECT_ID/locations/us-central1/connections/$GH_USER/repositories/cloudrun-progression

Cloud Run サービスをデプロイする

このセクションでは、このチュートリアルを通じて使用する最初の本番環境アプリケーションをビルドしてデプロイします。

サービスをデプロイする

  • Cloud Shell で、認証が必要なサービスを含むアプリケーションをビルドしてデプロイします。公開サービスを作成するには、--allow-unauthenticated フラグを使用します。

        gcloud builds submit --tag gcr.io/$PROJECT_ID/hello-cloudrun
    
        gcloud run deploy hello-cloudrun \
          --image gcr.io/$PROJECT_ID/hello-cloudrun \
          --platform managed \
          --region us-central1 \
          --tag=prod -q
    

    出力は次のようになります。

    Deploying container to Cloud Run service [hello-cloudrun] in project [sdw-mvp6] region [us-central1]
    ✓ Deploying new service... Done.
      ✓ Creating Revision...
      ✓ Routing traffic...
    Done.
    Service [hello-cloudrun] revision [hello-cloudrun-00001-tar] has been deployed and is serving 100 percent of traffic.
    Service URL: https://hello-cloudrun-apwaaxltma-uc.a.run.app
    The revision can be reached directly at https://prod---hello-cloudrun-apwaaxltma-uc.a.run.app
    

出力には、サービス URL とリビジョンの一意の URL が含まれます。実際の値は、ここに示すものとは多少異なります。

デプロイメントを検証する

  1. デプロイが完了したら、Cloud コンソールの [リビジョン] ページで新しくデプロイしたサービスを表示します。

  2. Cloud Shell で、認証されたサービス レスポンスを表示します。

    PROD_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    echo $PROD_URL
    
    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $PROD_URL
    

ブランチ デプロイの有効化

このセクションでは、Git の開発ブランチに対して一意の URL を有効にします。

ブランチ トリガーを設定する

各ブランチは、ブランチ名によって識別される URL で表されます。ブランチに commit するとデプロイがトリガーされ、同じ URL で更新にアクセスできます。

  1. Cloud Shell で、トリガーを設定します。

    gcloud alpha builds triggers create github \
    --name=branchtrigger \
    --repository=$REPO_NAME \
    --branch-pattern='[^(?!.*main)].*' \
    --build-config=labs/cloudrun-progression/branch-cloudbuild.yaml \
    --region=us-central1
    
  2. トリガーを確認するには、Cloud コンソールの [Cloud Build トリガー] ページに移動します。

ブランチに変更を作成する

  1. Cloud Shell で、新しいブランチを作成します。

    git checkout -b new-feature-1
    
  2. 任意のエディタまたは Cloud Shell IDE を使用してサンプル アプリケーションを開きます。

    edit app.py
    
  3. サンプル アプリケーションでは、24 行目を変更して、v1.0 ではなく v1.1 を指定します。

    @app.route('/')
    
    def hello_world():
        return 'Hello World v1.1'
    
    
  4. ターミナルに戻るには、[ターミナルを開く] をクリックします。

ブランチ トリガーを実行する

  1. Cloud Shell で変更を commit し、リモート リポジトリに push します。

    git add . && git commit -m "updated" && git push origin new-feature-1
    
  2. 進行中のビルドを確認するには、Cloud Build のビルド履歴画面に移動します。

  3. 新しいリビジョンを確認するには、ビルドの完了後に Cloud コンソールで Cloud Run の [リビジョン] ページに移動します。

  4. Cloud Shell で、このブランチ用の一意の URL を取得します。

    BRANCH_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"new-feature-1\")|.url")
    
    echo $BRANCH_URL
    
  5. 認証済みの URL にアクセスします。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $BRANCH_URL
    

    更新されたレスポンス出力は次のようになります。

    Hello World v1.1
    

カナリアテストを自動化する

コードを本番環境にリリースする場合は、すべてのトラフィックを新しいコードベースに移行する前に、ライブ トラフィックの小規模なサブセットにコードをリリースするのが一般的です。

このセクションでは、コードがメインブランチに commit されたときに有効化されるトリガーを実装します。トリガーによって、コードが一意のカナリア URL にデプロイされ、すべてのライブ トラフィックの 10% が新しいリビジョンにルーティングされます。

  1. Cloud Shell で、ブランチ トリガーを設定します。

    gcloud alpha builds triggers create github \
      --name=maintrigger \
      --repository=$REPO_NAME \
      --branch-pattern=main \
      --build-config=labs/cloudrun-progression/main-cloudbuild.yaml \
      --region=us-central1
    
  2. 新しいトリガーを確認するには、Cloud コンソールの [Cloud Build トリガー] ページに移動します。

  3. Cloud Shell でブランチをメインラインにマージし、リモート リポジトリに push します。

    git checkout main
    git merge new-feature-1
    git push origin main
    
  4. 進行中のビルドを確認するには、Cloud Build の [ビルド] ページに移動します。

  5. ビルドが完了したら、新しいリビジョンを確認するために Cloud コンソールで Cloud Run の [リビジョン] ページに移動します。なお、トラフィックの 90% が本番環境に、10% がカナリアに、0% がブランチ リビジョンにルーティングされます。

カナリア デプロイのロジックを実装する main-cloudbuild.yaml の重要な行を確認します。

39~45 行目で、新しいリビジョンをデプロイし、タグフラグを使用して一意のカナリア URL からトラフィックをルーティングします。

gcloud run deploy ${_SERVICE_NAME} \
--platform managed \
--region ${_REGION} \
--image gcr.io/${PROJECT_ID}/${_SERVICE_NAME} \
--tag=canary \
--no-traffic

61 行目で、デプロイの Git 短縮 SHA を記す静的タグがリビジョンに追加されます。

gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=sha-$SHORT_SHA=$${CANARY} --platform managed --region ${_REGION}

62 行目で、トラフィックの 90% を本番環境、10% をカナリアにルーティングするようトラフィックを更新します。

gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${PROD}=90,$${CANARY}=10 --platform managed --region ${_REGION}
  1. Cloud Shell で、カナリア リビジョンへの一意の URL を取得します。

    CANARY_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"canary\")|.url")
    
    echo $CANARY_URL
    
  2. カナリア エンドポイントを直接確認します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CANARY_URL
    
  3. 比率に基づくレスポンスを表示するには、一連のリクエストを実行します。

    LIVE_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    

本番環境へのリリース

トラフィックの小規模なサブセットでカナリア デプロイを検証したら、残りのライブ トラフィックにデプロイをリリースします。

このセクションでは、リポジトリ内でタグを作成するときに有効にするトリガーを設定します。トリガーによって、タグの commit SHA に基づいて、すでにデプロイされたリビジョンにトラフィックの 100% が移行されます。commit SHA を使用すると、カナリア トラフィックで検証されたリビジョンが、残りの本番環境トラフィックで使用されるリビジョンになります。

  1. Cloud Shell で、タグトリガーを設定します。

    gcloud alpha builds triggers create github \
      --name=tagtrigger \
      --repository=$REPO_NAME \
      --tag-pattern=. \
      --build-config=labs/cloudrun-progression/tag-cloudbuild.yaml \
      --region=us-central1
    
  2. 新しいトリガーを確認するには、Cloud コンソールの [Cloud Build トリガー] ページに移動します。

  3. Cloud Shell で、新しいタグを作成し、リモート リポジトリに push します。

    git tag 1.1
    git push origin 1.1
    
  4. 進行中のビルドを確認するには、Cloud コンソールで Cloud Build のビルド履歴画面に移動します。

  5. ビルドが完了したら、新しいリビジョンを確認するために Cloud コンソールで Cloud Run の [リビジョン] ページに移動します。なお、リビジョンは prod タグを示すよう更新され、100% のライブ トラフィックが処理されています。

  6. Cloud Shell で、比率ベースのレスポンスを表示するには、一連のリクエストを実行します。

    LIVE_URL=$(gCloud Run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    
  7. 本番環境デプロイ ロジックを実装する tag-cloudbuild.yaml の行を確認します。

    37 行目で、prod タグを追加してカナリア リビジョンを更新します。デプロイされたリビジョンには、prod とカナリアの両方のタグが付けられます。

    gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=prod=$${CANARY} --platform managed --region ${_REGION}
    

    39 行目では、ベースサービス URL 向けのトラフィックが更新され、トラフィックの 100% が prod としてタグ付けされたリビジョンにルーティングされます。

    gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${NEW_PROD}=100 --platform managed --region ${_REGION}
    

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ