コンテナ イメージの再ビルドを自動化してベースイメージの更新を同期する


Cloud Workstations では、ワークステーション用のカスタム イメージを作成して使用できます。カスタム イメージが使用されたら、ベースイメージで利用可能な修正とアップデートを pull するためにカスタム イメージの再構築を自動化すると便利です。

このチュートリアルでは、カスタム ワークステーション イメージにセキュリティ アップデートとパッチを確実に適用するための自動パイプラインを構築する方法を説明します。

目標

このチュートリアルでは、次の手順に沿ってベースイメージの自動パイプラインを構築します。

  1. Artifact Registry リポジトリを作成して、カスタム イメージを保存およびスキャンします。
  2. イメージ構成を保存するために Google Cloud を使用して GitHub を構成します。
  3. Cloud Build トリガーを作成して、Artifact Registry へのカスタム イメージの作成とデプロイを自動化します。
  4. 定期的にビルドを開始するように Cloud Scheduler を構成します。
  5. 自動プロセスの結果を確認します。

費用

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

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

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Container Scanning API, Cloud Build, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Container Scanning API, Cloud Build, and Cloud Scheduler APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

環境の準備

次に進む前に、必ず次の環境変数を設定してください。

  1. 使用する予定のクラウド プロジェクトのプロジェクト ID を設定します。

    PROJECT_ID=$PROJECT_ID
    
  2. リポジトリを保存する予定の GitHub ユーザー名を設定します。

    GITHUB_USER=$GITHUB_ID
    
  3. プロセスで使用する PROJECT_NUMBER 変数と REGION 変数を設定します。

    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
        --format='value(projectNumber)')
    
    REGION=$REGION
    

    上記の例では、$REGION を、使用するリージョン名(us-central1 など)に置き換えます。

    使用可能なリージョンの詳細については、Cloud Workstations のロケーションをご覧ください。

Artifact Registry リポジトリを作成する

このチュートリアルでは、Artifact Registry を使用してイメージを保存およびスキャンします。

  1. 次のコマンドを使用してリポジトリを作成します。

    gcloud artifacts repositories create custom-images \
          --repository-format=docker \
          --location=$REGION \
          --description="Docker repository"
    

    $REGION は、使用するリージョン名に置き換えます。

  2. Artifact Registry にアクセスするときに gcloud CLI 認証情報を使用するように Docker を構成します。

    gcloud auth configure-docker $REGION-docker.pkg.dev
    

    Artifact Analysis をオフにするには、次のコマンドを実行します。

    gcloud services disable containerscanning.googleapis.com
    

GitHub リポジトリを構成する

実際には、カスタム イメージの Dockerfile を Git リポジトリに保持しておきます。自動プロセスは、ビルドプロセス中にそのリポジトリにアクセスして、関連する構成ファイルと Dockerfile を pull します。

サンプル リポジトリをフォークする

コンテナ定義を提供するサンプル リポジトリをフォークする手順は次のとおりです。

  1. software-delivery-workshop リポジトリの新しいフォークを作成するには、このリンクをクリックします。
  2. プロンプトが表示されたら、GitHub にログインします。
  3. GitHub ユーザー名をオーナーとして選択します。リポジトリ名は software-delivery-workshop と表示されます。
  4. [フォークを作成] をクリックし、処理が完了するまで数秒待ちます。

Cloud Build を GitHub に接続する

次に、組み込みの GitHub 接続機能を使用して、そのリポジトリを Cloud Build に接続します。GitHub リポジトリへのリンクをクリックして、プロセスを完了する手順に従います。ウィザードの最後のステップでトリガーを作成する必要はありません。後でコマンドラインから行うことができるため、最後のステップはスキップできます。

別の Git リポジトリ ソリューションを使用している場合は、手順に従って Cloud Build を GitLab に接続するか、Bitbucket に接続することもできます。

Cloud Build トリガーを作成する

サンプル リポジトリには、コンテナ定義と、コンテナ イメージのビルドに使用される Cloud Build 構成が含まれています。このステップでは、Labs/cloudbuild-scheduled-jobs/code-oss-java フォルダの cloudbuild.yaml ファイルにある手順を実行する Cloud Build トリガーを作成します。

gcloud builds triggers create manual \
    --name=custom-image-trigger \
    --repo=$GITHUB_USER/software-delivery-workshop \
    --repo-type=GITHUB \
    --branch=main \
    --build-config=labs/cloudbuild-scheduled-jobs/code-oss-java/cloudbuild.yaml \
    --substitutions=_REGION=$REGION,_AR_REPO_NAME=custom-images,_AR_IMAGE_NAME=code-oss-java,_IMAGE_DIR=labs/cloudbuild-scheduled-jobs/code-oss-java

TRIGGER_ID=$(gcloud builds triggers list \
    --filter=name="custom-image-trigger" --format="value(id)")

この例では、以下の構成を行います。

  • gcloud CLI コマンドによって、2 行目の name フラグで示されているように、custom-image-trigger という名前の Cloud Build 内の手動トリガーが作成されます。
  • 次の 3 行には、ソース GitHub リポジトリに関連するフラグが含まれています。
  • build-config フラグは、Git リポジトリの Cloud Build ファイルへのパスを示します。
  • ジョブを動的にするには、substitutions フラグを使用します。このジョブでは、コマンドは次の変数を渡します。

    • リージョン、$_REGION
    • Artifact Registry のリポジトリ名、$_AR_REPO_NAME
    • コンテナ イメージ名、$_AR_IMAGE_NAME
    • ビルドする Dockerfile の場所、$_IMAGE_DIR

    これらの変数がプロセスでどのように使用されるかについては、cloudbuild.yaml ファイルをご覧ください。

  • トリガーが作成されると、トリガーの一意の名前が取得され、後で使用するために $TRIGGER_ID 環境変数に格納されます。

Cloud Scheduler を構成する

最新の更新とパッチでイメージが最新の状態であることを確認するには、Cloud Scheduler を使用して、設定された頻度で Cloud Build トリガーを実行します。このチュートリアルでは、ジョブは毎日実行されます。実際には、最新の更新が確実に含まれるように、組織のニーズに合った頻度に設定してください。

  1. Cloud Build トリガーを呼び出すために必要なロールをデフォルトのサービス アカウントに付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/cloudbuild.builds.editor"
    
  2. Artifact Registry にイメージをアップロードするために必要なロールを Cloud Build サービス アカウントに付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role="roles/artifactregistry.admin"
    
  3. 次のコマンドを使用して、Cloud Scheduler ジョブを作成します。

    gcloud scheduler jobs create http run-build \
        --schedule='0 1 * * *' \
        --uri=https://cloudbuild.googleapis.com/v1/projects/$PROJECT_ID/locations/global/triggers/$TRIGGER_ID:run \
        --location=us-central1 \
        --oauth-service-account-email=$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform
    
  4. ジョブは毎日 1 回実行されるように設定されています。ただし、機能をすぐにテストするには、Cloud Scheduler からジョブを手動で実行します。

    Cloud Scheduler に移動

    1. [Cloud Scheduler] ページで、先ほど作成した run-build のエントリを見つけます。
    2. [アクション] 列で、その行の [詳細] その他オプション メニューをクリックします。
    3. システムを手動でテストするには、[ジョブ実行を強制] をクリックします。
    4. コマンドが正常に実行されたら、Cloud Build の履歴ページに切り替えて進行状況を確認します。

      Cloud Build 履歴に移動

結果を確認する

セットアップ プロセスの一環として Container Scanning API を有効にしたため、Artifact Registry は自動的にイメージをスキャンしてセキュリティの脆弱性を検出します。

脆弱性を確認するには:

  1. Artifact Registry リポジトリのページを開きます。

    Artifact Registry リポジトリに移動

  2. [リポジトリ] リストで、リポジトリをクリックします。

  3. イメージ名をクリックします。各イメージ ダイジェストの脆弱性の合計が [脆弱性] 列に表示されます。

    サンプル イメージ名を示す Artifact Registry リポジトリのページ

  4. イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。脆弱性リストには、重大度、修正プログラムが入手可能かどうか、脆弱性が存在するパッケージの名前が表示されます。

    脆弱性のサンプルリストを表示する Artifact Registry の脆弱性ページ

クリーンアップ

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

Google Cloud アカウントに対して、このページで使用したリソースについての課金が行われないようにするには、不要になったリソースを忘れずに削除してください。

Google Cloud コンソールまたは gcloud CLI から 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.

gcloud

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

ワークステーション クラスタ、ワークステーション構成、ワークステーションなどの他のリソースの削除の詳細については、リソースを削除するをご覧ください。

次のステップ