LoginSignup
1
2

Buildpacks が Google Cloud で使える件

Last updated at Posted at 2023-12-26

はじめに

こんにちは、Datadog Japan で Sales Engineer をしている AoTo です。

この記事は AoTo Advent Calendar 2023 26日目の記事改め、GCP(Google Cloud Platform) Advent Calendar 2023 7日目の記事です。

皆さんは Cloud Native Buildpacks をご存知でしょうか?BuildpacksDockerfile を書くことなく、ソース コードから安全で効率的な、本番環境に対応したコンテナイメージを作成できるツールです。

この便利な 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 コミュニティによって維持するようになりました。

image.png

こうして誕生した Cloud Native Buildpacks は、OCI イメージ形式などの最新のコンテナ標準を採用しています。

概念

Buildpacks はソース コードから安全で効率的な、本番環境に対応したコンテナイメージを作成できるツールです。

image.jpg

こうしたコンテナイメージの作成はdetectbuildフェーズを通して行われ、アプリケーションに必要なフレームワークとランタイムを提供してクラウド上で実行できるよう適切に構成を行います。

detectフェーズでは、ソースコードを検査し buildpack が適用できるかを判断します。

buildフェーズでは、ソースコードを確認し依存関係のダウンロードやコンパイル(言語による)を行います。さらにエントリーポイントと起動スクプトを設定し、コンテナイメージをビルド環境を用いてビルドします。

この際、必要となるのが builder です。builder はビルドの実行に必要なすべてのコンポーネントを含むイメージで、build image, lifecycle, run image, buildpack やこれらの順序や場所を定義するファイルによって構成されます。

image2.jpg

特徴

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>/buildergcr.io/gae-runtimes/buildpacks/google-gae-22/<application_lang>/builderBuilder 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 用の環境変数を提供しているため、これらのサービスを利用する場合は一度確認しておくと良いように思います。

  1. Java 8 はアプリケーションのみでサポートされます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2