𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
Google Cloud 完全攻略 Ep.4: Cloud Functionsで学ぶサーバーレスアーキテクチャ入門|SESエンジニア向け実践ガイド

Google Cloud 完全攻略 Ep.4: Cloud Functionsで学ぶサーバーレスアーキテクチャ入門|SESエンジニア向け実践ガイド

Google CloudGCPCloud FunctionsサーバーレスPub/Sub
目次
⚡ 3秒でわかる!この記事のポイント
  • Cloud Functionsはコード片をイベント駆動で実行できるGCPのサーバーレスコンピューティングサービス
  • HTTP・Pub/Sub・Cloud Storageトリガーなど多彩なイベントソースに対応し、インフラ管理ゼロで運用可能
  • Pub/Sub連携によるマイクロサービス構築やコスト最適化テクニックまで、SES現場で即活用できる知識を網羅

SES案件でバックエンド開発に携わるエンジニアにとって、サーバーレスアーキテクチャの知識は今や必須スキルになりつつあります。「サーバーを持たない」という発想は、インフラコストの削減だけでなく、開発スピードの飛躍的な向上をもたらします。

Google Cloudにおけるサーバーレスの中核を担うのがCloud Functionsです。AWS LambdaやAzure Functionsに相当するサービスで、関数単位のコードをイベント駆動で実行できます。Ep.2で紹介したCloud Runがコンテナベースのサーバーレスなら、Cloud Functionsは関数(Function)ベースのサーバーレスと位置づけられます。

本記事では、Cloud Functionsの基本概念から、Pub/Subとの連携によるイベント駆動アーキテクチャの構築、そして本番運用を見据えたコスト管理・セキュリティ設計までを解説します。

Cloud Functionsとは?——SES現場での活用シーン

Cloud Functions は、Google Cloudが提供する**FaaS(Function as a Service)**です。開発者がビジネスロジックに集中し、インフラの管理はGoogleに任せるという思想のもと設計されています。

Cloud Functionsの特徴

  • イベント駆動: HTTPリクエスト、Pub/Subメッセージ、Cloud Storageへのファイルアップロードなど、様々なイベントをトリガーに関数を実行
  • 完全マネージド: OS・ランタイムのパッチ適用やスケーリングは全自動
  • 従量課金: 関数の実行回数と実行時間に応じた課金。アイドル時のコストはゼロ
  • 多言語対応: Node.js、Python、Go、Java、.NET、Ruby、PHPをサポート

SES案件での需要

サーバーレス関連のSES案件は年々増加しています。特に以下のようなユースケースで、Cloud Functionsの経験が求められます。

  • Webhook処理: Slack通知、決済システムのコールバック処理
  • データパイプライン: Cloud Storageにアップロードされたファイルの自動加工
  • APIバックエンド: 軽量なREST APIの構築
  • 定期バッチ処理: Cloud Schedulerと連携した定時実行タスク
  • マイクロサービス間連携: Pub/Subを介した疎結合な非同期処理

クラウドエンジニアのSES案件ガイドでも紹介しているように、サーバーレス設計の経験は案件単価の向上に直結します。

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

Cloud Functionsの始め方

第1世代 vs 第2世代

Cloud Functionsには第1世代第2世代があります。2026年現在、新規開発には**第2世代(Cloud Functions 2nd gen)**が推奨されています。

項目第1世代第2世代
基盤独自インフラCloud Run上に構築
最大タイムアウト9分60分
最大メモリ8GB32GB
同時実行1リクエスト/インスタンス最大1,000リクエスト/インスタンス
トラフィック分割非対応対応
イベントソース限定的Eventarc経由で90以上のソース

第2世代は内部的にCloud Runを使用しているため、Ep.2で学んだCloud Runの知識がそのまま活かせます。

最初のHTTP関数をデプロイする

まずは最もシンプルなHTTPトリガーの関数を作成しましょう。Node.jsの例です。

// index.js
const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  const name = req.query.name || req.body.name || 'World';
  res.json({
    message: `Hello, ${name}!`,
    timestamp: new Date().toISOString(),
    region: process.env.FUNCTION_REGION || 'unknown'
  });
});
// package.json
{
  "name": "hello-world-function",
  "version": "1.0.0",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  }
}

デプロイはgcloudコマンド1つで完了します。

# 第2世代としてデプロイ(東京リージョン)
gcloud functions deploy hello-world \
    --gen2 \
    --runtime=nodejs20 \
    --region=asia-northeast1 \
    --source=. \
    --entry-point=helloWorld \
    --trigger-http \
    --allow-unauthenticated

デプロイが完了すると、HTTPSのエンドポイントURLが発行されます。

# 動作確認
curl "https://asia-northeast1-my-project.cloudfunctions.net/hello-world?name=SES"
# → {"message":"Hello, SES!","timestamp":"2026-03-03T...","region":"asia-northeast1"}

Pub/Sub連携——イベント駆動アーキテクチャの構築

Cloud Functionsの真価が発揮されるのは、Pub/Subと組み合わせたイベント駆動アーキテクチャです。Pub/Sub(Publish/Subscribe)は、Google Cloudのフルマネージドメッセージングサービスで、サービス間の非同期通信を実現します。

Pub/Subの基本概念

  • トピック(Topic): メッセージの送信先(チャネル)
  • サブスクリプション(Subscription): トピックからメッセージを受信する設定
  • パブリッシャー: メッセージを送信する側
  • サブスクライバー: メッセージを受信・処理する側

Pub/Subトリガーの関数を作成

注文処理システムを例に、Pub/Subトリガーの関数を作成してみましょう。

// processOrder.js
const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('processOrder', (cloudEvent) => {
  // Pub/Subメッセージをデコード
  const message = cloudEvent.data.message;
  const orderData = JSON.parse(
    Buffer.from(message.data, 'base64').toString()
  );

  console.log(`注文処理開始: ${orderData.orderId}`);
  console.log(`商品: ${orderData.productName}`);
  console.log(`数量: ${orderData.quantity}`);
  console.log(`顧客ID: ${orderData.customerId}`);

  // ここに実際のビジネスロジック(在庫確認、決済処理など)を実装
  // 処理結果を別のトピックにパブリッシュすることで、
  // 後続の処理(メール通知、配送手配など)をトリガーできる
});
# Pub/Subトピックの作成
gcloud pubsub topics create order-events

# Pub/Subトリガーの関数をデプロイ
gcloud functions deploy process-order \
    --gen2 \
    --runtime=nodejs20 \
    --region=asia-northeast1 \
    --source=. \
    --entry-point=processOrder \
    --trigger-topic=order-events

メッセージをパブリッシュしてテスト

# テストメッセージの送信
gcloud pubsub topics publish order-events \
    --message='{"orderId":"ORD-2026-001","productName":"Cloud入門書","quantity":2,"customerId":"C-100"}'

# ログで処理結果を確認
gcloud functions logs read process-order --gen2 --region=asia-northeast1 --limit=5

実践的なイベント駆動パターン

本番環境では、複数のCloud Functionsをパイプライン的に連携させるのが一般的です。

[注文API] → Pub/Sub(order-events)

        [在庫確認Function] → Pub/Sub(stock-confirmed)

                            [決済処理Function] → Pub/Sub(payment-completed)

                                                [通知送信Function]

各関数が独立しているため、一部だけスケールアウトしたり、障害時に特定の関数だけ修正・再デプロイできます。この疎結合な設計がサーバーレスアーキテクチャの大きなメリットです。

Cloud Storageトリガー——ファイル処理の自動化

Cloud Storageにファイルがアップロードされたタイミングで自動的に関数を実行するパターンも、SES案件でよく見られます。

// imageProcessor.js
const functions = require('@google-cloud/functions-framework');
const sharp = require('sharp');
const { Storage } = require('@google-cloud/storage');

const storage = new Storage();

functions.cloudEvent('processImage', async (cloudEvent) => {
  const file = cloudEvent.data;
  const bucketName = file.bucket;
  const fileName = file.name;

  // 画像ファイルのみ処理
  if (!fileName.match(/\.(jpg|jpeg|png|webp)$/i)) {
    console.log(`スキップ: ${fileName} は画像ファイルではありません`);
    return;
  }

  console.log(`画像処理開始: gs://${bucketName}/${fileName}`);

  // 元画像をダウンロード
  const bucket = storage.bucket(bucketName);
  const [buffer] = await bucket.file(fileName).download();

  // サムネイルを生成
  const thumbnail = await sharp(buffer)
    .resize(300, 300, { fit: 'cover' })
    .webp({ quality: 80 })
    .toBuffer();

  // サムネイルをアップロード
  const thumbPath = `thumbnails/${fileName.replace(/\.[^.]+$/, '.webp')}`;
  await bucket.file(thumbPath).save(thumbnail, {
    metadata: { contentType: 'image/webp' }
  });

  console.log(`サムネイル生成完了: gs://${bucketName}/${thumbPath}`);
});
# Cloud Storageトリガーでデプロイ
gcloud functions deploy process-image \
    --gen2 \
    --runtime=nodejs20 \
    --region=asia-northeast1 \
    --source=. \
    --entry-point=processImage \
    --trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
    --trigger-event-filters="bucket=my-upload-bucket"

コスト管理と最適化

Cloud Functionsの料金は、呼び出し回数コンピューティング時間(GB秒・GHz秒)ネットワーク転送量で構成されます。無料枠も用意されています。

無料枠(毎月)

項目無料枠
呼び出し回数200万回
コンピューティング40万GB秒 / 20万GHz秒
ネットワーク(送信)5GB

コスト最適化のポイント

  1. 最小構成でデプロイ: メモリとCPUは必要最小限に設定する
gcloud functions deploy my-function \
    --gen2 \
    --memory=256MB \
    --cpu=0.167 \
    --timeout=60s \
    --max-instances=10 \
    --min-instances=0
  1. コールドスタートの管理: --min-instances=1で最小インスタンスを確保すると応答速度が向上するが、常時課金が発生する。トレードオフを理解して設定する

  2. 同時実行数の活用(第2世代): 1インスタンスで複数リクエストを処理できるため、インスタンス数を抑えてコスト削減

gcloud functions deploy my-function \
    --gen2 \
    --concurrency=80
  1. Cloud Schedulerとの連携で不要な実行を排除: cron式で正確なタイミングのみ実行

Ep.1のGCP基礎で設定した予算アラートと組み合わせて、コストを常にモニタリングしましょう。

セキュリティ設計のベストプラクティス

IAMによる認証・認可

本番環境では、--allow-unauthenticatedは使わず、IAMで適切にアクセスを制御します。

# 認証必須でデプロイ
gcloud functions deploy my-secure-function \
    --gen2 \
    --no-allow-unauthenticated

# 特定のサービスアカウントにのみ実行権限を付与
gcloud functions add-invoker-policy-binding my-secure-function \
    --gen2 \
    --region=asia-northeast1 \
    --member="serviceAccount:[email protected]"

Secret Managerとの連携

APIキーやデータベースパスワードなどの機密情報は、Secret Managerで管理し、Cloud Functionsから参照します。

# シークレットを作成
echo -n "my-db-password" | gcloud secrets create db-password --data-file=-

# 関数デプロイ時にシークレットをマウント
gcloud functions deploy my-function \
    --gen2 \
    --set-secrets='DB_PASSWORD=db-password:latest'

関数のコード内では、環境変数DB_PASSWORDとして参照できます。ハードコーディングは絶対に避けましょう。

VPC接続

プライベートネットワーク内のリソース(Cloud SQL、Memorystore等)にアクセスする場合は、VPCコネクタを設定します。Ep.2のCloud Run + Cloud SQLで解説した手順と同様のアプローチです。

gcloud functions deploy my-function \
    --gen2 \
    --vpc-connector=my-vpc-connector \
    --egress-settings=private-ranges-only

Cloud Functions vs Cloud Run——使い分けの判断基準

Ep.2で学んだCloud Runとの違いを整理しておきましょう。

観点Cloud FunctionsCloud Run
抽象度関数単位(高い)コンテナ単位(中程度)
ユースケースイベント処理、Webhook、軽量API本格的なWebアプリ、複雑なAPI
デプロイコードのみDockerイメージ
実行時間上限60分60分
カスタマイズ性ランタイム固定任意のコンテナ
起動速度速いやや遅い(イメージサイズに依存)

判断の目安: 「1つのイベントに対して1つの処理」であればCloud Functions、「複数エンドポイントを持つWebアプリケーション」であればCloud Runが適しています。もちろん、両方を組み合わせて使うのが実務では一般的です。

まとめ——サーバーレススキルでSES案件の市場価値を高めよう

Cloud Functionsを使ったサーバーレス開発は、SESエンジニアにとって高い投資対効果を持つスキルです。

  • 学習コストの低さ: 関数1つから始められるため、マイクロサービスの入門として最適
  • 幅広い活用シーン: Webhook処理からデータパイプラインまで、ほぼすべてのバックエンド案件で使える
  • Cloud Runとの相乗効果: 第2世代はCloud Run上で動作するため、Ep.2の知識と組み合わせて理解を深められる
  • コスト効率: 従量課金で無料枠も充実しているため、個人の学習にも最適

まずはGCPの基礎(Ep.1)でプロジェクトを作成し、本記事のサンプルコードを実際にデプロイしてみましょう。Ep.3のBigQueryと組み合わせて、「Cloud Storageにアップロードされたファイルを自動的にBigQueryにロードする」パイプラインを構築すれば、実践的なポートフォリオになります。

次回のGoogle Cloud 完全攻略もお楽しみに!


出典・参考資料

関連記事

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修