🗂

Cloud ComposerのプライベートIPネットワークについてのまとめ

2024/03/24に公開

Cloud Composer(マネージドAirflow)をプライベートIPネットワーク構成に移行した際に、色々調べたことをまとめました。
なお、Cloud Composer 2を前提としています。

Private IP環境にする動機

Cloud Composer環境をデフォルトで作成すると、パブリックネットワークにGKE Autopilotクラスタが作成されます。これにより、GKEノードにはパブリックIPアドレスが割り当てられます。そのため、固定IPアドレスで制限されている環境にアクセスするときに困ってしまいます。

外部へアクセスするグローバルIPアドレスを固定化するためには、別のVPCネットワークを作成し、プライベートサブネットからCloud NAT経由でインターネットにアクセスするようにルーティングする必要があります。

データ処理等はAirflow内部ではなくKubernetesPodOperatorやBigQueryなどCloud Composer外部で処理するのが、Airflowのベストプラクティスです[1]が、APIによるデータ取得(Extract)でAirflowワーカーで処理させたい場合に必要になるでしょう。また、Cloud ComposerのHighly Resilient(復元性に優れた)環境はPrivate IP環境でしか対応していない[2]ため、そういったユースケースでPrivate IP環境にすることが必要になります。

Cloud ComposerのプライベートIPネットワーク構成

Cloud Composer環境を作成すると、テナントのプロジェクトと顧客プロジェクトの間で環境のリソースが分配されます。

  • 顧客プロジェクト:自分たちのGPCプロジェクト。作成されたリソースは見える。
  • テナントのプロジェクト:Googleが管理しているプロジェクトでユーザーからはリソースが見えない。
    • Cloud SQLインスタンスとCloud SQLストレージが作成される

次の図はGoogle Cloudのドキュメントからもってきたものです。

composer-2-private-ip-psc-architecture

Private Service Connect(PSC)

Private Service Connectとは、VPCネットワークからGoogle APIやVPCとの接続をするものです。
顧客プロジェクト(GKEクラスタ)内に作成されたAirflowスケジューラやワーカーはPrivate Service Connect(PSC)エンドポイント経由でテナントプロジェクトにあるAirflowデータベース(Cloud SQL)に接続できます。

Cloud Composer環境のネットワーク設定

次の図は、Private IPを有効化したCloud Composer環境のネットワーク設定です。

項目 意味
Network ID VPCネットワーク
Subnetwork ID サブネット
GKE control plane IP range GKEコントロールプレーンのIPレンジ。GCPで設定されているデフォルト値
Composer connection subnetwork テナントプロジェクトにあるCloud SQLに接続するサブネット。PSCエンドポイントによってCloud SQLに接続する。

GKEクラスタのネットワーク設定

次の図はCloud Composer環境を作成した後のGKEクラスタのネットワーク設定です。

項目 意味
Network ID VPCネットワーク
Subnetwork ID サブネット
Control place authorized networks GKEコントロールプレーンへのIPアドレス制限

「Control place authorized networks」で 0.0.0.0/0 (すべて許可)にしていますが、GKEコントロールプレーンにはIAMとロールによるRBACによる認証が必要なため、セキュリティ上の問題はありません。

Terraform実装例

ネットワーク設定以外は省略しています。

resource "google_composer_environment" "composer_private" {
  name    = "composer-private"
  project = var.project_id
  region  = var.region

  config {
    node_config {
      network         = "projects/${var.project_id}/global/networks/${var.network}"
      subnetwork      = "projects/${var.project_id}/regions/${var.region}/subnetworks/${var.subnetwork}"
      service_account = var.service_account
    }

    private_environment_config {
      cloud_composer_connection_subnetwork   = "projects/${var.project_id}/regions/${var.region}/subnetworks/${var.subnetwork}"
      connection_type                        = "PRIVATE_SERVICE_CONNECT"
      enable_private_endpoint                = false
      enable_privately_used_public_ips       = false
      cloud_composer_network_ipv4_cidr_block = "172.31.254.0/24" # Cloud ComposerテナントネットワークのIPアドレス範囲
      cloud_sql_ipv4_cidr_block              = "10.0.0.0/12"     # Cloud Composer内Cloud SQLのIPアドレス範囲内
      master_ipv4_cidr_block                 = "172.16.2.0/23"   # GKEコントロールプレーンのIPアドレス範囲
    }

    software_config {
      image_version = "composer-2.5.3-airflow-2.6.3"
    }

    # GKEコントロールプレーンにkubectlするためのアクセス制限の設定
    master_authorized_networks_config {
      enabled = true
      cidr_blocks {
        cidr_block = "0.0.0.0/0"
      }
    }
  }
}

まとめ

本記事ではCloud Composer 2におけるPrivate IP環境についてまとめてみました。GCPのネットワークに関する知識を必要とするうえにドキュメントが事例が少ないので構築した際は苦労しました。読んでいただいた方の参考になれば幸いです。

デフォルトのCloud ComposerからPrivate IP環境のCloud Composerに移行した話は別途記事にまとめたいと思います。

脚注
  1. Apache Airflow : 10 rules to make it work ↩︎

  2. Cloud Composer の Day 2 Operation ベタープラクティス ↩︎

Discussion