gcp-networking について
gcp-networkingは、Google Cloud Platformのネットワーク基盤を設計、設定し、安全性を高めるスキルです。GCPプロジェクトを管理するクラウドチーム向けに、VPC、ファイアウォール、ロードバランサー、Cloud NAT、Private Service Connect、Terraformの設定を扱います。
主な機能
- 01VPCとサブネットの設定
- 02ファイアウォールルールの管理
- 03Cloud NATによるアウトバウンドアクセス
- 04外部・内部ロードバランシング
- 05Private Service ConnectとShared VPC
- 06Terraformによるネットワークリソース設定
活用シーン
- 01新しいGCPプロジェクトのVPC構築
- 02プライベートインスタンスへの外部接続の提供
- 03サービス用ロードバランサーのデプロイ
- 04ファイアウォールと接続障害の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill gcp-networkingインストール後、Claude Code で/gcp-networkingを入力して読み込まれたか確認します。
詳細
GCP ネットワーキング
Google Cloud Platform 上のネットワークインフラストラクチャを設計、実装し、セキュリティを確保します。
使用するタイミング
- 新しい GCP プロジェクトや複数プロジェクトのアーキテクチャ向けに VPC ネットワークを構築する場合
- サービス間のトラフィックを制御するファイアウォールルールを設定する場合
- プライベートインスタンスからのインターネットへのアウトバウンドアクセス用に Cloud NAT を設定する場合
- HTTP(S)、TCP/UDP、または内部トラフィック用のロードバランサーをデプロイする場合
- Private Service Connect または Shared VPC を実装する場合
前提条件
- Google Cloud SDK(
gcloud)がインストールされ、認証済みであること - Compute Engine API が有効になっていること
- ネットワーク管理用の IAM ロール
roles/compute.networkAdmin
gcloud services enable compute.googleapis.com servicenetworking.googleapis.com
VPC ネットワークの作成
gcloud compute networks create prod-vpc \
--subnet-mode=custom --bgp-routing-mode=regional --mtu=1460
gcloud compute networks subnets create us-subnet \
--network=prod-vpc --region=us-central1 --range=10.0.0.0/20 \
--enable-private-ip-google-access --enable-flow-logs \
--logging-flow-sampling=0.5
gcloud compute networks subnets create eu-subnet \
--network=prod-vpc --region=europe-west1 --range=10.1.0.0/20 \
--enable-private-ip-google-access --enable-flow-logs
# Subnet with secondary ranges for GKE
gcloud compute networks subnets create gke-subnet \
--network=prod-vpc --region=us-central1 --range=10.2.0.0/20 \
--secondary-range=pods=10.4.0.0/14,services=10.8.0.0/20 \
--enable-private-ip-google-access
# Proxy-only subnet (required for regional L7 LBs)
gcloud compute networks subnets create proxy-only-subnet \
--network=prod-vpc --region=us-central1 --range=10.129.0.0/23 \
--purpose=REGIONAL_MANAGED_PROXY --role=ACTIVE
ファイアウォールルール
gcloud compute firewall-rules create allow-http-https \
--network=prod-vpc --allow=tcp:80,tcp:443 \
--source-ranges=0.0.0.0/0 --target-tags=http-server --priority=1000
gcloud compute firewall-rules create allow-internal \
--network=prod-vpc --allow=tcp,udp,icmp \
--source-ranges=10.0.0.0/8 --priority=1000
gcloud compute firewall-rules create allow-iap-ssh \
--network=prod-vpc --allow=tcp:22 \
--source-ranges=35.235.240.0/20 --priority=1000
gcloud compute firewall-rules create allow-health-checks \
--network=prod-vpc --allow=tcp:80,tcp:443,tcp:8080 \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=http-server --priority=900
# List firewall rules
gcloud compute firewall-rules list --filter="network=prod-vpc" \
--format="table(name,direction,priority,allowed[].map().firewall_rule().list():label=ALLOW)"
Cloud NAT
gcloud compute routers create prod-router \
--network=prod-vpc --region=us-central1
gcloud compute routers nats create prod-nat \
--router=prod-router --region=us-central1 \
--nat-all-subnet-ip-ranges --auto-allocate-nat-external-ips \
--min-ports-per-vm=256 --max-ports-per-vm=4096 \
--enable-logging --log-filter=ERRORS_ONLY
# Static NAT IPs (stable egress)
gcloud compute addresses create nat-ip-1 nat-ip-2 --region=us-central1
gcloud compute routers nats create prod-nat-static \
--router=prod-router --region=us-central1 \
--nat-all-subnet-ip-ranges --nat-external-ip-pool=nat-ip-1,nat-ip-2
外部 HTTP(S) ロードバランサー
gcloud compute addresses create web-lb-ip --global
gcloud compute health-checks create http web-hc \
--port=80 --request-path=/healthz --check-interval=10s --timeout=5s
gcloud compute backend-services create web-backend \
--protocol=HTTP --port-name=http --health-checks=web-hc \
--global --enable-cdn --enable-logging
gcloud compute backend-services add-backend web-backend \
--instance-group=web-mig --instance-group-region=us-central1 \
--balancing-mode=UTILIZATION --max-utilization=0.8 --global
gcloud compute url-maps create web-url-map --default-service=web-backend
gcloud compute ssl-certificates create web-cert \
--domains=app.example.com --global
gcloud compute target-https-proxies create web-proxy \
--url-map=web-url-map --ssl-certificates=web-cert
gcloud compute forwarding-rules create web-https \
--address=web-lb-ip --target-https-proxy=web-proxy --ports=443 --global
内部ロードバランサー
gcloud compute backend-services create internal-backend \
--protocol=TCP --region=us-central1 \
--health-checks=web-hc --health-checks-region=us-central1 \
--load-balancing-scheme=INTERNAL
gcloud compute forwarding-rules create internal-lb \
--region=us-central1 --load-balancing-scheme=INTERNAL \
--network=prod-vpc --subnet=us-subnet \
--backend-service=internal-backend --ports=8080
Cloud Armor(DDoS と WAF)
gcloud compute security-policies create web-armor
gcloud compute security-policies rules create 1000 \
--security-policy=web-armor \
--expression="origin.region_code == 'XX'" --action=deny-403
gcloud compute security-policies rules create 2000 \
--security-policy=web-armor --expression="true" \
--action=rate-based-ban \
--rate-limit-threshold-count=100 \
--rate-limit-threshold-interval-sec=60 --ban-duration-sec=600
gcloud compute backend-services update web-backend \
--security-policy=web-armor --global
Private Service Connect
gcloud compute addresses create psc-google-apis \
--global --purpose=PRIVATE_SERVICE_CONNECT \
--addresses=10.255.255.254 --network=prod-vpc
gcloud compute forwarding-rules create psc-google-apis \
--global --network=prod-vpc --address=psc-google-apis \
--target-google-apis-bundle=all-apis
Shared VPC
gcloud compute shared-vpc enable $HOST_PROJECT_ID
gcloud compute shared-vpc associated-projects add $SERVICE_PROJECT_ID \
--host-project=$HOST_PROJECT_ID
Terraform の設定
resource "google_compute_network" "vpc" {
name = "prod-vpc"
auto_create_subnetworks = false
routing_mode = "REGIONAL"
}
resource "google_compute_subnetwork" "us" {
name = "us-subnet"
ip_cidr_range = "10.0.0.0/20"
region = "us-central1"
network = google_compute_network.vpc.id
private_ip_google_access = true
log_config { aggregation_interval = "INTERVAL_5_SEC"; flow_sampling = 0.5 }
}
resource "google_compute_firewall" "allow_http" {
name = "allow-http-https"
network = google_compute_network.vpc.name
allow { protocol = "tcp"; ports = ["80", "443"] }
source_ranges = ["0.0.0.0/0"]
target_tags = ["http-server"]
}
resource "google_compute_firewall" "allow_iap" {
name = "allow-iap-ssh"
network = google_compute_network.vpc.name
allow { protocol = "tcp"; ports = ["22"] }
source_ranges = ["35.235.240.0/20"]
}
resource "google_compute_router" "router" {
name = "prod-router"
region = "us-central1"
network = google_compute_network.vpc.id
}
resource "google_compute_router_nat" "nat" {
name = "prod-nat"
router = google_compute_router.router.name
region = "us-central1"
nat_ip_allocate_option = "AUTO_ONLY"
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
min_ports_per_vm = 256
log_config { enable = true; filter = "ERRORS_ONLY" }
}
resource "google_compute_security_policy" "waf" {
name = "web-armor"
rule {
action = "deny(403)"
priority = 1000
match { expr { expression = "evaluatePreconfiguredExpr('xss-v33-stable')" } }
}
rule {
action = "allow"
priority = 2147483647
match { versioned_expr = "SRC_IPS_V1"; config { src_ip_ranges = ["*"] } }
}
}
一般的な操作
gcloud compute networks list
gcloud compute networks subnets list --network=prod-vpc
gcloud compute networks subnets describe us-subnet --region=us-central1
gcloud network-management connectivity-tests create test-web-to-db \
--source-instance=projects/${PROJECT_ID}/zones/us-central1-a/instances/web \
--destination-instance=projects/${PROJECT_ID}/zones/us-central1-a/instances/db \
--destination-port=5432 --protocol=TCP
トラブルシューティング
| 症状 | 原因 | 対処方法 |
|---|---|---|
| インスタンスがインターネットに接続できない | 外部 IP がなく、Cloud NAT も設定されていない | サブネットのルーターに Cloud NAT を設定します |
| ファイアウォールルールが適用されない | ターゲットタグまたは優先度が誤っている | タグがインスタンスと一致することを確認し、優先度の順序を確認します |
| ロードバランサーが 502 を返す | バックエンドのヘルスチェックが失敗している | ヘルスチェックのパス/ポートを確認し、130.211.0.0/22、35.191.0.0/16 を許可します |
| プライベート VM から Google API に接続できない | Private Google Access が無効になっている | サブネットで --enable-private-ip-google-access を有効にします |
| Cloud NAT のポートが枯渇している | VM あたりの接続数が多すぎる | --min-ports-per-vm を増やし、動的ポート割り当てを有効にします |
| Shared VPC プロジェクトで VM を作成できない | compute.networkUser ロールがない | ホストプロジェクトで roles/compute.networkUser を付与します |
| SSL 証明書が PROVISIONING のまま進まない | DNS が LB の IP を参照していない | A レコードを予約済みの静的 IP に更新し、最大 60 分待ちます |
関連スキル
- gcp-compute - VPC ネットワークとファイアウォールルールを使用する Compute Engine インスタンス
- gcp-gke - セカンダリ範囲を持つ VPC サブネットにデプロイされた GKE クラスター
- gcp-cloud-sql - VPC ピアリングを介したプライベート IP データベース接続
- terraform-gcp - Infrastructure as Code でネットワークリソースをプロビジョニングします
コメント
Markdown 対応