はじめに
こんにちは、Datadog Japan で Sales Engineer をしている AoTo です。
この記事は AoTo Advent Calendar 2023 26日目の記事改め、GCP(Google Cloud Platform) Advent Calendar 2023 7日目の記事です。
皆さんは Cloud Native Buildpacks をご存知でしょうか?Buildpacks は Dockerfile を書くことなく、ソース コードから安全で効率的な、本番環境に対応したコンテナイメージを作成できるツールです。
この便利な Buildpacks が Google Cloud でも手軽に利用できるので、何ができるかまとめてみました。
Cloud Native Buildpacks とは
概要
Buildpack は2011年に Heroku によって考案され、現在では Cloud Foundry, Google App Engine, Gitlab, Knative, Deis Dokku, Drie など他の PaaS に採用されています。
Heroku と Pivotal は2018年10月に Buildpacks を Cloud Native Computing Foundation の[プロジェクト]として開始し、ビルドパックの統合を CNCF コミュニティによって維持するようになりました。
こうして誕生した Cloud Native Buildpacks は、OCI イメージ形式などの最新のコンテナ標準を採用しています。
概念
Buildpacks はソース コードから安全で効率的な、本番環境に対応したコンテナイメージを作成できるツールです。
こうしたコンテナイメージの作成はdetect
とbuild
フェーズを通して行われ、アプリケーションに必要なフレームワークとランタイムを提供してクラウド上で実行できるよう適切に構成を行います。
detect
フェーズでは、ソースコードを検査し buildpack が適用できるかを判断します。
build
フェーズでは、ソースコードを確認し依存関係のダウンロードやコンパイル(言語による)を行います。さらにエントリーポイントと起動スクプトを設定し、コンテナイメージをビルド環境を用いてビルドします。
この際、必要となるのが builder です。builder はビルドの実行に必要なすべてのコンポーネントを含むイメージで、build image, lifecycle, run image, buildpack やこれらの順序や場所を定義するファイルによって構成されます。
特徴
Buildpacks の基本的な概念は Dockerfile を利用しないソースコードからのコンテナイメージのビルドですが、その他にも重要な特徴や役割があります。
Dockerfile
Buildpacks はroot
ユーザーとしては実行されないため、ファイルシステムに任意の変更ができません。そのため、OS パッケージのように特権が必要となる構成を行えません。
Buildpacks を Dockerfile と併用して利用することで、これらの OS レベルの依存関係を Dockerfile で提供しながら Buildpack でコンテナイメージを作成することができます。
イメージ拡張機能を利用するとdetect
フェーズでアプリケーションコードの分析を経て Dockerfile を生成して OS レベルの依存関係を構成することができます。
SBoM
Software Bill of Materials(SBoM) により、イメージに含まれるすべてのソフトウェアコンポーネントをリストできます。CycloneDX, Syft, Spdx形式の SBoM がサポートされています。
$ pack sbom download <YOUR_IMAGE_NAME>
Google Cloud の Buildpacks
Google Cloud で公開されている Buildpacks は、前述の Cloud Native Buildpacks の仕様を実装し、Google Cloud の各サービスにデプロイ可能なコンテナをビルドして構成するように設計されています。
Google Cloud の Buildpacks は Google Cloud 上のサービス用に専用のビルダーと環境変数を用いた構成を提供しています。公式のガイドでは自前の環境へのインストールが案内されていますが、Google Cloud Shell には標準でインストールされています。
$ pack version
0.21.1+git-e09e397.build-2823
Google Cloud Workstations には標準でのインストールがないため、以下のように pack-cli をインストールします。
$ sudo add-apt-repository ppa:cncf-buildpacks/pack-cli
$ sudo apt-get update
$ sudo apt-get install pack-cli
汎用ビルダー
汎用ビルダーは Google Cloud に限らない環境で利用できるコンテナイメージを作成するデフォルトのビルダーです。
汎用ビルダー自体は Google Container Registry(GCR) に一般公開されている、Ubuntu ベースのコンテナイメージで、現在は Ubuntu 22 をベースとしたもの(google-22
)がlatest
となっています。
アプリケーション言語に応じて複数のバージョンをサポートしており、Python(3.10.X, 3.11.X), Node.js(12.X.X, 14.X.X, 16.X.X, 18.X.X, 20.X.X), Java(8, 11, 17, 18), Go(1.X), Ruby(3.1.X, 3.2.X), PHP(8.1.X, 8.2.X), .NET Core(6.X, 7.X) がサポートされます。1
App Engine
Google Cloud の Buildpacks は Google App Engine(GAE) 第2世代ランタイムのアプリケーションをコンテナ化するための専用のビルダーを公開しています。サポートされるアプリケーション言語とバージョンは App Engine に対応しています。
このビルダーには Ubuntu18, 22 をベースとして追加の buildpack と App Engine 固有の構成が含まれており、実行速度や自動更新の最適化が行われます。それぞれ、gcr.io/gae-runtimes/buildpacks/google-gae-18/<application_lang>/builder
かgcr.io/gae-runtimes/buildpacks/google-gae-22/<application_lang>/builder
を Builder Image URL に指定するだけで利用できます。
$ pack build SERVICE_IMAGE_NAME --builder=<BUILDER_IMAGE_URL>
Cloud Run
環境変数により Cloud Run, Cloud Functions にデプロイされた時のサービスの動作を構成できます。複数のアプリケーションが動作しているコンテナの制御し適切な ENTRYPOINT
を設定したり、ランタイムとそのバージョンを指定できるため、稼働する環境に最適化してある程度自由にコンテナイメージを作成できます。
環境変数名 | 説明 |
---|---|
GOOGLE_ENTRYPOINT |
Dockerfile の ENTRYPOINT と同様に、コンテナの実行時に実行されるコマンドを指定します |
GOOGLE_RUNTIME |
ランタイムを強制的に指定できます |
GOOGLE_RUNTIME_VERSION |
ランタイムのバージョンを指定できます |
GOOGLE_BUILDABLE |
Go, Java, Dart, .NET で、ビルド可能ユニットへのパスを指定できます |
GOOGLE_BUILD_ARGS |
Java(Maven, Gradle) と .NET で、ビルドコマンドに引数を追加できます |
GOOGLE_MAVEN_BUILD_ARGS |
Java(Maven) で、Maven コマンドをオーバーライドできます mvn clean package --batch-mode -DskipTests -Dhttp.keepAlive=false がデフォルトで実行されます |
GOOGLE_GRADLE_BUILD_ARGS |
Java(Gradle)で、Gracle コマンドをオーバーライドできます gradle clean assemble -x test --build-cache がデフォルトで実行されます |
GOOGLE_DEVMODE |
Skaffold(開発モードの Buildpack) を有効にします。Skaffold のインストール、skaffold dev を実行する必要があります |
GOOGLE_CLEAR_SOURCE |
Go, Java か Functions で、アプリケーションビルド後にソースをクリアします |
Cloud Functions
上記の Cloud Run に共通の環境変数の他に、Cloud Function 固有の環境変数が用意されています。
環境変数名 | 説明 |
---|---|
GOOGLE_FUNCTION_TARGET |
リクエストに応じて関数を呼び出せます |
GOOGLE_FUNCTION_SIGNATURE_TYPE |
関数で使用される署名を指定できます |
GOOGLE_FUNCTION_SOURCE |
言語に応じたディレクトリ・ファイルの名前を指定できます |
おわりに
Google Cloud でコンテナイメージを扱うようなGoogle Kubernetes Engine(GKE), Cloud Run, App Engine(GAE), Cloud Functions などに利用するコンテナイメージを Buildpack で作成できます。
Google Cloud は App Engine 用のビルダーや Cloud Run, Cloud Function 用の環境変数を提供しているため、これらのサービスを利用する場合は一度確認しておくと良いように思います。
-
Java 8 はアプリケーションのみでサポートされます。 ↩