備忘録。
前提条件
基本的なネットワークを設定するプロジェクトとリージョン、ゾーンを設定済みとする。
まずは基礎的な設定方法
example-instance
という VM インスタンス名を設定して、 https-web-server
というタグを付与する。
gcloud compute instances create example-instance \
--zone=us-central1-a \
--tags=https-web-server
次に、上記で指定したタグを付与した VM インスタンスに Firewall を設定する。
gcloud compute firewall-rules create allow-https \
--target-tags https-web-server \
--source-ranges 0.0.0.0/0 \
--allow tcp:443
セキュリティを高める
上記の設定はプロジェクト作成時の初期 VPC default
を使用しており、制限が緩い Firewall が設定されている。
そのため、default
の VPC を使わずに、カスタム VPC を作成して必要なポートのみ開放する。
1. カスタム VPC を作成する
例として、カスタム VPC 名を myapp-dev-vpc
を作成する。
$ gcloud compute networks create myapp-dev-vpc \
--subnet-mode=custom \
--bgp-routing-mode=regional
安易に default
の VPC を利用しないように、次のコマンドで削除できる。
$ gcloud compute networks delete default
注意点として、
- default を削除する前に、既存のリソース (VM, LB) が default VPC を参照していないか要確認
- App Engine 初回デプロイなど、サービスによっては自動的に default VPC を使う挙動があるので 、必要に応じて明示的に VPC を指定する
- Cloud Interconnect や VPN を使う場合は、サブネット設計時に CIDR を競合させない
あとで後述。
2. サブネットを設定する
$ gcloud compute networks subnets create myapp-dev-vpc \
--network=myapp-dev-vpc \
--region=asia-northeast1 \
--range=10.10.0.0/24
3. Firewall を設定する
VM を作成後に Firewall を設定する。
$ gcloud compute firewall-rules create allow-https \
--network=myapp-dev-vpc \
--priority=1000 \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=0.0.0.0/0 \
--target-tags https-web-server \
--enable-logging \
--tags
で指定するよりも、サービスアカウントを作成して指定する方が、セキュリティが高くなる。
(--target-service-accounts=web-server@${PROJECT_ID}.iam.gserviceaccount.com
など)
カスタム VPC の注意点
- App Engine
- Standard
- VPC は不要
- ただし、VPC 内の Cloud SQL や Momory Store のアクセスが必要ならば、Serverless VPC Access コネクタが必須
- コネクタはリージョン単位
- /28〜/23 の専用範囲を要求
- 他サブネットと重複不可
- 新規にコネクタを作成するのであれば、
Direct VPC Egress
を選択するのが良い - CIDR 範囲の管理が不要
- 余計なVMリソースも不要
- Direct VPC Egress を採用する場合は、
app.yaml
のnetwork
のname
でカスタム VPC とsubnetwork_name
でサブネット名を指定する
- Flexible
- default VPC を削除している場合 app.yaml の network でを必ずカスタム VPC を指定
- 指定しないと “default” を探して失敗する
- 25年 9月時点で
Direct VPC Egress
は未対応
- Standard
Serverless VPC Access コネクタ作成例
# アプリ側からは環境変数や接続ドライバで Private IP/内部の宛先を指定
# App Engine Standard は app.yaml にネットワーク直指定は不要
$ gcloud compute networks vpc-access connectors create myapp-dev-vpc-access-conn \
--region=asia-northeast1 \
--network=myapp-dev-vpc \
--range=10.8.0.0/28
app.yaml 記述例
runtime: python
env: flex
network:
name: myapp-dev-vpc
subnetwork_name: myapp-dev-vpc
# 必要に応じて
# forwarded_ports:
# session_affinity: false
- Cloud Run (第1/第2世代)
- 外部インターネットとの接続には VPC は不要
- VPC 内の Cloud Run や MemoryStore との通信が発生するのであれば、Serverless VPC Access コネクタが必要
- 新規でコネクタを作成するのであれば、Direct VPC Egress を選択するのが良い
- Serverless VPC Access コネクタを作成する場合は、前記の作成方法を参照
前述のServerless VPC Access コネクタを既存の Cloud Run に適用する場合は、
-
--ingress
(インバウンド) の設定を考慮したコネクタを生成する- all (どこからでも Cloud Run に到達可能)
- internal-and-cloud-load-balancing (基本的には Load Balancing と VPC 経由で到達)
- internal (基本的には Internal LB や 同一プロジェクト内の VPC を経由してのみ到達可能)
-
--vpc-egress
(アウトバウンド) の設定を考慮したコネクタを生成する- private-ranges-only (内部アドレス向けだけ VPC 経由)
- all-traffic (すべてのトラフィックを VPC 経由)
ことに注意。
VPC Egress を利用する場合は、次の --vpc-connector=myapp-dev-vpc-access-conn \
は不要。
--ingress
と --vpc-egress
は適宜、要件に合わせて設定する。
$ gcloud run services update web-backend \
--region=asia-northeast1 \
--subnet=myapp-dev-vpc
--vpc-connector=myapp-dev-vpc-access-conn \
--vpc-egress=private-ranges-only \
--ingress=internal-and-cloud-load-balancing