Part 1 — SQL の基礎と BigQuery
データに「質問」を投げる言語=SQL を理解し、Google のサーバーレス分析基盤 BigQuery で実際にクエリを走らせるところから始めます。
1-1 SQL とはなにか
SQL(Structured Query Language)は、構造化されたデータに「質問」を投げかけるための標準言語です。スプレッドシートに似たテーブル(表)形式のデータを操作します。
| 用語 | 意味 | 例 |
|---|---|---|
| データベース | 1 つ以上のテーブルの集合体 | london_bicycles |
| テーブル | 行と列で構成されたデータ本体 | cycle_hire |
| カラム(列) | データの属性・種類 | start_station_name |
| レコード(行) | 1 件分のデータ | ある 1 回のサイクリング記録 |
プロジェクト ▶ データセット ▶ テーブル の 3 階層で構成されます。テーブルを指す時は project.dataset.table の形式で書きます。
1-2 基本キーワード早見表
| キーワード | 役割 | 読み方のコツ |
|---|---|---|
SELECT | 取得する列を指定する | 「〜を選ぶ」 |
FROM | 参照するテーブルを指定する | 「〜から」 |
WHERE | 絞り込み条件を指定する | 「〜の場合のみ」 |
GROUP BY | 同じ値を持つ行をまとめる | 「〜でグループ分け」 |
COUNT() | 行数を数える | 「〜を数える」 |
AS | 列やテーブルに別名をつける | 「〜として」 |
ORDER BY | 結果を並び替える | 「〜の順に並べる」 |
1-3 クエリの組み立てフロー
1-4 SELECT・FROM・WHERE の使い方
-- 単一列の取得SELECT end_station_nameFROM `bigquery-public-data.london_bicycles.cycle_hire`;-- 複数列の取得(カンマ区切り)SELECT start_station_name, durationFROM `bigquery-public-data.london_bicycles.cycle_hire`;-- 全列の取得(* はすべての列)SELECT *FROM `bigquery-public-data.london_bicycles.cycle_hire`WHERE duration >= 1200; -- 1200秒 = 20分以上
本番環境では SELECT * を避け、必要な列だけを指定しましょう。BigQuery はスキャンした列単位で課金されるため、不要な列の取得はそのままコスト増につながります。
1-5 GROUP BY・COUNT・AS・ORDER BY
-- 各出発地点からの出発回数を多い順に表示SELECTstart_station_name,COUNT(*) AS num_starts -- AS で列名に別名をつけるFROM `bigquery-public-data.london_bicycles.cycle_hire`GROUP BY start_station_name -- 出発地点でグループ化ORDER BY num_starts DESC; -- 多い順(DESC = 降順)
集計関数一覧
| 関数 | 意味 | 例 |
|---|---|---|
COUNT(*) | 全行数を数える | 乗車回数 |
COUNT(col) | NULL 以外の行数を数える | 値が入っている行 |
SUM(col) | 合計値 | 走行距離の合計 |
AVG(col) | 平均値 | 平均走行時間 |
MAX(col) | 最大値 | 最長走行時間 |
MIN(col) | 最小値 | 最短走行時間 |
1-6 BigQuery ハンズオン手順
BigQuery を使う際の注意点(コスト管理)
| 注意項目 | 理由 | 対策 |
|---|---|---|
SELECT * の多用 | 全列スキャンで課金が増大 | 必要な列だけを指定 |
| 大テーブルの WHERE なし実行 | 全行スキャンが発生 | 必ずフィルタを使う |
| 重複クエリの実行 | 無駄なコストが発生 | BigQuery のキャッシュを活用 |
Part 2 — Cloud SQL へのデータ移行
分析向けの BigQuery(OLAP)と、リアルタイムの読み書きが得意な Cloud SQL(OLTP)。両者の違いを理解し、CSV を介してデータを移行します。
2-1 BigQuery vs Cloud SQL 比較
| 比較項目 | BigQuery | Cloud SQL |
|---|---|---|
| 用途 | 分析・集計(OLAP) | トランザクション処理(OLTP) |
| スケール | ペタバイト級 | テラバイト級 |
| 料金体系 | クエリ量・ストレージ従量 | インスタンス時間従量 |
| 接続方法 | コンソール・API | MySQL/PostgreSQL クライアント |
| 得意なこと | 大量データの高速集計 | リアルタイムの読み書き |
2-2 BigQuery → Cloud SQL 移行フロー
2-3 Cloud SQL インスタンス作成設定値
| 設定項目 | 推奨値(学習用) | 備考 |
|---|---|---|
| Edition | Enterprise | 本番は Enterprise Plus も選択可 |
| Edition Preset | Development | 本番は Production を選択 |
| Database Version | MySQL 8.0 | 特段の理由がなければ最新安定版 |
| Machine Type | 4 vCPU / 16 GB RAM | ラボ環境では Development preset |
| Availability | Multiple zones | 本番環境では必須 |
2-4 Cloud Shell で Cloud SQL を操作する
# Cloud SQL インスタンスに接続gcloud sql connect my-demo --user=root --quiet# --- MySQL プロンプト内での操作 ---# データベース作成CREATE DATABASE bike;# データベースを選択してテーブルを作成USE bike;CREATE TABLE london1 (start_station_name VARCHAR(255),num INT);CREATE TABLE london2 (end_station_name VARCHAR(255),num INT);# データ確認SELECT * FROM london1 LIMIT 10;# 不要行の削除(ヘッダー行など num=0 の行を削除)DELETE FROM london1 WHERE num = 0;# データの挿入INSERT INTO london1 (start_station_name, num)VALUES ("test destination", 1);# UNION で2テーブルを結合して検索SELECT start_station_name AS top_stations, numFROM london1 WHERE num > 100000UNIONSELECT end_station_name, numFROM london2 WHERE num > 100000ORDER BY top_stations DESC;
SQL データ操作キーワード早見表
| キーワード | 操作 | 例 |
|---|---|---|
CREATE DATABASE | データベース作成 | CREATE DATABASE bike; |
CREATE TABLE | テーブル作成 | CREATE TABLE t1 (col VARCHAR(255)); |
INSERT INTO | 行の挿入 | INSERT INTO t1 VALUES ('val'); |
DELETE FROM | 行の削除 | DELETE FROM t1 WHERE id=1; |
UNION | 2 クエリの結果を結合 | SELECT ... UNION SELECT ... |
DELETE は WHERE 条件なしで実行すると全行削除になります。必ず WHERE 句を付けるか、事前に SELECT で対象を確認してから実行しましょう。
Part 3 — VPC ネットワークの設計と構築
VPC は Google Cloud 内の論理的に独立したグローバルネットワーク。サブネット・ファイアウォール・VM を gcloud で組み立て、ネットワーク分離の原則を体験します。
3-1 VPC の基本概念
VPC(Virtual Private Cloud)は Google Cloud 内の論理的な独立ネットワークです。複数のリージョンにまたがるグローバルリソースとして扱われます。
| コンポーネント | 役割 | 例 |
|---|---|---|
| VPC ネットワーク | 仮想ネットワーク全体 | mynetwork |
| サブネット | リージョンごとの IP アドレス範囲 | 10.128.0.0/20 |
| ファイアウォールルール | 通信の許可・拒否ルール | SSH 許可 |
| VM インスタンス | サブネット内に配置される仮想マシン | mynet-vm-1 |
3-2 Auto モード vs Custom モード
| 比較項目 | Auto モード | Custom モード |
|---|---|---|
| サブネット作成 | 全リージョンに自動作成 | 手動で作成 |
| IP アドレス範囲 | Google が自動割り当て | 自分で指定 |
| 柔軟性 | 低い | 高い |
| 推奨用途 | 学習・プロトタイプ | 本番環境 |
| 例 | default, mynetwork | managementnet, privatenet |
本番環境では必ず Custom モードを使用してください。Auto モードは IP アドレス空間を自分で管理できないため、VPC Peering 時などに CIDR の競合が発生します。
3-3 ネットワーク構成の全体像
3-4 gcloud でネットワークを構築する
# 1. Custom VPC ネットワークの作成gcloud compute networks create privatenet \--subnet-mode=custom# 2. サブネットの作成gcloud compute networks subnets create privatesubnet-1 \--network=privatenet \--region=us-central1 \--range=172.16.0.0/24gcloud compute networks subnets create privatesubnet-2 \--network=privatenet \--region=europe-west1 \--range=172.20.0.0/20# 3. ファイアウォールルールの作成gcloud compute firewall-rules create privatenet-allow-icmp-ssh-rdp \--direction=INGRESS \--priority=1000 \--network=privatenet \--action=ALLOW \--rules=icmp,tcp:22,tcp:3389 \--source-ranges=0.0.0.0/0# 4. VM インスタンスの作成gcloud compute instances create privatenet-vm-1 \--zone=us-central1-a \--machine-type=e2-micro \--subnet=privatesubnet-1# 5. 現在の状態を確認gcloud compute networks listgcloud compute networks subnets list --sort-by=NETWORKgcloud compute firewall-rules list --sort-by=NETWORKgcloud compute instances list --sort-by=ZONE
3-5 VPC 間の通信ルール
VPC ネットワークはデフォルトで完全に分離されています。同じリージョン・同じゾーンにあっても、異なる VPC の VM は内部 IP では通信できません。内部通信を許可するには VPC Peering または Cloud VPN が必要です。
3-6 マルチ NIC VM(複数ネットワーク接続)
1 台の VM を複数の VPC に同時接続できます(最大 8 NIC)。
| 注意事項 | 詳細 |
|---|---|
| サブネット IP 重複禁止 | 各ネットワークの CIDR が重複してはいけない |
| デフォルトルートは eth0 | eth0 以外のネットワーク宛てトラフィックは eth0 経由になる場合がある |
| Machine Type の制限 | NIC 数は vCPU 数に依存(e2-standard-4 は最大 4 NIC) |
# VM 内で実行 — ルーティングテーブルの確認ip route# 出力例:# default via 172.16.0.1 dev eth0# 10.128.0.0/20 via 10.128.0.1 dev eth2# 10.130.0.0/20 via 10.130.0.1 dev eth1# 172.16.0.0/24 via 172.16.0.1 dev eth0
Part 4 — Cloud Monitoring による監視体制
VM に Ops Agent を入れ、メトリクス・ログ・アップタイムチェック・アラートを束ねる監視基盤を立ち上げます。「壊れる前に気づく」仕組みづくりです。
4-1 Cloud Monitoring の全体像
4-2 監視エージェントのインストール
# Step 1: Ops Agent インストールスクリプトのダウンロードcurl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh# Step 2: Ops Agent のインストール(Monitoring + Logging 両方)sudo bash add-google-cloud-ops-agent-repo.sh --also-install# Step 3: 動作確認sudo systemctl status "google-cloud-ops-agent*"
すべての VM に Ops Agent をインストールしましょう。Agent なしでは CPU・メモリ等の詳細メトリクスが取得できず、障害時の調査が困難になります。
4-3 Apache2 Web サーバーのセットアップ
# パッケージリストの更新sudo apt-get update# Apache2 と PHP のインストールsudo apt-get install apache2 php7.0 -y# Apache2 の再起動sudo service apache2 restart
4-4 アップタイムチェックの設定
| 設定項目 | 推奨値 | 説明 |
|---|---|---|
| Protocol | HTTP | Web サーバーの死活監視 |
| Resource Type | URL | 外部 IP で監視 |
| Check Frequency | 1 分 | 頻繁に確認する |
| Title | Lamp Uptime Check | わかりやすい名前をつける |
4-5 アラートポリシーの設定フロー
| 項目 | ベストプラクティス |
|---|---|
| 閾値 | 誤検知が多い場合は高めに設定。初期は低めで様子を見る |
| 通知先 | 個人メールより Slack / PagerDuty などのチームチャンネル推奨 |
| ドキュメント | アラート発生時の対応手順(Runbook)を必ず記載する |
| Retest Window | 瞬間的なスパイクでの誤検知を防ぐため 1〜5 分を推奨 |
4-6 Cloud Logging でログを確認する
resource.type = "gce_instance"resource.labels.instance_id = "INSTANCE_ID" # gce_instance では数値のインスタンス ID(VM 名ではない)
| ログ種別 | 確認できること |
|---|---|
syslog | OS レベルのシステムイベント |
apache_access | Web サーバーへのアクセス履歴 |
apache_error | Web サーバーのエラー |
stackdriver_agent | Monitoring Agent 自体のログ |
Part 5 — Kubernetes デプロイメント戦略
Pod・ReplicaSet・Deployment・Service の関係を押さえ、Rolling / Canary / Blue-Green / Recreate の 4 戦略を「いつ・なぜ使うか」で選べるようになります。
5-1 Kubernetes の基本構成
5-2 Deployment の基本 YAML 構造
apiVersion: apps/v1kind: Deploymentmetadata:name: fortune-app-blue # Deployment の名前spec:replicas: 3 # Pod の数selector:matchLabels:app: fortune-app # 管理対象 Pod のラベルtemplate:metadata:labels:app: fortune-appversion: "1.0.0"spec:containers:- name: fortune-appimage: "us-central1-docker.pkg.dev/.../fortune-service:1.0.0"ports:- containerPort: 8080
5-3 基本的な kubectl コマンド
# Deployment の作成と確認kubectl create -f deployments/fortune-app-blue.yamlkubectl get deploymentskubectl get replicasetskubectl get pods# Service の作成kubectl create -f services/fortune-app.yamlkubectl get services fortune-app# スケールアップ・スケールダウンkubectl scale deployment fortune-app-blue --replicas=5kubectl scale deployment fortune-app-blue --replicas=3# バージョン確認curl http://$(kubectl get svc fortune-app \-o=jsonpath="{.status.loadBalancer.ingress[0].ip}")/version
5-4 デプロイメント戦略の比較
| 戦略 | 概要 | ダウンタイム | リスク | 適用場面 |
|---|---|---|---|---|
| Rolling Update | 旧 Pod を少しずつ新 Pod に入れ替え | なし | 中 | 通常のアップデート |
| Canary | 一部ユーザーにのみ新バージョンを提供 | なし | 低 | 新機能の段階的リリース |
| Blue-Green | 旧・新環境を並行稼働し一気に切り替え | なし | 低(即時 Rollback 可) | 大規模変更・安全重視 |
| Recreate | 全 Pod を削除してから新 Pod を作成 | あり | 高 | ステートフルアプリ |
5-5 Rolling Update
# イメージを v2.0.0 に更新(Deployment を直接編集)kubectl edit deployment fortune-app-blue# エディタ内で image タグを 1.0.0 → 2.0.0 に変更して保存kubectl rollout status deployment/fortune-app-blue # 状態確認kubectl rollout pause deployment/fortune-app-blue # 一時停止kubectl rollout resume deployment/fortune-app-blue # 再開kubectl rollout history deployment/fortune-app-blue # 履歴確認kubectl rollout undo deployment/fortune-app-blue # ロールバック
5-6 Canary デプロイメント
# Canary Deployment の作成kubectl create -f deployments/fortune-app-canary.yaml# 現在のバージョン分布を確認(10回リクエスト)for i in {1..10}; docurl -s http://$(kubectl get svc fortune-app \-o=jsonpath="{.status.loadBalancer.ingress[0].ip}")/versionechodone
Canary は Pod 数の比率でトラフィックが分散されます。Production: 3 Pod, Canary: 1 Pod → Canary に約 25% のトラフィックが流れます。
5-7 Blue-Green デプロイメント
# Step 1: Blue(v1.0.0)のみにトラフィックを向けるkubectl apply -f services/fortune-app-blue-service.yaml# Step 2: Green(v2.0.0)Deployment を作成(まだトラフィックなし)kubectl create -f deployments/fortune-app-green.yaml# Step 3: v1.0.0 で提供されていることを確認curl http://$(kubectl get svc fortune-app \-o=jsonpath="{.status.loadBalancer.ingress[0].ip}")/version# Step 4: Service を Green に切り替え(瞬時に全トラフィックが v2.0.0 へ)kubectl apply -f services/fortune-app-green-service.yaml# ロールバック: Blue に戻すkubectl apply -f services/fortune-app-blue-service.yaml
5-8 デプロイメント戦略の選び方
Part 6 — 総合チャレンジラボ攻略
ここまでの hop を組み合わせる総合演習。2 つの VPC・踏み台ホスト・Cloud SQL・GKE 上の WordPress を、タスク順にひとつのシステムとして構築します。
6-1 チャレンジ全体のアーキテクチャ
6-2 タスク別実装手順
Task 1 & 2 — VPC の作成
# 開発 VPC の作成gcloud compute networks create griffin-dev-vpc --subnet-mode=customgcloud compute networks subnets create griffin-dev-wp \--network=griffin-dev-vpc --region=us-east1 --range=192.168.16.0/20gcloud compute networks subnets create griffin-dev-mgmt \--network=griffin-dev-vpc --region=us-east1 --range=192.168.32.0/20# 本番 VPC の作成gcloud compute networks create griffin-prod-vpc --subnet-mode=customgcloud compute networks subnets create griffin-prod-wp \--network=griffin-prod-vpc --region=us-east1 --range=192.168.48.0/20gcloud compute networks subnets create griffin-prod-mgmt \--network=griffin-prod-vpc --region=us-east1 --range=192.168.64.0/20
Task 3 — Bastion Host(踏み台サーバー)
# マルチ NIC Bastion Host を作成(dev / prod 両 VPC に接続)gcloud compute instances create griffin-bastion \--zone=us-east1-b --machine-type=e2-medium \--network-interface=network=griffin-dev-vpc,subnet=griffin-dev-mgmt \--network-interface=network=griffin-prod-vpc,subnet=griffin-prod-mgmt# SSH 許可の FW ルールを作成gcloud compute firewall-rules create griffin-dev-allow-ssh \--network=griffin-dev-vpc --allow=tcp:22 --source-ranges=0.0.0.0/0gcloud compute firewall-rules create griffin-prod-allow-ssh \--network=griffin-prod-vpc --allow=tcp:22 --source-ranges=0.0.0.0/0
Task 4 — Cloud SQL と WordPress DB
# Cloud SQL MySQL インスタンスを作成gcloud sql instances create griffin-dev-db \--database-version=MYSQL_8_0 --region=us-east1 --tier=db-n1-standard-1# Cloud SQL に接続して WordPress 用 DB を準備gcloud sql connect griffin-dev-db --user=root
-- MySQL プロンプト内で実行CREATE DATABASE wordpress;CREATE USER "wp_user"@"%" IDENTIFIED BY "stormwind_rules";GRANT ALL PRIVILEGES ON wordpress.* TO "wp_user"@"%";FLUSH PRIVILEGES;
Task 5 & 6 — GKE クラスターの作成と設定
# GKE クラスターの作成gcloud container clusters create griffin-dev \--zone=us-east1-b --machine-type=e2-standard-4 --num-nodes=2 \--network=griffin-dev-vpc --subnetwork=griffin-dev-wp# WordPress 用シークレットとボリュームの設定gsutil cp -r gs://spls/gsp321/wp-k8s .cd wp-k8s# wp-env.yaml を編集して username: wp_user / password: stormwind_rules を設定kubectl create -f wp-env.yaml# Cloud SQL Proxy 用のサービスアカウントキーを作成gcloud iam service-accounts keys create key.json \--iam-account=cloud-sql-proxy@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.comkubectl create secret generic cloudsql-instance-credentials --from-file key.json
Task 7 — WordPress Deployment の作成
# wp-deployment.yaml を編集# YOUR_SQL_INSTANCE → Instance Connection Name に置換# 形式: PROJECT_ID:REGION:INSTANCE_NAMEkubectl create -f wp-deployment.yamlkubectl create -f wp-service.yaml# LoadBalancer の External IP が付与されるまで待機kubectl get services --watch
Task 9 — 追加エンジニアへのアクセス付与
# Editor ロールをプロジェクトに付与gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \--member="user:SECOND_USER_EMAIL" \--role="roles/editor"
ベストプラクティス総まとめ
4 つの観点でこのルート全体を振り返ります。コスト・セキュリティ・可用性・開発効率。
$ コスト管理
| カテゴリ | ベストプラクティス |
|---|---|
| BigQuery | SELECT * を避け、必要な列のみ取得する |
| BigQuery | 大規模クエリ実行前に「クエリバリデータ」でスキャン量を確認する |
| Cloud SQL | 開発・テスト環境は Development Preset を使用する |
| GKE | 不要なクラスターはこまめに削除する |
| VM | 使用しない VM は停止(課金は継続)または削除する |
$ セキュリティ
| カテゴリ | ベストプラクティス |
|---|---|
| VPC | 本番環境は必ず Custom モードを使用する |
| VPC | 0.0.0.0/0 からの SSH 許可は最小限に留め、IAP を活用する |
| Cloud SQL | パスワードは必ず Secret Manager で管理する |
| IAM | 最小権限の原則(Principle of Least Privilege)を徹底する |
| GKE | サービスアカウントキーはファイルではなく Workload Identity を使用する |
$ 可用性・信頼性
| カテゴリ | ベストプラクティス |
|---|---|
| Cloud SQL | 本番環境は Multiple Zones(HA 構成) を必ず選択する |
| GKE | Rolling Update で maxUnavailable・maxSurge を適切に設定する |
| Monitoring | すべての VM に Ops Agent をインストールする |
| Monitoring | アラートには Runbook(対応手順書)のリンクを必ず記載する |
| デプロイ | Blue-Green デプロイで即時 Rollback 体制を整える |
$ 開発効率
| カテゴリ | ベストプラクティス |
|---|---|
| gcloud | よく使うオプションは gcloud config set でデフォルト化する |
| kubectl | kubectl explain でリソースのフィールドを確認する |
| SQL | DELETE 前は必ず SELECT で対象行を確認する |
| Monitoring | ダッシュボードは CPU・メモリ・ネットワーク・エラー率の 4 点セットで作成する |
✓ 最終確認チェックリスト
参考リソース / 出典 URL
本ガイドの記述はすべて Google Cloud / Kubernetes の公式ドキュメントに基づいています。一次情報として必ず併読してください。
BigQuery & SQL
Kubernetes / GKE