環境のスナップショットの保存と読み込み

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

このページでは、環境スナップショットを使用して環境の状態の保存と、読み込みの方法について説明します。

スナップショットを自動的に保存するように環境を構成できます。詳細については、スケジュール設定されたスナップショットを構成するをご覧ください。

環境のスナップショットについて

環境スナップショットは、環境の状態を保存します。環境のスナップショットは、オンデマンドでの保存と読み込みができます。

スナップショットを使用すると、次のことを行うことができます。

  • 環境を以前の状態に復元します。スナップショットを使用して環境のバックアップを作成し、スナップショットの 1 つを読み込んで環境を復元します。たとえば、環境が正常に更新された後でも、PyPI パッケージをインストールする更新オペレーションや、Airflow 構成オプションをオーバーライドする更新オペレーションをロールバックできます。

  • 並行アップグレードを実施して、環境をコピーします。既存の環境のスナップショットを作成し、同じバージョンまたはそれ以降のバージョンの Cloud Composer を使用する新しい環境を作成して、新しい環境にスナップショットを適用します。この手順は移行と類似しています。DAG が重複して実行されないように、スナップショットの作成前に DAG を一時停止してください。

スナップショットの保存方法

環境のスナップショットは、環境の状態を記述し、環境データのバックアップを保存する一連のファイルです。

環境スナップショットは複数作成できます。環境スナップショットは増分ではありません。任意のスナップショットを、他のスナップショットとは別に使用できます。

環境を削除しても、Cloud Composer ではスナップショットは削除されません。

デフォルトでは、Cloud Composer により環境のバケット内の snapshots/ フォルダにスナップショットが保存されます。スナップショットを作成するときに、独自の場所を指定することもできます。

Cloud Storage UI では便宜上、フォルダとしてデータが表示されますが、バケットはフラット ファイル構造で機能します。これは、Google Cloud コンソールでのスナップショットの保存と読み込みの方法を変更するものではありませんが、バケット内のファイルに対してオペレーションを直接実行する際には注意が必要です。詳細については、オブジェクトの名前空間をご覧ください。

スナップショットのセキュリティ上の考慮事項

このセキュリティ リスクを軽減するために、Airflow DAG で使用される機密情報(キーやパスワードなど)を Secret Manager に格納できます。詳細については、環境に Secret Manager を構成するをご覧ください。

環境のバケットのセキュリティ権限を確認してください。環境のスナップショットをカスタム バケットに保存する場合は、そのバケットに対するアクセス権限がプロジェクト内で正しく構成されていることを確認してください。権限を割り当てるときは、環境のサービス アカウントに、バケットからスナップショットの保存と読み込みを行うための十分な権限があることを確認してください。

スナップショットに保存されるデータ

Cloud Composer では、次のデータをスナップショットに保存します。

  • Airflow 構成のオーバーライド。
  • 環境変数。
  • 要件に応じたカスタム PyPI パッケージのリスト。
  • 実行されたタスクの状態や DAG の実行履歴など、Airflow データベースのバックアップ。
  • 環境のバケットの /dags/data/plugins フォルダのバックアップ。
  • 環境の Fernet 鍵
  • 環境のスケーリングやパフォーマンス パラメータなど、環境の構成に関するその他の情報。Cloud Composer は、スナップショットの読み込み時にこの情報を使用しません。

スナップショットから読み込まれるデータ

Cloud Composer では、スナップショットから次のデータが読み込まれます。

  • Airflow 構成のオーバーライド。
  • 環境変数。
  • カスタムの PyPI パッケージ(インストールのスキップを選択した場合を除く)。

  • 実行されたタスクの状態や DAG の実行履歴などを含む Airflow データベースのコンテンツ。

  • スナップショットの /dags/data/plugins フォルダの内容が環境のバケットに読み込まれます。

  • スナップショットの Fernet 鍵は、スナップショットのデータを環境独自の Fernet 鍵で再暗号化するために使用されます。環境の Fernet 鍵は変更されません。

Cloud Composer は、環境の構成に関する情報をスナップショットに保存しますが、スナップショットの読み込み時にその情報は使用されません。スナップショットを読み込んでも、次の環境のパラメータは変更されません。

  • 環境の構成(環境のスケーリングとパフォーマンスのパラメータなど)。
  • 環境のネットワーキング構成。
  • /dags/data/plugins フォルダ外部の環境のバケットの内容。
  • 環境ラベル。

スナップショットを読み込む際に、Cloud Composer API を使用せずに Cloud Composer インフラストラクチャで適用した設定が失われる可能性があります。

部分的に完了したオペレーションについて

スナップショットを読み込む際に、オペレーションは成功、失敗、または部分的に完了する可能性があります。

  • 成功したオペレーションでは、スナップショットからすべてのデータが読み込まれます。
  • オペレーションが失敗した場合、変更は行われません。
  • 部分的に完了したオペレーションでは、スナップショットからデータのサブセットが読み込まれます。このようなオペレーションは失敗として報告されますが、エラー メッセージでは正常に読み込まれたデータを示しています。たとえば、PyPI パッケージがインストールされているものの、Airflow 構成オプションのオーバーライドが正常に完了しなかった場合、エラー メッセージではこの内容が示されています。

部分的に完了したオペレーションについては、同じスナップショットの再度の読み込みを試すことができます。Cloud Composer により、前回の試行で成功したステップがスキップされます。たとえば、タイムアウトでオペレーションが失敗したものの、データベースは正常に読み込まれた場合、次回の試行では、データベースが再度読み込まれることはありません。

始める前に

  • スナップショットは、Cloud Composer 2 バージョン 2.0.9 以降でサポートされています。Cloud Composer 1 では、1.18.5 以降のバージョンで環境スナップショットの保存がサポートされています。

  • スナップショットでは環境は作成されません。ある環境から別の環境にスナップショットを読み込む場合は、まず新しい環境を作成し、その環境にスナップショットを読み込む必要があります。

  • エラー状態にある環境にスナップショットを読み込むことはできません。スナップショットを読み込んでも、このような環境の修正はできません。既存のスナップショットを新しい環境に読み込むことはできます。

  • スナップショットの読み込みができるのは、Airflow と同じバージョンかそれ以降のバージョンのみです。たとえば、Airflow 2.9.3 から Airflow 2.7.3 にスナップショットを読み込むことはできません。

  • 同じ Airflow バージョンの新しい Airflow ビルドから、以前のビルドの環境にスナップショットを読み込むことができます。たとえば、airflow-2.9.3-build.6airflow-2.9.3-build.5 に読み込むことができます。スナップショットを以前のビルドに読み込むのは、必要な場合のみにしてください。

  • スナップショットをサポートする Airflow データベースの最大サイズは 20 GB です。環境のデータベースが 20 GB を超える場合は、スナップショットを保存する前に Airflow データベースのサイズを小さくします。

  • スナップショットを作成するには、環境のバケット内の /dags/plugins/data フォルダ内のオブジェクトの合計数が 100,000 未満にする必要があります。

  • XCom メカニズムを使用してファイルを転送する場合は、[Airflow のガイドラインに従って使用][ext-airflow-xcom-backend]するようにしてください。XCom を使用して大きなファイルや大量のファイルを転送すると、Airflow データベースのパフォーマンスに影響し、スナップショットの読み込みや環境のアップグレード時に障害が発生する可能性があります。大量のデータを転送するには、Cloud Storage などの代替手段の使用を検討してください。

  • 環境のバケット内のオブジェクト名の長さは、1,024 文字以下にする必要があります。そうでない場合は、スナップショットを作成できません。

  • 環境のバケット外の場所にスナップショットを保存する場合は、環境のサービス アカウントに、指定した場所に対する読み取りおよび書き込み権限が付与されている必要があります。たとえば、ストレージ オブジェクト管理者のロールにはそのような権限があります。プロジェクトまたは特定のバケットにそのロールを適用できます。

  • スナップショットの作成と保存には、Cloud Storage に関連する追加費用が発生します。詳細については、料金をご覧ください。

環境のスナップショットを保存する

Cloud Composer は、指定したフォルダを基準としたサブフォルダに環境のスナップショットを保存します。フォルダ名には、プロジェクト ID、環境の場所、環境の名前、スナップショットが保存された時点のタイムスタンプが含まれます。例: /snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

コンソール

環境のスナップショットを作成するには:

  1. Google Cloud Console で [環境] ページに移動します。

    [環境] に移動

  2. 環境のリストで、ご利用の環境の名前をクリックします。[環境の詳細] ページが開きます。

  3. [スナップショットを保存] をクリックします。

  4. [スナップショットを保存] ダイアログで、スナップショットを保存する場所を選択します。

    • スナップショットを環境のバケットの /snapshots フォルダに保存するには、[環境バケット内のスナップショット フォルダを使用する(デフォルト)] を選択します。

    • スナップショットをカスタム フォルダに保存するには、[別のバケットでカスタム フォルダを使用する] を選択してから、場所を指定します。

  5. [保存] をクリックします。

gcloud

gcloud composer environments snapshots save コマンドは、環境のスナップショットを保存します。

  • snapshot-location 引数で、スナップショットが保存されるフォルダを指定します。デフォルトでは、スナップショットは環境のバケット内の /snapshots フォルダに保存されます。例: gs://us-central1-example-916807e1-bucket/snapshots他のフォルダを指定することもできます。

環境のスナップショットを保存するには、次のコマンドを実行します。

gcloud composer environments snapshots save \
  ENVIRONMENT_NAME \
  --location LOCATION \
  --snapshot-location "SNAPSHOTS_FOLDER"

以下のように置き換えます。

  • ENVIRONMENT_NAME を環境の名前にする。
  • LOCATION は、環境が配置されているリージョン。
  • (省略可)SNAPSHOTS_FOLDER は、スナップショットを保存するバケット フォルダの URI に置き換えます。この引数を省略すると、Cloud Composer では、スナップショットが環境のバケット内の /snapshots フォルダに保存されます。

次の例では、デフォルトの場所を使用します。

gcloud composer environments snapshots save \
  example-environment \
  --location us-central1

次の例では、カスタム フォルダに保存します。

gcloud composer environments snapshots save \
  example-environment \
  --location us-central1 \
  --snapshot-location "gs://example-bucket/environment_snapshots"

API

  1. environments.saveSnapshot API リクエストを作成します。

  2. リクエスト本文の snapshotLocation フィールドに、スナップショットを保存するフォルダを指定します。

{
  "snapshotLocation": "SNAPSHOTS_FOLDER"
}

以下のように置き換えます。

  • SNAPSHOTS_FOLDER は、スナップショットを保存するバケット フォルダの URI に置き換えます。

例:

// POST https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment:saveSnapshot

{
  "snapshotLocation": "gs://us-central1-example-916807e1-bucket/snapshots"
}

Terraform

Terraform から環境のスナップショットの保存と読み込みを行うことはできません。

スナップショットの保存と読み込みは、環境に対して実施されるアクションであり、生成されるスナップショットは環境の定義の部分ではありません。Terraform は Cloud Composer 環境の構成のみを管理するため、そこから環境スナップショットの保存と読み込みを行うことはできません。

環境のスナップショットを読み込む

次のような状況を考えてみましょう。たとえば、キャッチアップが有効になっていて、スナップショットが作成されてから読み込まれるまでの間に、Airflow により DAG が実行されます。この場合、スナップショットを読み込んだ後では、Airflow には実施された DAG 実行に関する情報がないため、Airflow は同じ時刻とデータに対して DAG を再度実行します。

別の例として、日次スケジュールで実行される DAG について考えてみます。スナップショットを取得すると、Airflow によってこの DAG が実行されます。その後、同じ日にスナップショットを読み込みます。この場合、キャッチアップが無効になっていても Airflow により DAG が再度実行されます。

コンソール

スナップショットを環境に読み込むには:

  1. Google Cloud Console で [環境] ページに移動します。

    [環境] に移動

  2. 環境のリストで、ご利用の環境の名前をクリックします。[環境の詳細] ページが開きます。

  3. [スナップショットを読み込む] をクリックします。

  4. [スナップショットを読み込む] ダイアログで、[参照] をクリックします。

  5. スナップショットを保存するフォルダを選択します。フォルダ名には、プロジェクトの ID、環境の場所、スナップショットが保存された時点のタイムスタンプが含まれます。例: /snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  6. (省略可)スナップショットからカスタム PyPI パッケージのインストールをスキップするには、[PyPI パッケージのインストールをスキップ] を選択します。カスタム PyPI パッケージがインストールされている環境のスナップショットを読み込む場合、Cloud Composer はこれらのカスタム パッケージをインストールしません。

  7. [読み込む] をクリックし、Cloud Composer によってスナップショットが読み込まれるまで待ちます。

gcloud

gcloud composer environments snapshots load コマンドを実行すると、環境にスナップショットが読み込まれます。

  • --snapshot-path 引数で、スナップショットが配置されるフォルダを指定します。

    フォルダ名には、プロジェクトの ID、環境の場所、スナップショットが保存された時点のタイムスタンプが含まれます。例: gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  • (省略可)--skip-pypi-packages-installation 引数を使用すると、スナップショットからカスタム PyPI パッケージのインストールをスキップします。カスタム PyPI パッケージがインストールされている環境のスナップショットを読み込む場合、Cloud Composer はこれらのカスタム パッケージをインストールしません。

gcloud composer environments snapshots load \
  DESTINATION_ENVIRONMENT_NAME \
  --location LOCATION \
  --snapshot-path "SNAPSHOT_PATH"

以下のように置き換えます。

  • DESTINATION_ENVIRONMENT_NAME は、スナップショットを読み込む環境の名前に置き換えます。
  • LOCATION は、環境が配置されているリージョン。
  • SNAPSHOT_PATH をバケットの URI に続けて、スナップショットのパスを指定したものに置き換えます。

例:

gcloud composer environments snapshots load \
  example-environment \
  --location us-central1 \
  --snapshot-path "gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00"

API

  1. environments.loadSnapshot API リクエストを作成します。

  2. リクエストの本文の snapshotPath フィールドで、バケットの URI のパスに続いてスナップショットのパスを指定します。フォルダ名には、プロジェクトの ID、環境の場所、スナップショットが保存された時点のタイムスタンプが含まれます。例: gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  3. (省略可)リクエスト本文の skipPypiPackagesInstallation フィールドで、スナップショットからカスタム PyPI パッケージのインストールをスキップする必要があるかどうかを指定します。カスタム PyPI パッケージがインストールされている環境のスナップショットを読み込む場合、Cloud Composer はこれらのカスタム パッケージをインストールしません。

    このフィールドは省略可能です。このフィールドを省略すると、Cloud Composer はスナップショットから PyPI パッケージをインストールします。

{
  "snapshotPath": "SNAPSHOT_PATH"
}

以下のように置き換えます。

  • SNAPSHOT_PATH は、スナップショットを保存するバケット フォルダの URI に置き換えます。

例:

// POST https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment:loadSnapshot

{
  "snapshotPath": "gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00",
  "skipPypiPackagesInstallation": "False"
}

Terraform

Terraform を使用して環境のスナップショットの保存と読み込みを行うことはできません。

スナップショットの保存と読み込みは、環境に対して実施されるアクションであり、生成されるスナップショットは環境の定義の部分ではありません。Terraform は Cloud Composer 環境の構成のみを管理するため、そこから環境スナップショットの保存と読み込みを行うことはできません。

次のステップ