Packer のクイックスタート

このページでは、Packer と Cloud Build を使用して Google Compute Engine で使用する VM イメージを作成する方法について説明します。Packer と Cloud Build の手順を定義して、ビルド構成を作成します。その構成を使用してビルドを開始します。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

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

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. Cloud Build API を有効にします。

    APIを有効にする

  5. Cloud SDK をインストールして初期化します。

Google Cloud Platform にログインする

  1. gcloud コマンドライン ツールを承認して、プロジェクトにアクセスします。

    gcloud auth login
    
  2. gcloud ツール用のプロジェクトを構成します。

    gcloud config set project [PROJECT_ID]
    

    [PROJECT_ID] は、前のセクションで作成または選択した GCP プロジェクト ID です。

プロジェクトを構成する

  1. 次のいずれかの操作を行います。

    • 以前に構成を作成していない場合は、gcloud トピック構成を確認してください。

    • すでに構成を作成している場合、それを有効にします。

      gcloud config configurations activate [CONFIGURATION NAME]

  2. プロジェクト変数を設定します。

    PROJECT=$(gcloud config get-value project)
    

    プロジェクト変数が設定されると、コマンドは次の出力を返します。

    Your active configuration is: [<your-config-name>]
    
  3. プロジェクト変数が正しく設定されていることを確認します。

    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

権限の設定

  1. 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[])")
    
  2. エディタの役割をアカウントに加えます。

    gcloud projects add-iam-policy-binding $PROJECT \
      --member $CLOUD_BUILD_ACCOUNT \
      --role roles/editor
    

    プロジェクトの更新済の IAM ポリシー レポートが表示されます。

Packer ビルダー イメージを作成する

Packer イメージ ビルダーを使用して cloud-builders-community リポジトリのクローンを作成し、イメージをビルドします。イメージをコンテナ リポジトリに push します。

  1. 作業ディレクトリを保存します。

    project_dir=$(pwd)
    
  2. 一時ディレクトリに移動します。

    cd /tmp
    
  3. cloud-builders-community リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  4. Packer ビルダー イメージに移動します。

    cd cloud-builders-community/packer
    
  5. ビルダーをプロジェクトに送信します。

    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 ページでもビルドを表示できます。

    Cloud Build ページを開く

    [ビルド履歴] ページにビルドの詳細が表示されます。

    Packer ビルドイメージのスクリーンショット

  6. 一時ディレクトリからリポジトリを削除します。

    rm -rf /tmp/cloud-builders-community
    
  7. $project_dir に戻ります。

    cd $project_dir
    

ソースファイルを準備する

ビルドするサンプル ソースコードが必要です。このセクションでは、簡単な Hello World のサンプルを Packer ビルダーで作成します。

  1. hello-world という名前のディレクトリを作成し、そのディレクトリに移動します。

    mkdir hello-world
    cd hello-world
    
  2. 次の内容のファイルを 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
    
  3. 次の内容のファイルを 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
    "
    
  4. 次の内容のファイルを 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.yamlinstall-website.shpacker.json ファイルが hello-world ディレクトリに作成されました。

  5. ビルドを確認します。

    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
    

イメージを変更する

  1. install-website.sh を開きます。

  2. <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
    "
    
  3. 新しいイメージ名でビルドを確認します。

    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
    
  4. Google Cloud Platform Console で [イメージ] ページを開き、両方のイメージを表示します。

    [イメージ] ページに移動

    Packer イメージ ファミリーのスクリーンショット

クリーンアップ

このチュートリアルで使用したリソースについて GCP アカウントに課金されないようにするために、以下を行ってください。

  1. Packer イメージを削除します。

    gcloud container images delete --quiet gcr.io/$PROJECT/packer  --force-delete-tags
    
  2. hello-world イメージを削除します。

    gcloud compute images delete --quiet hello-v1 hello-v2
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Build のドキュメント