このページでは、Packer と Cloud Build を使用して Google Compute Engine で使用する VM イメージを作成する方法について説明します。Packer と Cloud Build の手順を定義して、ビルド構成を作成します。その構成を使用してビルドを開始します。
始める前に
-
Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。
-
Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。
- Cloud Build API を有効にします。
- Cloud SDK をインストールして初期化します。
Google Cloud Platform にログインする
gcloud
コマンドライン ツールを承認して、プロジェクトにアクセスします。gcloud auth login
gcloud
ツール用のプロジェクトを構成します。gcloud config set project [PROJECT_ID]
[PROJECT_ID]
は、前のセクションで作成または選択した GCP プロジェクト ID です。
プロジェクトを構成する
次のいずれかの操作を行います。
以前に構成を作成していない場合は、gcloud トピック構成を確認してください。
すでに構成を作成している場合、それを有効にします。
gcloud config configurations activate [CONFIGURATION NAME]
プロジェクト変数を設定します。
PROJECT=$(gcloud config get-value project)
プロジェクト変数が設定されると、コマンドは次の出力を返します。
Your active configuration is: [<your-config-name>]
プロジェクト変数が正しく設定されていることを確認します。
echo $PROJECT
サービスを有効化する
プロジェクトに必要な Cloud API サービスを有効にします。
gcloud services enable sourcerepo.googleapis.com
gcloud services enable cloudapis.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable servicemanagement.googleapis.com
gcloud services enable storage-api.googleapis.com
gcloud services enable cloudbuild.googleapis.com
権限の設定
Cloud Build サービス アカウントを見つけます。
CLOUD_BUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT --filter="(bindings.role:roles/cloudbuild.builds.builder)" --flatten="bindings[].members" --format="value(bindings.members[])")
エディタの役割をアカウントに加えます。
gcloud projects add-iam-policy-binding $PROJECT \ --member $CLOUD_BUILD_ACCOUNT \ --role roles/editor
プロジェクトの更新済の IAM ポリシー レポートが表示されます。
Packer ビルダー イメージを作成する
Packer イメージ ビルダーを使用して cloud-builders-community リポジトリのクローンを作成し、イメージをビルドします。イメージをコンテナ リポジトリに push します。
作業ディレクトリを保存します。
project_dir=$(pwd)
一時ディレクトリに移動します。
cd /tmp
cloud-builders-community リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
Packer ビルダー イメージに移動します。
cd cloud-builders-community/packer
ビルダーをプロジェクトに送信します。
gcloud builds submit .
ビルドが完了すると、次のような出力が表示されます。
DONE -------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS e3d89cdd-924c-4539-bc9d-2c87e0e910e5 2019-06-14T19:06:44+00:00 1M11S gs://[PROJECT_ID]_cloudbuild/source/1560539203.19-1d492a75515340f1bc92c0a8a6937308.tgz gcr.io/[PROJECT_ID]/packer (+2 more) SUCCESS
Google Cloud Platform Console の Cloud Build ページでもビルドを表示できます。
[ビルド履歴] ページにビルドの詳細が表示されます。
一時ディレクトリからリポジトリを削除します。
rm -rf /tmp/cloud-builders-community
$project_dir
に戻ります。cd $project_dir
ソースファイルを準備する
ビルドするサンプル ソースコードが必要です。このセクションでは、簡単な Hello World のサンプルを Packer ビルダーで作成します。
hello-world
という名前のディレクトリを作成し、そのディレクトリに移動します。mkdir hello-world cd hello-world
次の内容のファイルを
cloudbuild.yaml
という名前で作成します。steps: - name: 'gcr.io/$PROJECT_ID/packer' args: - build - -var - image_name=$_IMAGE_NAME - -var - project_id=$PROJECT_ID - -var - image_family=$_IMAGE_FAMILY - -var - image_zone=$_IMAGE_ZONE - packer.json
次の内容のファイルを
install-website.sh
という名前で作成します。#!/bin/sh sudo yum install -y epel-release sudo yum install -y nginx sudo chkconfig nginx on LOCATION_OF_INDEX=/usr/share/nginx/html/index.html sudo bash -c "cat <<A_VERY_SPECIAL_MESSAGE>$LOCATION_OF_INDEX <html> <h2> Hello World! </h2> </html> A_VERY_SPECIAL_MESSAGE "
次の内容のファイルを
packer.json
という名前で作成します。{ "variables": { "image_name": "", "image_family": "", "image_zone": "", "project_id": "" }, "builders": [ { "image_name": "{{ user `image_name` }}", "type": "googlecompute", "project_id": "{{ user `project_id`}}", "source_image_family": "centos-7", "image_family": "{{ user `image_family` }}", "ssh_username": "packer", "zone": "{{ user `image_zone` }}", "startup_script_file": "install-website.sh", "scopes": [ "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/devstorage.full_control" ] } ] }
これで、
cloudbuild.yaml
、install-website.sh
、packer.json
ファイルがhello-world
ディレクトリに作成されました。ビルドを確認します。
gcloud builds submit --substitutions=_IMAGE_NAME="hello-v1",_IMAGE_FAMILY="hello-world",_IMAGE_ZONE="us-east1-b"
ビルドが完了すると、次のような出力が表示されます。
DONE -------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 9a279714-e908-4033-9b46-25f8753e2cdc 2019-06-14T19:43:49+00:00 5M35S gs://[PROJECT_ID]_cloudbuild/source/1560541428.62-64d0dc6fb01648d1be6fae9e045f6093.tgz - SUCCESS
イメージを変更する
install-website.sh
を開きます。<h2>
タグで、「Hello World」を「Hello Universe」に変更します。#!/bin/sh sudo yum install -y epel-release sudo yum install -y nginx sudo chkconfig nginx on LOCATION_OF_INDEX=/usr/share/nginx/html/index.html sudo bash -c "cat <<A_VERY_SPECIAL_MESSAGE>$LOCATION_OF_INDEX <html> <h2> Hello Universe! </h2> </html> A_VERY_SPECIAL_MESSAGE "
新しいイメージ名でビルドを確認します。
gcloud builds submit --substitutions=_IMAGE_NAME="hello-v2",_IMAGE_FAMILY="hello-world",_IMAGE_ZONE="us-east1-b"
ビルドが完了すると、次のような出力が表示されます。
DONE -------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 7787c289-cb07-4e14-91f0-c74055b527a0 2019-06-14T19:57:11+00:00 4M56S gs://[PROJECT_ID]_cloudbuild/source/1560542231.04-89ff301824a348be9c524a90124488ff.tgz - SUCCESS
Google Cloud Platform Console で [イメージ] ページを開き、両方のイメージを表示します。
クリーンアップ
このチュートリアルで使用したリソースについて GCP アカウントに課金されないようにするために、以下を行ってください。
Packer イメージを削除します。
gcloud container images delete --quiet gcr.io/$PROJECT/packer --force-delete-tags
hello-world
イメージを削除します。gcloud compute images delete --quiet hello-v1 hello-v2
次のステップ
- 基本的なビルド構成ファイルを作成する方法を学習する。
- トリガーを使用してビルドを自動化する方法を学習する。
- Google Compute Packer ビルダーについて学習する。