Cloud ComposerのプライベートIPネットワークについてのまとめ
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のドキュメントからもってきたものです。
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に移行した話は別途記事にまとめたいと思います。
Discussion