Flex テンプレートを使用して Dataflow パイプラインをデプロイ用にパッケージ化する

このページでは、Dataflow パイプラインの Flex テンプレートを作成する方法について説明します。Flex テンプレートを使用すると、Apache Beam パイプライン コードをパッケージ化して、開発環境がなくてもパイプラインを実行できます。Flex テンプレートを作成すると、適切な権限を持つユーザーは誰でもパイプラインを Dataflow ジョブとして実行できます。

Flex テンプレートの作成と実行に関するエンドツーエンドのチュートリアルについては、Flex テンプレートの例を作成して実行するをご覧ください。

概要

Flex テンプレートは、次の要素で構成されています。

  • Artifact Registry に保存されているコンテナ イメージ。コンテナは Dataflow ジョブの起動を担当します。

  • Cloud Storage に保存されている JSON 仕様ファイル。このファイルには、コンテナ イメージへのポインタとその他のメタデータが含まれています。

Flex テンプレートを作成する前に、Apache Beam SDK を使用してパイプライン コードを記述する必要があります。詳細については、Apache Beam を使用してパイプラインを構築するをご覧ください。

パイプラインを開始するには、パイプラインを構築するプログラムが run の呼び出し後に終了する必要があります。waitUntilFinish(Java)または wait_until_finish(Python)を呼び出さないでください。これらの関数はブロックされ、Flex テンプレートの実行が妨げられます。

必要な権限

Flex テンプレートのビルドに必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

テンプレート メタデータ

必要に応じて、テンプレートに追加のメタデータ(以下を含む)を指定できます。

  • パイプライン パラメータ: パイプラインで使用するカスタム パイプライン オプションを宣言します。Dataflow は、Flex テンプレート ジョブを送信するときにパラメータを検証します。Google Cloud コンソールを使用してテンプレートを実行すると、[テンプレートからジョブを作成] ダイアログに、メタデータで宣言されたパイプライン パラメータが含まれます。

  • ストリーミングのサポート: パイプラインがストリーミングをサポートするかどうかを指定できます。サポートする場合は、1 回限りモードと 1 回以上モードのどちらをサポートするかを指定できます。このメタデータにより、テンプレートの実行時に Google Cloud コンソールに関連するパイプライン オプションが表示されます。

追加のメタデータを含めるには、メタデータ パラメータを含む JSON ファイルを作成します。このファイルは、gcloud dataflow flex-template build コマンドの --metadata-file フラグで指定します。メタデータ ファイルの内容は、テンプレート仕様ファイルに統合されます。詳細については、Flex テンプレートをビルドするをご覧ください。

メタデータのパラメータ

パラメータキー 必須 値の説明
name テンプレートの名前。
description × テンプレートを説明する短い文章。
streaming × true の場合、このテンプレートはストリーミングをサポートします。デフォルト値は false です。
supportsAtLeastOnce × true の場合、このテンプレートは 1 回以上の処理をサポートします。デフォルト値は false です。テンプレートが 1 回以上のストリーミング モードで動作するように設計されている場合は、このパラメータを true に設定します。
supportsExactlyOnce × true の場合、このテンプレートは 1 回限りの処理をサポートします。デフォルト値は true です。
defaultStreamingMode × 1 回以上モードと 1 回限りモードの両方をサポートするテンプレートのデフォルトのストリーミング モード。"AT_LEAST_ONCE""EXACTLY_ONCE" のいずれかの値を使用できます。指定しない場合、デフォルトのストリーミング モードは 1 回限りモードです。
parameters × テンプレートで使用する追加のパラメータの配列。デフォルトで空の配列が使用されます。
name テンプレートで使用されるパラメータの名前。
label Google Cloud パラメータにラベルを付けるためにコンソールで使用される、人が読める文字列。
helpText パラメータを説明する短い文章。
isOptional × パラメータが必須の場合は false、パラメータが省略可能な場合は true。値が設定されていない場合、isOptional はデフォルトで false に設定されます。このパラメータキーをメタデータに含めない場合、メタデータが必須パラメータになります。
regexes × パラメータの値を検証するために使用される文字列形式の POSIX-egrep 正規表現の配列。たとえば、["^[a-zA-Z][a-zA-Z0-9]+"] は、値がアルファベットで始まり、その後に文字が 1 つ以上続くことを検証する単独の正規表現です。デフォルトで空の配列が使用されます。

メタデータ ファイルの例

Java

{
  "name": "Streaming Beam SQL",
  "description": "An Apache Beam streaming pipeline that reads JSON encoded messages from Pub/Sub, uses Beam SQL to transform the message data, and writes the results to a BigQuery",
  "parameters": [
    {
      "name": "inputSubscription",
      "label": "Pub/Sub input subscription.",
      "helpText": "Pub/Sub subscription to read from.",
      "regexes": [
        "[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "outputTable",
      "label": "BigQuery output table",
      "helpText": "BigQuery table spec to write to, in the form 'project:dataset.table'.",
      "isOptional": true,
      "regexes": [
        "[^:]+:[^.]+[.].+"
      ]
    }
  ]
}

Python

{
  "name": "Streaming beam Python flex template",
  "description": "Streaming beam example for python flex template.",
  "parameters": [
    {
      "name": "input_subscription",
      "label": "Input PubSub subscription.",
      "helpText": "Name of the input PubSub subscription to consume from.",
      "regexes": [
        "projects/[^/]+/subscriptions/[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "output_table",
      "label": "BigQuery output table name.",
      "helpText": "Name of the BigQuery output table name.",
      "isOptional": true,
      "regexes": [
        "([^:]+:)?[^.]+[.].+"
      ]
    }
  ]
}

Google 提供のテンプレートのメタデータ ファイルは、Dataflow のテンプレート ディレクトリからダウンロードできます。

環境変数

Flex テンプレートをビルドするときは、gcloud dataflow flex-template build コマンドの --env フラグで次の環境変数を指定します。カスタム イメージを使用している場合は、Dockerfile でこれらの環境変数を設定します。

Java

ENV 説明 必須
FLEX_TEMPLATE_JAVA_MAIN_CLASS Flex テンプレートを起動するために、実行する Java クラスを指定します。
FLEX_TEMPLATE_JAVA_CLASSPATH クラスファイルの場所を指定します。
FLEX_TEMPLATE_JAVA_OPTIONS Flex テンプレートの起動時に渡す Java のオプションを指定します。 ×

Dockerfile で FLEX_TEMPLATE_JAVA_MAIN_CLASSFLEX_TEMPLATE_JAVA_CLASSPATH を指定します。

Python

ENV 説明 必須
FLEX_TEMPLATE_PYTHON_PY_FILE Flex テンプレートを起動するために、実行する Python ファイルを指定します。
FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE パイプラインの依存関係を含む要件ファイルを指定します。詳細については、Apache Beam ドキュメントの PyPI の依存関係をご覧ください。 ×
FLEX_TEMPLATE_PYTHON_SETUP_FILE パイプライン パッケージ setup.py ファイルのパスを指定します。詳細については、Apache Beam ドキュメントの複数ファイルの依存関係をご覧ください。 ×
FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

一般公開されていないパッケージを指定します。追加のパッケージの使用方法については、ローカルまたは PyPI 以外の依存関係をご覧ください。

×
FLEX_TEMPLATE_PYTHON_PY_OPTIONS Flex テンプレートの起動時に渡す Python のオプションを指定します。 ×

Dockerfile で FLEX_TEMPLATE_PYTHON_PY_FILE を指定します。

パイプラインの依存関係を管理するには、次のように Dockerfile で変数を設定します。

  • FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
  • FLEX_TEMPLATE_PYTHON_PY_OPTIONS
  • FLEX_TEMPLATE_PYTHON_SETUP_FILE
  • FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

たとえば、GitHub の Python Flex テンプレートでのストリーミングのチュートリアルでは、次の環境変数が設定されています。

ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="${WORKDIR}/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/streaming_beam.py"

Go

ENV 説明 必須
FLEX_TEMPLATE_GO_BINARY 実行する Go バイナリ ファイルを指定します。

Dockerfile で FLEX_TEMPLATE_GO_BINARY を指定します。

Flex テンプレート イメージ

Flex テンプレートには、Dataflow パイプラインを起動するコンテナ イメージが含まれています。Flex テンプレート ジョブを実行すると、Dataflow サービスは Artifact Registry からコンテナ イメージをダウンロードしてコンテナを起動します。コンテナは Dataflow ジョブの起動を担当します。

Google は、使用可能な Flex テンプレートのベースイメージのセットを保持しています。ただし、パイプラインでカスタム コンテナ イメージが必要な場合は、Flex テンプレートに同じイメージを使用することをおすすめします。これにより、Flex テンプレート ランチャーには、パイプラインのランタイム コンテナと同じ依存関係が含まれます。

カスタム コンテナ イメージ

カスタム Flex テンプレート イメージを作成するには、Dockerfile に次の手順を含めます。

  • Flex テンプレート ランチャー バイナリを、Google 提供のベースイメージのいずれかからイメージにコピーします。ランチャー バイナリは次のパスにあります。

    Java

    /opt/google/dataflow/java_template_launcher

    Python

    /opt/google/dataflow/python_template_launcher

    Go

    /opt/google/dataflow/go_template_launcher

  • パイプライン ジョブの起動に必要なアーティファクト(Python ファイル、JAR ファイル、Go バイナリなど)をコピーします。

  • 環境変数に記載されている環境変数を設定します。

次の例は、Python パイプラインの Dockerfile を示しています。

# Flex Template base image. Used here to get the launcher binary.
FROM gcr.io/dataflow-templates-base/IMAGE_NAME:TAG as template_launcher

# Apache Beam SDK image. This is the base image for the pipeline job.
FROM apache/beam_python3.10_sdk:2.69.0

# Customize the image for your pipeline.
# [...]

# Configure the Flex Template.
COPY --from=template_launcher /opt/google/dataflow/python_template_launcher /opt/google/dataflow/python_template_launcher
COPY my_pipeline.py /template/
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/my_pipeline.py"

次のように置き換えます。

  • IMAGE_NAME: Google が提供するベースイメージ。例: python311-template-launcher-base
  • TAG: Flex テンプレートのベースイメージに記載されているベースイメージのバージョンタグ。安定性の向上とトラブルシューティングのために、latest は使用しないでください。代わりに、具体的なバージョンタグに固定してください。

この方法に沿ったチュートリアルについては、依存関係のあるパイプラインとカスタム コンテナ イメージの Flex テンプレートをご覧ください。

Flex テンプレートをビルドする

Flex テンプレートをビルドするには、gcloud dataflow flex-template build コマンドを使用します。このコマンドは、次のアーティファクトを作成します。

  • Cloud Storage に保存されているテンプレート仕様ファイル
  • Artifact Registry に保存されているランチャー コンテナ イメージ

Google 提供のベースイメージを使用する

Google 提供のベースイメージを使用して Flex テンプレートを実行するには、次のコマンドを実行します。

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "JAVA" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --jar "JAR_FILE" \
  --env "FLEX_TEMPLATE_JAVA_MAIN_CLASS=JAVA_MAIN_CLASS"

次のように置き換えます。

  • BUCKET_NAME: テンプレート仕様ファイルを保存する Cloud Storage バケットの名前
  • TEMPLATE_FILE_NAME: 作成するテンプレート仕様ファイルの名前。例: my_template.json
  • LOCATION: Artifact Registry リポジトリのロケーション。
  • PROJECT_ID: Google Cloud プロジェクト ID
  • REPOSITORY: Artifact Registry リポジトリの名前。
  • IMAGE: Flex テンプレート コンテナ イメージの名前
  • TAG: Flex テンプレート コンテナ イメージのタグ
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "JAVA17". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: メタファイル ファイルのローカルパス。詳細については、テンプレート メタデータをご覧ください。
  • JAR_FILE: パイプライン コードの JAR ファイルのローカルパス。複数の JAR ファイルがある場合は、カンマ区切りのリストとしてフォーマットするか、個別の --jar フラグで指定します。
  • JAVA_MAIN_CLASS: 実行する Java クラスの名前。詳細については、環境変数をご覧ください。

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "PYTHON" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --py-path "PYTHON_FILE_PATH" \
  --env "FLEX_TEMPLATE_PYTHON_PY_FILE=PYTHON_FILE"

次のように置き換えます。

  • BUCKET_NAME: テンプレート仕様ファイルを保存する Cloud Storage バケットの名前
  • TEMPLATE_FILE_NAME: 作成するテンプレート仕様ファイルの名前。例: my_template.json
  • LOCATION: Artifact Registry リポジトリのロケーション。
  • PROJECT_ID: Google Cloud プロジェクト ID
  • REPOSITORY: Artifact Registry リポジトリの名前。
  • IMAGE: Flex テンプレート コンテナ イメージの名前
  • TAG: Flex テンプレート コンテナ イメージのタグ
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "PYTHON3". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: メタファイル ファイルのローカルパス。詳細については、テンプレート メタデータをご覧ください。
  • PYTHON_FILE_PATH: パイプラインの Python ファイルとそのすべての依存ファイルへのローカルパス。複数のパスは、カンマ区切りのリストまたは個別の --py-path フラグとして指定できます。
  • PYTHON_FILE: 実行する Python ファイル。詳細については、環境変数をご覧ください。

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "GO" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --go-binary-path="GO_FILE_PATH" \
  --env "FLEX_TEMPLATE_GO_BINARY=GO_BINARY"

次のように置き換えます。

  • BUCKET_NAME: テンプレート仕様ファイルを保存する Cloud Storage バケットの名前
  • TEMPLATE_FILE_NAME: 作成するテンプレート仕様ファイルの名前。例: my_template.json
  • LOCATION: Artifact Registry リポジトリのロケーション。
  • PROJECT_ID: Google Cloud プロジェクト ID
  • REPOSITORY: Artifact Registry リポジトリの名前。
  • IMAGE: Flex テンプレート コンテナ イメージの名前
  • TAG: Flex テンプレート コンテナ イメージのタグ
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "GO". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: メタファイル ファイルのローカルパス。詳細については、テンプレート メタデータをご覧ください。
  • GO_FILE_PATH: パイプライン用にコンパイルされた Go バイナリのローカルパス
  • GO_BINARY: 実行する Go バイナリ。詳細については、環境変数をご覧ください。

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

カスタム コンテナ イメージを使用して Flex テンプレートを実行するには、次のコマンドを実行します。

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "JAVA" \
  --metadata-file "METADATA_FILE"

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "PYTHON" \
  --metadata-file "METADATA_FILE"

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "GO" \
  --metadata-file "METADATA_FILE"

次のように置き換えます。

  • BUCKET_NAME: テンプレート仕様ファイルを保存する Cloud Storage バケットの名前。

  • TEMPLATE_FILE_NAME: テンプレート仕様ファイルの名前。例: my_template.json

  • CUSTOM_IMAGE: カスタム イメージのイメージ レジストリのロケーション。

  • METADATA_FILE: メタファイル ファイルのローカルパス。

Python のパッケージ依存関係

Dataflow Python パイプラインで追加の依存関係を使用する場合は、Dataflow ワーカー VM に追加の依存関係をインストールするように Flex テンプレートを構成する必要があります。

インターネットへのアクセスが制限される環境で Flex テンプレートを使用する Python Dataflow ジョブを実行する場合は、テンプレートの作成時に依存関係をパッケージ化しておく必要があります。

Python 依存関係を事前にパッケージ化するには、次のいずれかのオプションを使用します。

Java パイプラインと Go パイプラインでのパイプライン依存関係の管理手順については、Dataflow でパイプラインの依存関係を管理するをご覧ください。

要件ファイルを使用してテンプレートと一緒に依存関係を事前にパッケージ化する

独自の Dockerfile を使用して Flex テンプレート イメージを定義する場合は、次の操作を行います。

  1. requirements.txt ファイルを作成してパイプラインの依存関係のリストを記述します。

    COPY requirements.txt /template/
    ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
    
  2. Flex テンプレート イメージに依存関係をインストールします。

    RUN pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    
  3. 依存関係をローカル要件のキャッシュにダウンロードします。このキャッシュは、テンプレートの起動時に Dataflow ワーカーにステージングされます。

    RUN pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    

この方法を使用すると、requirements.txt ファイルの依存関係が実行時に Dataflow ワーカーにインストールされます。 Google Cloud コンソールの [推奨事項] タブの分析情報に、この動作が記録される場合があります。実行時に依存関係がインストールされないようにするには、カスタム コンテナ イメージを使用します。

次のコードサンプルは、Flex テンプレートで要件ファイルを使用しています。

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base

# Configure the Template to launch the pipeline with a --requirements_file option.
# See: https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#pypi-dependencies
ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/streaming_beam.py"

COPY . /template

RUN apt-get update \
    # Install any apt packages if required by your template pipeline.
    && apt-get install -y libffi-dev git \
    && rm -rf /var/lib/apt/lists/* \
    # Upgrade pip and install the requirements.
    && pip install --no-cache-dir --upgrade pip \
    # Install dependencies from requirements file in the launch environment.
    && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    # When FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE  option is used,
    # then during Template launch Beam downloads dependencies
    # into a local requirements cache folder and stages the cache to workers.
    # To speed up Flex Template launch, pre-download the requirements cache
    # when creating the Template.
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE

# Set this if using Beam 2.37.0 or earlier SDK to speed up job submission.
ENV PIP_NO_DEPS=True

ENTRYPOINT ["/opt/google/dataflow/python_template_launcher"]

パイプラインをパッケージとして構造化し、ローカル パッケージを使用する

複数の Python ローカル ファイルまたはモジュールを使用する場合は、パイプラインをパッケージとして構造化します。ファイル構造は次の例のようになります。

main.py
pyproject.toml
setup.py
src/
  my_package/
    __init__.py
    my_custom_dofns_and_transforms.py
    my_pipeline_launcher.py
    other_utils_and_helpers.py
  1. 最上位のエントリ ポイント(main.py ファイルなど)をルート ディレクトリに配置します。残りのファイルを src ディレクトリの別のフォルダ(my_package など)に配置します。

  2. パッケージの詳細と要件を含むパッケージ構成ファイルをルート ディレクトリに追加します。

    pyproject.toml

    [project]
    name = "my_package"
    version = "package_version"
    dependencies = [
      # Add list of packages (and versions) that my_package depends on.
      # Example:
      "apache-beam[gcp]==2.54.0",
    ]
    

    setup.py

      """An optional setuptools configuration stub for the pipeline package.
    
      Use pyproject.toml to define the package. Add this file only if you must
      use the --setup_file pipeline option or the
      FLEX_TEMPLATE_PYTHON_SETUP_FILE configuration option.
      """
    
      import setuptools
      setuptools.setup()
    

    ローカル パッケージを構成する方法については、Python プロジェクトのパッケージ化をご覧ください。

  3. パイプラインのローカル モジュールまたはファイルをインポートする場合は、インポートパスとして my_package パッケージ名を使用します。

    from my_package import word_count_transform
    
  4. パイプライン パッケージを Flex テンプレート イメージにインストールします。Flex テンプレートの Dockerfile には、次の例のような内容が含まれます。

    Dockerfile

    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/main.py"
    ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"
    
    # Copy pipeline, packages and requirements.
    WORKDIR ${WORKDIR}
    COPY main.py .
    COPY pyproject.toml .
    COPY setup.py .
    COPY src src
    
    # Install local package.
    RUN pip install -e .
    

この方法を使用すると、requirements.txt ファイルの依存関係が実行時に Dataflow ワーカーにインストールされます。 Google Cloud コンソールの [推奨事項] タブの分析情報に、この動作が記録される場合があります。実行時に依存関係がインストールされないようにするには、カスタム コンテナ イメージを使用します。

この推奨方法に従った例については、GitHub の依存関係のあるパイプラインとカスタム コンテナ イメージの Flex テンプレートのチュートリアルをご覧ください。

すべての依存関係をプリインストールするカスタム コンテナを使用する

実行時に依存関係がインストールされないようにするには、カスタム コンテナを使用します。このオプションは、インターネットにアクセスできない環境で実行されるパイプラインに適しています。

カスタム コンテナを使用する手順は次のとおりです。

  1. 必要な依存関係をプリインストールするカスタム コンテナ イメージを作成します。

  2. Flex テンプレートの Dockerfile に同じ依存関係をプリインストールします。

    実行時に依存関係がインストールされないようにするには、Flex テンプレートの構成で FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE オプションまたは FLEX_TEMPLATE_PYTHON_SETUP_FILE オプションを使用しないでください。

    変更後の Flex テンプレート Dockerfile は、次のようになります。

    FROM gcr.io/dataflow-templates-base/python3-template-launcher-base
    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/main.py"
    COPY . /template
    # If you use a requirements file, pre-install the requirements.txt.
    RUN pip install --no-cache-dir -r /template/requirements.txt
    # If you supply the pipeline in a package, pre-install the local package and its dependencies.
    RUN pip install -e /template
    

    このアプローチを使用する手順は次のとおりです。

    • Flex テンプレート イメージをビルドする
    • カスタム SDK コンテナ イメージをビルドする
    • 両方のイメージに同じ依存関係をインストールする

    また、維持するイメージの数を減らすため、カスタム コンテナ イメージを Flex テンプレートのベースイメージとして使用します

  3. Apache Beam SDK バージョン 2.49.0 以前を使用している場合は、パイプライン ランチャーに --sdk_location=container パイプライン オプションを追加します。このオプションは、SDK をダウンロードするのではなく、カスタム コンテナから SDK を使用するようにパイプラインに指示します。

    options = PipelineOptions(beam_args, save_main_session=True, streaming=True, sdk_location="container")
    
  4. flex-template run コマンドで sdk_container_image パラメータを設定します。例:

    gcloud dataflow flex-template run $JOB_NAME \
       --region=$REGION \
       --template-file-gcs-location=$TEMPLATE_PATH \
       --parameters=sdk_container_image=$CUSTOM_CONTAINER_IMAGE \
       --additional-experiments=use_runner_v2
    

    詳細については、Dataflow でカスタム コンテナを使用するをご覧ください。

Flex テンプレートで非公開 Docker レジストリを使用する

非公開レジストリが HTTPS を使用し、有効な証明書があれば、非公開の Docker レジストリに保存されている Flex テンプレート イメージをビルドできます。

非公開レジストリのイメージを使用するには、イメージのパスと、レジストリのユーザー名とパスワードを指定します。ユーザー名とパスワードは Secret Manager に保存する必要があります。シークレットは次のいずれかの形式で指定できます。

  • projects/{project}/secrets/{secret}/versions/{secret_version}
  • projects/{project}/secrets/{secret}

2 つ目の形式を使用する場合はバージョンが指定されないため、Dataflow は最新バージョンを使用します。

レジストリが自己署名証明書を使用している場合は、Cloud Storage の自己署名証明書へのパスも指定する必要があります。

次の表に、非公開レジストリの構成に使用できる gcloud CLI オプションを示します。

パラメータ 説明
image レジストリのアドレス。例: gcp.repository.example.com:9082/registry/example/image:latest
image-repository-username-secret-id 非公開レジストリで認証するユーザー名の Secret Manager のシークレット ID。例: projects/example-project/secrets/username-secret
image-repository-password-secret-id 非公開レジストリで認証するパスワードの Secret Manager のシークレット ID。例: projects/example-project/secrets/password-secret/versions/latest
image-repository-cert-path 非公開レジストリの自己署名証明書の完全な Cloud Storage URL。この値は、レジストリが自己署名証明書を使用する場合にのみ必要です。例: gs://example-bucket/self-signed.crt

次の Google Cloud CLI コマンドの例では、自己署名証明書がある非公開レジストリ内のイメージを使用して Flex テンプレートを作成します。

gcloud dataflow flex-template build gs://example-bucket/custom-pipeline-private-repo.json
--sdk-language=JAVA
--image="gcp.repository.example.com:9082/registry/example/image:latest"
--image-repository-username-secret-id="projects/example-project/secrets/username-secret"
--image-repository-password-secret-id="projects/example-project/secrets/password-secret/versions/latest"
--image-repository-cert-path="gs://example-bucket/self-signed.crt"
--metadata-file=metadata.json

独自の Flex テンプレートをビルドするには、上記の例の値を置き換える必要があります。また、異なるオプションや追加のオプションの指定が必要になることもあります。

次のステップ