Dataproc カスタムイメージの作成

Dataproc クラスタには、ユーザーがプリインストールしたパッケージを含むカスタム イメージをプロビジョニングできます。このページでは、カスタム イメージを作成して Dataproc クラスタにインストールする方法について説明します。

使用上の検討事項と制限事項

  • カスタム イメージの存続期間: クラスタが最新のサービス更新とバグ修正を確実に受け取れるようにするために、カスタム イメージを使用したクラスタの作成は、カスタム イメージの作成日から 365 日以内に制限されています。カスタム イメージで作成された既存のクラスタは無期限に実行できます。

    365 日を超える期間に特定のカスタム イメージを使用してクラスタを作成する場合は、自動化が必要になる場合があります。詳細については、期限切れのカスタム イメージを使用してクラスタを作成する方法をご覧ください。

  • Linux のみ: このドキュメントの手順は、Linux オペレーティング システムにのみ適用されます。その他のオペレーティング システムは、今後の Dataproc リリースでサポートされる可能性があります。

  • サポートされているベースイメージ: カスタム イメージのビルドは、Dataproc ベースイメージから開始する必要があります。次のベースイメージがサポートされています。Debian、Rocky Linux、Ubuntu

    • ベースイメージの可用性: Dataproc リリースノートで通知された新しいイメージは、通知日から 1 週間経過するまで、カスタム イメージのベースとして使用できません。
  • オプション コンポーネントの使用: デフォルトでは、カスタム イメージはベースイメージからすべての Dataproc オプション コンポーネント(OS パッケージと構成ファイル)を継承します。デフォルトの OS パッケージのバージョンと構成はカスタマイズできますが、クラスタの作成時にオプション コンポーネント名を指定する必要があります。

    クラスタ作成コマンドの例:

    gcloud dataproc clusters create --optional-components=COMPONENT_NAME \
        --image=CUSTOM_IMAGE_URI  \
         ... other flags
    

    クラスタを作成する際にコンポーネント名を指定しない場合、オプションのコンポーネント(カスタムの OS パッケージと構成ファイルを含む)は削除されます。

  • ホストされているカスタム イメージの使用: 別のプロジェクトでホストされているカスタム イメージを使用する場合、プロジェクトの Dataproc サービス エージェント サービス アカウントが、ホスト プロジェクトのイメージに対する compute.images.get 権限が必要です。この権限を付与するには、ホストイメージに対する roles/compute.imageUser ロールをプロジェクトの Dataproc サービス エージェント サービス アカウントに付与します(組織内でカスタム イメージを共有するを参照)。

  • セキュアブート MOK(マシンオーナー鍵)シークレットの使用: Dataproc カスタム イメージでセキュアブートを有効にするには、次の操作を行います。

    1. Secret Manager API(secretmanager.googleapis.comを有効にします。Dataproc は、Secret Manager サービスを使用して鍵ペアを生成して管理します。

    2. カスタム イメージを生成するときに、generate_custom_image.py コマンドに --service-account="SERVICE_ACCOUNT" フラグを追加します。注: サービス アカウントには、プロジェクトに対する Secret Manager 閲覧者ロール(roles/secretmanager.viewer)と、公開シークレットと非公開シークレットに対する Secret Manager アクセサー ロール(roles/secretmanager.secretAccessor)を付与する必要があります。

    例について詳しくは、GitHub の GoogleCloudDataproc/custom-images リポジトリの examples/secure-boot ディレクトリにある README.md などのファイルを参照してください。

    セキュアブートを無効にするには: デフォルトでは、Dataproc カスタム イメージ スクリプトは、Dataproc クラスタから実行されたときに Secret Manager を使用して鍵ペアを生成して管理します。カスタム イメージでセキュアブートを使用しない場合は、カスタム イメージを生成するときに、generate_custom_image.py コマンドに --trusted-cert=""(空のフラグ値)を含めます。

始める前に

カスタム イメージを生成する前に、プロジェクトを設定してください。

プロジェクトを設定する

  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 Dataproc API, Compute Engine API, and Cloud Storage 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 Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Enable the APIs

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

    gcloud init
  12. Python 3.11+ をインストールする
  13. カスタム パッケージのインストールまたは構成の更新を行うカスタマイズ スクリプトを準備します。たとえば、次のようにします。
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

プロジェクトに Cloud Storage バケットを作成する

  1. In the Google Cloud console, go to the Cloud Storage Buckets page.

    Go to Buckets page

  2. Click Create bucket.
  3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
    • For Name your bucket, enter a name that meets the bucket naming requirements.
    • For Choose where to store your data, do the following:
      • Select a Location type option.
      • Select a Location option.
    • For Choose a default storage class for your data, select a storage class.
    • For Choose how to control access to objects, select an Access control option.
    • For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
  4. Click Create.

カスタム イメージを生成する

Python プログラムの generate_custom_image.py を使用して、Dataproc カスタム イメージを作成します。

仕組み

generate_custom_image.py プログラムは、指定された Dataproc ベースイメージを使用して一時的な Compute Engine VM インスタンスを起動し、VM インスタンス内でカスタマイズ スクリプトを実行して、カスタム パッケージのインストールと構成の更新を行います。カスタマイズ スクリプトが完了すると、VM インスタンスがシャットダウンされ、VM インスタンスのディスクから Dataproc カスタム イメージが作成されます。一時的な VM は、カスタム イメージの作成後に削除されます。カスタム イメージは保存され、Dataproc クラスタを作成するために使用できます。

generate_custom_image.py プログラムは、gcloud CLI を使用して Compute Engine で複数ステップのワークフローを実行します。

コードの実行

GitHub の Dataproc カスタム イメージで、ファイルをフォークまたはクローンします。

次に、generate_custom_image.py スクリプトを実行して、Dataproc によりカスタム イメージを生成して保存します。

python3 generate_custom_image.py \
    --image-name=CUSTOM_IMAGE_NAME \
    [--family=CUSTOM_IMAGE_FAMILY_NAME] \
    --dataproc-version=IMAGE_VERSION \
    --customization-script=LOCAL_PATH \
    --zone=ZONE \
    --gcs-bucket=gs://BUCKET_NAME \
    [--no-smoke-test]

必須フラグ

  • --image-name: カスタムイメージの出力名。注: イメージ名は、アンダースコアやスペースを使用せず、64 文字未満の正規表現 [a-z](?:[-a-z0-9]{0,61}[a-z0-9]) と一致する必要があります。
  • --dataproc-version: カスタム イメージで使用する Dataproc イメージ バージョン。バージョンは x.y.z-os または x.y.z-rc-os の形式で指定します(例: 2.0.69-debian10)。
  • --customization-script: ツールを実行したときに、カスタム パッケージのインストールや、その他のカスタマイズが行われるスクリプトのローカルパス。このスクリプトは、カスタム イメージの作成に使用される一時的な VM でのみ実行されます。カスタム イメージを使用してクラスタを作成するときに実行するその他の初期化アクションには、異なる初期化スクリプトを指定できます。
  • --zone: Compute Engine ゾーンgenerate_custom_image.py は、カスタム イメージを作成するために使用する一時的な VM をこのゾーンに作成します。
  • --gcs-bucket: Cloud Storage バケットを指す gs://BUCKET_NAME 形式の URI。generate_custom_image.py は、このバケットにログファイルを書き込みます。

オプション フラグ

  • --family: カスタム イメージのイメージ ファミリー。イメージ ファミリーとは、類似したイメージをグループ化するために使用され、ファミリー内の最新イメージへのポインタとしてクラスタを作成するときに使用されます。例: custom-2-2-debian12
  • --no-smoke-test: 新しくビルドされたカスタム イメージのスモークテストを無効にするオプション フラグ。スモークテストでは、新しく作成されたイメージを使用して Dataproc のテストクラスタが作成され、小さいジョブが実行され、テストの終了時にクラスタが削除されます。スモークテストは、新しく作成されたカスタム イメージによって正常に機能する Dataproc クラスタを作成できることを検証するために、デフォルトで実行されます。--no-smoke-test フラグを使用してこの手順を無効にすると、カスタム イメージのビルドプロセスは速くなりますが、おすすめしません。
  • --subnet: カスタム Dataproc イメージをビルドする VM の作成に使用するサブネットワーク。プロジェクトが共有 VPC の一部である場合、完全なサブネットワーク URL を projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET の形式で指定する必要があります。

追加のオプション フラグのリストについては、GithHub のオプションの引数をご覧ください。

generate_custom_image.py が正常に実行されると、カスタム イメージの imageURI がターミナル ウィンドウの出力に表示されます(下に完全な imageUri太字で示します)。

...
managedCluster:
    clusterName: verify-image-20180614213641-8308a4cd
    config:
      gceClusterConfig:
        zoneUri: ZONE
      masterConfig:
        imageUri: https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

INFO:__main__:Successfully built Dataproc custom image: CUSTOM_IMAGE_NAME
INFO:__main__:

#####################################################################
  WARNING: DATAPROC CUSTOM IMAGE 'CUSTOM_IMAGE_NAME'
           WILL EXPIRE ON 2018-07-14 21:35:44.133000.
#####################################################################

カスタム イメージ バージョン ラベル(上級者向け)

Dataproc の標準カスタム イメージ ツールを使用する場合、このツールは作成されたカスタム イメージに goog-dataproc-version ラベルを設定します。このラベルは、Dataproc でイメージ上のソフトウェアを管理するために使用される機能と能力を反映しています。

上級者向けの使用方法: 独自のプロセスを使用してカスタム Dataproc イメージを作成する場合は、次のようにカスタム イメージに goog-dataproc-version ラベルを手動で追加する必要があります。

  1. カスタム イメージの作成に使用されるベース Dataproc イメージから goog-dataproc-version ラベルを抽出します。

    gcloud compute images describe ${BASE_DATAPROC_IMAGE} \
        --project cloud-dataproc \
        --format="value(labels.goog-dataproc-version)"
    

  2. カスタム イメージにラベルを設定します。

    gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]
    

カスタム イメージを使用する

Dataproc クラスタを作成するときに、カスタム イメージを指定します。 カスタム イメージは Cloud Compute イメージに保存され、作成日から 365 日間、Dataproc クラスタの作成に利用できます(365 日間の有効期限後にカスタム イメージを使用する方法については、期限切れのカスタム イメージを使用してクラスタを作成する方法をご覧ください)。

カスタム イメージの URI

カスタム イメージの imageUri をクラスタ作成オペレーションに渡します。この URI は、次の 3 つのいずれかの方法で指定できます。

  1. 完全 URI:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/`gs://`BUCKET_NAME`
  2. 部分 URI: projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
  3. 省略名: CUSTOM_IMAGE_NAME

カスタム イメージは、ファミリー URI で指定することもできます。これにより、イメージ ファミリー内の最新イメージが常に選択されます。

  1. 完全 URI:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME/var>
  2. 部分 URI: projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME

カスタム イメージ URI の検索方法

Google Cloud CLI

次のコマンドを実行して、カスタム イメージの名前を一覧表示します。

gcloud compute images list

カスタム イメージの名前を次のコマンドに渡し、カスタム イメージの URI(selfLink)を一覧表示します。

gcloud compute images describe custom-image-name

出力スニペット:

...
name: CUSTOM_IMAGE_NAME
selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

Console

  1. Google Cloud コンソールで [Compute Engine] → [イメージ] ページを開き、イメージ名をクリックします。filter images フィールドにクエリを挿入して、表示される画像の数を制限できます。
  2. [イメージの詳細] ページが開きます。[同等の REST] をクリックします。
  3. REST レスポンスには、イメージの URI である selfLink など、イメージに関する詳細情報が一覧表示されます。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

カスタム イメージを使用してクラスタを作成する

gcloud CLI、Dataproc API、または Google Cloud コンソールを使用して、カスタム イメージを使用するマスターノードとワーカーノードからなるクラスタを作成する

gcloud CLI

--image フラグを指定した dataproc clusters create コマンドを使用して、カスタム イメージで Dataproc クラスタを作成します。

例:
gcloud dataproc clusters create CLUSTER-NAME \
    --image=CUSTOM_IMAGE_URI \
    --region=REGION \
    ... other flags ...

REST API

カスタム イメージを使用してクラスタを作成するには、cluster.create API リクエストに含まれる masterConfigworkerConfig、および該当する場合は secondaryWorkerConfig の各オブジェクトの InstanceGroupConfig.imageUri フィールドにカスタム イメージの URI を指定します。

例: カスタム イメージで標準の Dataproc クラスタ(1 つのマスターノード、2 つのワーカーノード)を作成するための REST リクエスト。

POST /v1/projects/PROJECT_ID/regions/REGION/clusters/
{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "masterConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    },
    "workerConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    }
  }
}
  

Console

  1. Dataproc の [クラスタの作成] ページを開きます。[クラスタを設定] パネルが選択されています。
  2. [バージョニング] セクションで、[変更] をクリックします。[カスタム イメージ] タブを選択し、Dataproc クラスタに使用するカスタム イメージを選択して、[選択] をクリックします。選択したカスタム イメージとともに、クラスタの VM がプロビジョニングされます。

カスタム イメージを使用して Dataproc クラスタ プロパティをオーバーライドする

カスタム イメージを使用して、クラスタの作成時に設定されたクラスタ プロパティを上書きできます。カスタム イメージを使用してクラスタを作成し、クラスタ作成オペレーションでカスタム イメージによって設定された値とは異なる値を持つプロパティが設定された場合、カスタム イメージによって設定されたプロパティ値が優先されます。

カスタム イメージを使用してクラスタ プロパティを設定するには:

  1. カスタム イメージのカスタマイズ スクリプトで、/etc/google-dataprocdataproc.custom.properties ファイルを作成し、ファイルにクラスタのプロパティ値を設定します。

    • dataproc.custom.properties ファイルのサンプル:
    dataproc.conscrypt.provider.enable=VALUE
    dataproc.logging.stackdriver.enable=VALUE
    
    • 2 つのクラスタ プロパティをオーバーライドするためのカスタマイズ スクリプト ファイル作成スニペットの例:
    cat <<EOF >/etc/google-dataproc/dataproc.custom.properties
    dataproc.conscrypt.provider.enable=true
    dataproc.logging.stackdriver.enable=false
    EOF
    

期限切れのカスタム イメージを使用してクラスタを作成する方法

デフォルトで、カスタム イメージはイメージの作成日から 365 日後に期限切れになります。 次の手順に従って、期限切れのカスタム イメージを使用するクラスタを作成できます。

  1. 期限切れのカスタム イメージ、または 10 日以内に期限切れになるカスタム イメージを使用して、Dataproc クラスタの作成を試みます。

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags ...
    
  2. gcloud CLI によって、クラスタ dataproc:dataproc.custom.image.expiration.token のプロパティ名とトークン値が含まれたエラー メッセージが発行されます。

dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE

TOKEN_VALUE 文字列をクリップボードにコピーします。

  1. gcloud CLI を使用して、コピーした TOKEN_VALUE をクラスタのプロパティとして追加し、Dataproc クラスタをもう一度作成します。

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --properties=dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE \
        --region=REGION \
        ... other flags ...
    

これで、このカスタム イメージを使用してクラスタを作成できます。