· サーバーレスとアプリケーション開発 · 5 min read
Cloud Functions: サーバーレスアプリケーションの構築方法 - 実践ガイド
Google Cloud Functionsを使用してサーバーレスアプリケーションを構築する方法を詳しく解説します。初心者から中級者向けの実践的なステップバイステップガイド。

はじめに:なぜ Cloud Functions なのか?
Google Cloud Functions は、サーバーレスコンピューティングの世界への入り口です。小規模な機能から複雑なマイクロサービスまで、インフラストラクチャの管理を気にすることなく、コードに集中できます。
Cloud Functions の主な利点
- スケーラビリティ: 自動的にスケールアップ・ダウンし、トラフィックの変動に対応
- コスト効率: 実行時間に基づく課金で、使用していない時間のコストが発生しない
- 開発の簡素化: サーバー管理が不要で、ビジネスロジックに集中できる
- 言語の柔軟性: Node.js、Python、Go、Java、.NET、Ruby をサポート
- イベント駆動: 様々な GCP サービスと連携し、イベントに応じて実行可能
Cloud Functions の始め方:環境設定
- Google Cloud Consoleにアクセス
- 新しいプロジェクトを作成(または既存のプロジェクトを選択)
- Cloud Functions API を有効化:
gcloud services enable cloudfunctions.googleapis.com
- Google Cloud SDKをインストール
最初の関数を作成:Hello World
コンソールを使用した作成
- Cloud Console で「Cloud Functions」を選択
- 「関数の作成」をクリック
- 以下の設定を行う:
- 関数名:
helloWorld
- リージョン:
us-central1
(または任意のリージョン) - トリガー: HTTP
- 認証: 未認証の呼び出しを許可
- 関数名:
- ランタイムとして「Node.js 14」を選択
index.js
に以下のコードを入力:
exports.helloWorld = (req, res) => {
const name = req.query.name || "World";
res.send(`Hello, ${name}!`);
};
- 「デプロイ」をクリック
コマンドラインを使用した作成
プロジェクトディレクトリを作成:
mkdir hello-world-function && cd hello-world-function
index.js
ファイルを作成:exports.helloWorld = (req, res) => { const name = req.query.name || "World"; res.send(`Hello, ${name}!`); };
package.json
ファイルを作成:{ "name": "hello-world-function", "version": "1.0.0", "description": "My first Cloud Function", "main": "index.js", "engines": { "node": "14" } }
関数をデプロイ:
gcloud functions deploy helloWorld \ --runtime nodejs14 \ --trigger-http \ --allow-unauthenticated
関数のテストと実行
デプロイ完了後、提供された URL を使用して関数をテストします:
curl "https://REGION-PROJECT_ID.cloudfunctions.net/helloWorld?name=Alice"
期待される出力: Hello, Alice!
高度な使用例:画像リサイズ関数
画像が Cloud Storage にアップロードされたときに自動的にリサイズする関数を作成しましょう。
必要なライブラリをインストール:
npm install @google-cloud/storage sharp
index.js
を以下のように作成:
const { Storage } = require("@google-cloud/storage");
const sharp = require("sharp");
const storage = new Storage();
exports.resizeImage = async (file, context) => {
const bucket = storage.bucket(file.bucket);
const image = bucket.file(file.name);
const outputBucket = storage.bucket("resized-images");
const [buffer] = await image.download();
const resizedBuffer = await sharp(buffer)
.resize(200, 200, { fit: "inside" })
.toBuffer();
await outputBucket.file(`resized-${file.name}`).save(resizedBuffer);
console.log(`Resized image ${file.name}`);
};
- デプロイ:
gcloud functions deploy resizeImage \ --runtime nodejs14 \ --trigger-resource YOUR_BUCKET_NAME \ --trigger-event google.storage.object.finalize
この関数は、指定したバケットに画像がアップロードされるたびに自動的に実行され、リサイズした画像を別のバケットに保存します。
ベストプラクティスと Tips
- 冪等性の確保: 関数が複数回実行されても安全なように設計する
- タイムアウトの考慮: デフォルトのタイムアウト(60 秒)を超える処理は避ける
- 環境変数の使用: 設定値は環境変数として管理する
- エラーハンドリング: 適切な例外処理とログ出力を行う
- コールドスタート対策: 関数の初期化コードを最適化する
トラブルシューティング
デプロイに失敗する場合:
- 権限設定を確認
- API が有効化されているか確認
- エラーメッセージを詳細に分析
関数が正しく実行されない場合:
- Cloud Console でログを確認
- ローカルでのテストを実施
パフォーマンスの問題:
- Cloud Trace を使用してボトルネックを特定
- メモリ割り当てを調整
他の GCP サービスとの統合
Cloud Functions は多くの GCP サービスと簡単に連携できます:
- Cloud Pub/Sub: メッセージングとイベント駆動処理
- Cloud Storage: ファイルの処理と変換
- Firestore: データベース操作の自動化
- BigQuery: データ分析と処理の自動化
まとめと次のステップ
Cloud Functions を使用することで、サーバーレスアプリケーションを簡単に構築でき、開発者はインフラ管理よりもビジネスロジックに集中できます。この記事で学んだ基本を元に、以下のような高度な使用方法に挑戦してみてください:
- 複数の関数を組み合わせたマイクロサービスアーキテクチャの構築
- CI/CD パイプラインへの Cloud Functions の統合
- セキュリティ強化: IAM ロールの適切な設定、VPC Service Controls の利用
より詳細な情報とベストプラクティスについては、以下のリソースを参照してください: