18
☁️ 拡大編 Chapter 18

クラウドへの旅

自前サーバーの限界を超え、スケーラブルなインフラへ

約55分
クラウドコンピューティング · intro AWS/GCP · intro サーバーレス · intro
目次(28セクション)
🎬 Story — Introduction

10月。沖縄は観光シーズン真っ只中だった。


あなた: 「やばい、サイト落ちてる!」

あなたのスマホにも通知が殺到していた。ShimaLinkを利用している飲食店のオンライン予約ページが、軒並みレスポンスを返さなくなっていた。

あなた: 「アクセスログ見ると…今、同時アクセスが通常の10倍になってる。沖縄食品フェアの影響だ。」

あなた: 「うちのサーバー、1台しかないもんな。CPUが100%に張り付いてる。」

必死にプロセスを再起動して、なんとか復旧させた。しかし、アクセスが集中するたびにサーバーが限界を迎える状況は変わらない。


Yuki: 「自前サーバーの限界が来たね。1台のサーバーでは、急激なアクセス増に対応できない。」

あなた: 「サーバーを増やせばいいんですか?」

Yuki: 「物理サーバーを買い足すのは、時間もコストもかかる。しかも、ピークが過ぎたら余剰になる。そこでクラウドの出番だよ。」

あなた: 「クラウドって、AWSとかGCPとか?聞いたことはあるけど、なんか難しそうで…」

Yuki: 「難しくないよ。必要な分だけコンピュータを借りて、使った分だけ払う。それがクラウドの基本。アクセスが増えたら自動で台数を増やし、減ったら減らす。これを”スケーリング”っていうんだ。」


Mika: 「次のフェスティバルシーズンまでに間に合いますか?」

Yuki: 「大丈夫。Dockerコンテナ化は済んでるし、CI/CDパイプラインもある。クラウドへの移行は、思っているよりスムーズにいくはずだよ。」

ShimaLinkの”空”への旅が始まる。

クラウドコンピューティングの基本

「自前サーバーは”家を買う”こと。クラウドは”必要な時だけホテルに泊まる”こと。」 ——Yuki

クラウドとは何か

クラウドコンピューティングとは、インターネット経由でコンピュータリソースを必要な分だけ借りて使うサービスです。

比較項目自前サーバー(オンプレミス)クラウド
初期費用高い(サーバー購入)ほぼゼロ
スケーリング物理的な増設が必要数分で増減可能
運用負荷すべて自分で管理プロバイダーが大部分を担当
支払い固定費従量課金(使った分だけ)
障害対応自分で対応プロバイダーが対応

クラウドの3つのサービスモデル

┌─────────────────────────────────────┐
│        SaaS(Gmail, Slack等)         │ ← すべてお任せ
├─────────────────────────────────────┤
│     PaaS(Heroku, Cloud Run等)      │ ← アプリだけ管理
├─────────────────────────────────────┤
│      IaaS(EC2, Compute Engine等)   │ ← インフラから管理
└─────────────────────────────────────┘
モデル意味自分で管理するもの
IaaSInfrastructure as a ServiceOS、ミドルウェア、アプリAWS EC2、GCP Compute Engine
PaaSPlatform as a ServiceアプリのみHeroku、Google Cloud Run
SaaSSoftware as a Serviceなし(利用するだけ)Gmail、Slack

ShimaLinkではまずPaaSを活用するのが効率的です。

スケーリングの種類

垂直スケーリング(スケールアップ)

サーバーのスペックを上げる(CPUやメモリを増やす)

小さなサーバー → 大きなサーバー
[2CPU/4GB]    → [8CPU/32GB]
  • 限界がある(物理的な上限)
  • ダウンタイムが発生する場合がある

水平スケーリング(スケールアウト)

サーバーの台数を増やす

1台 → 3台 → 5台 → 3台 → 1台
     ↑                    ↑
  負荷増加時           負荷減少時
  • 理論上は無限にスケール可能
  • コンテナ化されていれば実現しやすい

Yuki: 「クラウドの真骨頂は水平スケーリング。ShimaLinkをDockerコンテナ化した理由はここにもあるんだ。同じコンテナを増やすだけでスケールできる。」

従量課金の考え方

クラウドでは使った分だけ支払います。

リソース課金単位
コンピュート秒/時間単位EC2: $0.01/時間〜
ストレージGB/月単位S3: $0.025/GB/月
データ転送GB単位$0.09/GB(送信)
API呼び出しリクエスト数Lambda: $0.20/100万回

ShimaLinkの場合の月額目安:

  • 小規模(〜50クライアント): $50〜100/月
  • 中規模(〜200クライアント): $200〜500/月

ポイント

  • クラウドは「必要な分だけ借りて、使った分だけ払う」モデル
  • IaaS、PaaS、SaaSの3つのサービスモデルがある
  • 水平スケーリングでアクセス増減に柔軟に対応できる
  • 従量課金で無駄なコストを抑えられる
  • コンテナ化されたアプリはクラウド移行が容易

主要クラウドプロバイダーの比較

「どのクラウドが一番かは、何を作るかによる。正解は1つじゃない。」 ——Yuki

3大クラウドプロバイダー

プロバイダー特徴シェア
AWS (Amazon)サービス数が最多、実績豊富最大
GCP (Google)データ分析・ML に強い、シンプルな料金体系3位
Azure (Microsoft)エンタープライズ向け、Windows連携2位

主要サービスの比較

用途AWSGCPAzure
仮想サーバーEC2Compute EngineVirtual Machines
コンテナ実行ECS / FargateCloud RunContainer Apps
サーバーレス関数LambdaCloud FunctionsFunctions
オブジェクトストレージS3Cloud StorageBlob Storage
データベース(SQL)RDSCloud SQLSQL Database
データベース(NoSQL)DynamoDBFirestoreCosmos DB
CDNCloudFrontCloud CDNAzure CDN
DNSRoute 53Cloud DNSAzure DNS

AWS での構成例

ユーザー

[CloudFront] ← CDN(静的ファイル配信)

[ALB] ← ロードバランサー

[ECS Fargate] ← Dockerコンテナ実行(サーバーレス)

[RDS PostgreSQL] ← マネージドDB

[S3] ← 画像・ファイル保存

GCP での構成例

ユーザー

[Cloud CDN] ← CDN

[Cloud Load Balancing]

[Cloud Run] ← Dockerコンテナ実行(サーバーレス)

[Cloud SQL PostgreSQL] ← マネージドDB

[Cloud Storage] ← 画像・ファイル保存

マネージドサービスのメリット

自前で管理する場合:

  • OSのアップデート
  • セキュリティパッチの適用
  • バックアップの設定と実行
  • 障害時の復旧作業
  • スケーリングの設定

マネージドサービスの場合:

  • 上記すべてをクラウドプロバイダーが対応
  • 開発者はアプリケーションの開発に集中できる

例えば、AWS RDS(マネージドDB)では:

  • 自動バックアップ
  • 自動パッチ適用
  • 自動フェイルオーバー(障害時の自動切り替え)
  • ワンクリックでスケーリング

クラウド選定の基準

基準詳細
チームの経験既に使い慣れたプラットフォームがあるか
サービスの充実度必要なサービスが揃っているか
料金予算に合うか(無料枠の有無も重要)
リージョン日本リージョンがあるか(レイテンシに影響)
ドキュメント日本語ドキュメントの充実度

Yuki: 「ShimaLinkは沖縄のサービスだから、日本リージョンがあることは必須。AWSの東京リージョン、GCPの東京リージョンなら、沖縄からのレイテンシも許容範囲だよ。」

ポイント

  • AWS、GCP、Azureが3大クラウドプロバイダー
  • それぞれ同等のサービスを提供しているが、得意分野が異なる
  • マネージドサービスを使えばインフラ運用から解放される
  • 選定はチームの経験、料金、リージョンなどを総合的に判断する
  • まずは無料枠を活用して試してみるのがベスト

クラウドへのデプロイ

「Dockerイメージさえあれば、クラウドへのデプロイはそこまで難しくない。」 ——Yuki

デプロイの全体フロー

ローカル開発

Dockerイメージをビルド

コンテナレジストリにプッシュ

クラウドサービスからイメージをプル

コンテナとして実行

コンテナレジストリ

コンテナレジストリは、Dockerイメージを保存・配布するためのサービスです。

レジストリプロバイダー特徴
Docker HubDocker社最もポピュラー
ECRAWSAWSとの連携が容易
GCR / Artifact RegistryGCPGCPとの連携が容易
GHCRGitHubGitHub Actionsとの連携が容易

Cloud Run へのデプロイ例

Google Cloud Run は、Dockerコンテナをサーバーレスで実行できるサービスです。

1. コンテナレジストリにイメージをプッシュ

# GCPのArtifact Registryにプッシュ
docker tag shimalink-web:latest \
  asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:latest

docker push \
  asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:latest

2. Cloud Run にデプロイ

gcloud run deploy shimalink-web \
  --image asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:latest \
  --platform managed \
  --region asia-northeast1 \
  --port 3000 \
  --allow-unauthenticated \
  --set-env-vars "NODE_ENV=production"

3. CI/CD と連携

# .github/workflows/deploy-cloud-run.yml
deploy:
  needs: test
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4

    - name: GCP認証
      uses: google-github-actions/auth@v2
      with:
        credentials_json: ${{ secrets.GCP_SA_KEY }}

    - name: Docker イメージをビルド&プッシュ
      run: |
        gcloud auth configure-docker asia-northeast1-docker.pkg.dev
        docker build -t asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:${{ github.sha }} .
        docker push asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:${{ github.sha }}

    - name: Cloud Run にデプロイ
      uses: google-github-actions/deploy-cloudrun@v2
      with:
        service: shimalink-web
        image: asia-northeast1-docker.pkg.dev/shimalink-project/shimalink/web:${{ github.sha }}
        region: asia-northeast1

AWS ECS Fargate へのデプロイ例

AWS Fargate は、サーバーの管理なしでコンテナを実行できるサービスです。

# ECRにイメージをプッシュ
aws ecr get-login-password --region ap-northeast-1 | \
  docker login --username AWS --password-stdin 123456789.dkr.ecr.ap-northeast-1.amazonaws.com

docker tag shimalink-web:latest \
  123456789.dkr.ecr.ap-northeast-1.amazonaws.com/shimalink-web:latest

docker push \
  123456789.dkr.ecr.ap-northeast-1.amazonaws.com/shimalink-web:latest

# ECSサービスを更新(新イメージでデプロイ)
aws ecs update-service \
  --cluster shimalink-cluster \
  --service shimalink-web \
  --force-new-deployment

データベースの移行

ローカルのDBからクラウドのマネージドDBへ移行します。

ローカル PostgreSQL → Cloud SQL / RDS PostgreSQL
# データのエクスポート(ローカル)
pg_dump -h localhost -U shimalink_user shimalink > backup.sql

# データのインポート(クラウド)
psql -h <cloud-db-host> -U shimalink_user shimalink < backup.sql

Yuki: 「Dockerコンテナ化とCI/CDが済んでいるから、クラウドへの移行はイメージの保存先と実行先を変えるだけ。準備が整っているとスムーズだね。」

ポイント

  • Dockerイメージをコンテナレジストリにプッシュし、クラウドで実行する
  • Cloud RunやFargateならサーバー管理不要でコンテナを動かせる
  • CI/CDパイプラインにクラウドデプロイのステップを追加する
  • マネージドDBへの移行はpg_dumpとpsqlで行える
  • コンテナ化・CI/CD化が済んでいればクラウド移行は比較的容易

サーバーレスの世界

「サーバーレスって、サーバーがないわけじゃない。サーバーのことを考えなくて済むってことだよ。」 ——Yuki

サーバーレスとは

サーバーレスとは、サーバーの管理を一切気にせず、コード(関数)だけに集中できるクラウドの実行モデルです。

比較項目従来のサーバーサーバーレス
サーバー管理必要不要
スケーリング手動/設定が必要完全自動
課金常時稼働分を支払い実行時間分だけ
アイドル時コスト発生コスト0
起動時間常に起動済みコールドスタートあり

サーバーレス関数の仕組み

イベント発生(HTTPリクエスト、タイマー等)

クラウドが自動的に関数を起動

関数が処理を実行

結果を返す

関数が自動的に終了(課金も終了)

AWS Lambda の例

ShimaLinkの予約確認メール送信をLambda関数として実装します。

// functions/sendConfirmation.js
exports.handler = async (event) => {
  const booking = JSON.parse(event.body);

  // 予約確認メールを送信
  await sendEmail({
    to: booking.email,
    subject: `予約確認: ${booking.shopName}`,
    body: `${booking.date} ${booking.time} のご予約を承りました。`,
  });

  return {
    statusCode: 200,
    body: JSON.stringify({ message: "確認メールを送信しました" }),
  };
};

すべてをサーバーレスにする必要はありません。適材適所で使い分けます。

処理実行方法理由
Webアプリ本体Cloud Run / ECS常にリクエストを受ける
予約確認メールLambda / Cloud Functionsイベント駆動で十分
画像リサイズLambda / Cloud Functionsアップロード時だけ実行
日次レポート生成Lambda / Cloud Functions定期実行(1日1回)
データバックアップLambda / Cloud Functions定期実行

イベント駆動アーキテクチャ

[予約API] → 予約をDBに保存
              ↓ イベント発行
         [メール送信Lambda] → メール送信

         [集計更新Lambda] → ダッシュボード更新

メインのAPIは予約の保存だけに集中し、メール送信や集計更新はサーバーレス関数に任せます。これにより:

  • APIの応答時間が短くなる
  • 各機能が独立して動作する
  • 障害の影響範囲が限定される

コールドスタート問題

サーバーレス関数がしばらく呼ばれないと、次の呼び出し時に起動時間(コールドスタート)が発生します。

言語コールドスタート時間
Python~200ms
Node.js~200ms
Go~100ms
Java~1000ms以上

対策:

  • 軽量な言語(Node.js、Python)を選ぶ
  • 関数のパッケージサイズを小さくする
  • Provisioned Concurrency(事前ウォームアップ)を利用する

Yuki: 「サーバーレスは銀の弾丸じゃない。常時接続が必要なWebSocketや、長時間実行が必要な処理には向かない。ShimaLinkでは、イベント駆動の処理にだけ使うのが賢い選択だよ。」

ポイント

  • サーバーレスは「サーバー管理不要」で「実行時間分だけ課金」されるモデル
  • イベント駆動型の処理(メール送信、画像処理、定期実行)に最適
  • すべてをサーバーレスにする必要はなく、適材適所で使い分ける
  • コールドスタートがあるため、レイテンシに敏感な処理には注意
  • メインアプリとサーバーレス関数を組み合わせるのが現実的な設計
📖 Story — Conclusion

ShimaLinkがクラウドで稼働を始めた。最初の負荷テストの結果が出る。

負荷テスト結果:
- 同時接続: 1,000ユーザー
- 平均応答時間: 120ms
- エラー率: 0.01%
- オートスケーリング: 2台 → 5台 → 2台(自動調整)

あなた: 「1,000人同時アクセスでも120msで返してる!前は100人でパンクしてたのに。」

あなた: 「しかも、負荷が下がったら自動で2台に戻ってる。無駄なコストがかからない。」

Mika: 「年末の観光シーズン、今年は安心ですね。」

Yuki: 「スケーリングだけじゃない。クラウドのマネージドサービスを使えば、DBのバックアップも自動だし、障害時の復旧も早い。インフラの運用負荷がグッと下がるよ。」


あなた: 「ただ、クラウドの設定をコンソールで手動で作ったから、同じ環境をもう一度作れって言われたら自信ないな…」

Yuki: 「いい気づきだね。実は、インフラもコードで管理できるんだ。Infrastructure as Code——Terraformっていうツールを使えば、クラウドの構成をコードとして記述できる。」

あなた: 「コードとして管理…つまり、Gitでバージョン管理もできる?」

Yuki: 「そう。CI/CDパイプラインでインフラの変更も自動化できるようになるよ。」


次のチャプター: Chapter 19: インフラをコードで — クラウドの設定を手動からコード管理へ。Terraformで再現可能なインフラを構築する。

🧠 理解度チェック

Q1.クラウドコンピューティングの従量課金モデルの説明として正しいのは?

💡 サーバー1台を常時稼働させていた時代と比べて、ピーク時だけスケールするクラウドの方がコスト効率が良い。

Q2.IaaS、PaaS、SaaSの中で、開発者がOSやミドルウェアの管理を気にしなくてよいのは?

💡 ShimaLinkではCloud RunやFargate(PaaS)を使って、インフラ管理から解放されたよね。

Q3.水平スケーリング(スケールアウト)の説明として正しいのは?

💡 沖縄食品フェアのアクセス急増時、サーバー1台では対応できなかった。台数を増やすのがスケールアウトだ。

Q4.コンテナレジストリの役割は?

💡 ローカルでビルドしたShimaLinkのイメージを、クラウドで動かすために中間の保管場所が必要だった。

Q5.サーバーレス関数の課金方式として正しいのは?

💡 予約確認メールの送信は頻繁には起きないから、サーバーレスなら無駄なコストがかからない。

Q6.サーバーレスのコールドスタート問題とは?

💡 予約確認メール送信のような非リアルタイムの処理なら、コールドスタートがあっても問題ない。

Q7.マネージドデータベース(RDS、Cloud SQL等)を使うメリットは?

💡 自前サーバーではバックアップを手動で取っていたけど、マネージドDBなら自動で安心だ。

Q8.リージョン(地域)の選択で最も重要な基準は?

💡 沖縄のユーザーがメインのShimaLinkだから、日本リージョンを選んだ理由がここにある。

よくある質問

AWS、GCP、Azureのどれを選べばいい?

正解はありませんが、以下を参考にしてください。 **初心者におすすめ:** - **GCP**: Cloud Runがシンプルで始めやすい - 無料枠が充実($300クレジット) **求人・実績重視:** - **AWS**: 最も利用企業が多い - 情報が豊富で学習リソースが充実 **Microsoft製品を使っている場合:** - **Azure**: Office 365やActive Directoryとの連携が容易 **ShimaLinkの場合:** GCPのCloud Runから始めるのがおすすめ。Dockerイメージがあれば数コマンドでデプロイできます。

クラウドの料金が心配。予想外の高額請求が来ない?

対策を取れば安心です。 **予算アラートを設定する:** - AWS: Billing → Budgets で上限設定 - GCP: Billing → Budgets & alerts **無料枠を活用する:** - AWS: 12ヶ月の無料枠あり - GCP: $300クレジット + 無料枠 **注意すべきポイント:** - リソースを使い終わったら必ず削除する - テスト用のインスタンスを放置しない - データ転送料(特に送信)に注意 **月額$50以下に抑えるには:** - 小さなインスタンスから始める - サーバーレスを活用する(使わなければ$0)

gcloudコマンドのインストール方法がわからない

Google Cloud CLIのインストール手順です。 **macOSの場合:** ```bash # Homebrewでインストール brew install --cask google-cloud-sdk # 初期設定 gcloud init # 確認 gcloud --version ``` **初期設定では:** 1. Googleアカウントでログイン 2. プロジェクトを選択(または作成) 3. デフォルトリージョンを設定 ```bash # ログイン gcloud auth login # プロジェクト設定 gcloud config set project shimalink-project # リージョン設定 gcloud config set run/region asia-northeast1 ```

Cloud Runにデプロイしたが「Service Unavailable」エラーが出る

コンテナが正常に起動していない可能性があります。 **確認手順:** 1. **ログを確認** ```bash gcloud run services logs read shimalink-web \ --region asia-northeast1 ``` 2. **よくある原因:** - ポートが合っていない(Cloud Runは`PORT`環境変数を使う) - 環境変数が未設定 - ヘルスチェックに失敗している 3. **ポートの修正** ```javascript // Cloud Runでは PORT 環境変数を使う const port = process.env.PORT || 3000; app.listen(port); ``` 4. **ローカルで同じイメージをテスト** ```bash docker run -p 3000:3000 -e PORT=3000 shimalink-web ```

IaaS、PaaS、SaaSの違いがピンとこない

ピザに例えると分かりやすいです。 | モデル | ピザの例 | IT の例 | |--------|---------|--------| | **IaaS** | 材料だけ買って自分で焼く | サーバーを借りて自分で全部設定 | | **PaaS** | 宅配ピザ(トッピングだけ選ぶ) | アプリをデプロイするだけ | | **SaaS** | レストランで食べる | 完成品を使うだけ | **ShimaLinkでの例:** - IaaS: EC2でサーバーを借りてDockerを自分でセットアップ - PaaS: Cloud Runにイメージを渡すだけで動く - SaaS: Google Analyticsでアクセス解析(開発不要)

ローカルのデータベースをクラウドに移行する方法は?

PostgreSQLの場合の移行手順です。 **1. ローカルDBのバックアップ** ```bash pg_dump -h localhost -U shimalink_user shimalink > backup.sql ``` **2. クラウドDBの作成** - AWS RDS または GCP Cloud SQLでインスタンスを作成 - 同じPostgreSQLバージョンを選択 **3. データのインポート** ```bash psql -h <クラウドDBのホスト> -U shimalink_user shimalink < backup.sql ``` **4. アプリの接続先を変更** ``` DATABASE_URL=postgres://user:pass@<クラウドDBホスト>:5432/shimalink ``` **注意:** 移行中はメンテナンスモードにしてデータの不整合を防ぎましょう。

サーバーレス関数はどんなときに使うべき?

以下のケースに向いています。 **向いている処理:** - イベント駆動型(メール送信、通知) - 定期実行(日次レポート、バックアップ) - 画像・動画の変換処理 - APIのバックエンド(軽量な処理) **向いていない処理:** - WebSocket(常時接続) - 長時間実行(15分以上) - 大量のメモリを使う処理 - 高頻度でコールドスタートが問題になる処理 **判断基準:** 「この処理は1日に何回呼ばれるか?」を考えてみましょう。数回〜数百回ならサーバーレスが最適です。

CDNとは何?なぜ必要?

**CDN(Content Delivery Network)** は、世界中にキャッシュサーバーを配置して、ユーザーに近い場所からコンテンツを配信する仕組みです。 **CDNなし:** ``` 沖縄のユーザー → 東京のサーバー(遅い) ``` **CDNあり:** ``` 沖縄のユーザー → 沖縄に近いCDNエッジ(速い) ``` **ShimaLinkでの効果:** - 画像やCSS/JSの配信が高速化 - サーバーへの負荷が軽減 - DDoS攻撃からの保護 **主なCDNサービス:** - AWS CloudFront - GCP Cloud CDN - Cloudflare(無料プランあり)

クラウドのセキュリティは大丈夫?

クラウドプロバイダーは世界最高水準のセキュリティを提供しています。ただし、**共有責任モデル**を理解することが重要です。 | 責任範囲 | プロバイダーの責任 | 利用者の責任 | |---------|-----------------|------------| | 物理セキュリティ | データセンターの管理 | - | | ネットワーク | 基盤の暗号化 | ファイアウォール設定 | | OS | パッチ適用(PaaS) | パッチ適用(IaaS) | | アプリ | - | コードのセキュリティ | | データ | 暗号化基盤の提供 | アクセス制御の設定 | **最低限やるべきこと:** - IAMで最小権限の原則を適用 - シークレットを環境変数で管理 - VPCでネットワークを分離 - 通信はHTTPSを使用

AWS CLIのインストールと初期設定方法は?

AWS CLIのセットアップ手順です。 **macOSの場合:** ```bash # Homebrewでインストール brew install awscli # 確認 aws --version ``` **初期設定:** ```bash aws configure # AWS Access Key ID: (IAMで作成したキー) # AWS Secret Access Key: (シークレットキー) # Default region: ap-northeast-1 # Default output format: json ``` **IAMユーザーの作成:** 1. AWSコンソール → IAM → ユーザー 2. 「ユーザーを追加」 3. プログラムによるアクセスを有効化 4. 必要な権限ポリシーをアタッチ 5. アクセスキーを安全に保管 **注意:** ルートアカウントのキーは絶対に使わないでください。