- Cloud Functionsはコード片をイベント駆動で実行できるGCPのサーバーレスコンピューティングサービス
- HTTP・Pub/Sub・Cloud Storageトリガーなど多彩なイベントソースに対応し、インフラ管理ゼロで運用可能
- Pub/Sub連携によるマイクロサービス構築やコスト最適化テクニックまで、SES現場で即活用できる知識を網羅
- Google Cloud 完全攻略 Ep.1: GCPの基礎知識とプロジェクト作成
- Google Cloud 完全攻略 Ep.2: Cloud RunとCloud SQLで実現するスケーラブルなコンテナ運用
- Google Cloud 完全攻略 Ep.3: BigQueryではじめるデータ分析入門
- Google Cloud 完全攻略 Ep.4: Cloud Functionsで学ぶサーバーレスアーキテクチャ入門(本記事)
- Google Cloud 完全攻略 Ep.5: Cloud Storageで学ぶオブジェクトストレージ運用入門
- Google Cloud 完全攻略 Ep.6: IAMとセキュリティ設計で学ぶクラウド権限管理
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の始め方
第1世代 vs 第2世代
Cloud Functionsには第1世代と第2世代があります。2026年現在、新規開発には**第2世代(Cloud Functions 2nd gen)**が推奨されています。
| 項目 | 第1世代 | 第2世代 |
|---|---|---|
| 基盤 | 独自インフラ | Cloud Run上に構築 |
| 最大タイムアウト | 9分 | 60分 |
| 最大メモリ | 8GB | 32GB |
| 同時実行 | 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 |
コスト最適化のポイント
- 最小構成でデプロイ: メモリとCPUは必要最小限に設定する
gcloud functions deploy my-function \
--gen2 \
--memory=256MB \
--cpu=0.167 \
--timeout=60s \
--max-instances=10 \
--min-instances=0
-
コールドスタートの管理:
--min-instances=1で最小インスタンスを確保すると応答速度が向上するが、常時課金が発生する。トレードオフを理解して設定する -
同時実行数の活用(第2世代): 1インスタンスで複数リクエストを処理できるため、インスタンス数を抑えてコスト削減
gcloud functions deploy my-function \
--gen2 \
--concurrency=80
- 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 Functions | Cloud 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 完全攻略もお楽しみに!
出典・参考資料
- Cloud Functions ドキュメント — Google Cloud
- Cloud Functions の料金 — Google Cloud
- Cloud Pub/Sub ドキュメント — Google Cloud
- Eventarc ドキュメント — Google Cloud
関連記事