· サーバーレスとアプリケーション開発  · 5 min read

Cloud Functions: サーバーレスアプリケーションの構築方法 - 実践ガイド

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

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

はじめに:なぜ Cloud Functions なのか?

Google Cloud Functions は、サーバーレスコンピューティングの世界への入り口です。小規模な機能から複雑なマイクロサービスまで、インフラストラクチャの管理を気にすることなく、コードに集中できます。

Cloud Functions の主な利点

  1. スケーラビリティ: 自動的にスケールアップ・ダウンし、トラフィックの変動に対応
  2. コスト効率: 実行時間に基づく課金で、使用していない時間のコストが発生しない
  3. 開発の簡素化: サーバー管理が不要で、ビジネスロジックに集中できる
  4. 言語の柔軟性: Node.js、Python、Go、Java、.NET、Ruby をサポート
  5. イベント駆動: 様々な GCP サービスと連携し、イベントに応じて実行可能

Cloud Functions の始め方:環境設定

  1. Google Cloud Consoleにアクセス
  2. 新しいプロジェクトを作成(または既存のプロジェクトを選択)
  3. Cloud Functions API を有効化:
    gcloud services enable cloudfunctions.googleapis.com
    
  4. Google Cloud SDKをインストール

最初の関数を作成:Hello World

コンソールを使用した作成

  1. Cloud Console で「Cloud Functions」を選択
  2. 「関数の作成」をクリック
  3. 以下の設定を行う:
    • 関数名: helloWorld
    • リージョン: us-central1(または任意のリージョン)
    • トリガー: HTTP
    • 認証: 未認証の呼び出しを許可
  4. ランタイムとして「Node.js 14」を選択
  5. index.js に以下のコードを入力:
exports.helloWorld = (req, res) => {
  const name = req.query.name || "World";
  res.send(`Hello, ${name}!`);
};
  1. 「デプロイ」をクリック

コマンドラインを使用した作成

  1. プロジェクトディレクトリを作成:

    mkdir hello-world-function && cd hello-world-function
    
  2. index.js ファイルを作成:

    exports.helloWorld = (req, res) => {
      const name = req.query.name || "World";
      res.send(`Hello, ${name}!`);
    };
    
  3. package.json ファイルを作成:

    {
      "name": "hello-world-function",
      "version": "1.0.0",
      "description": "My first Cloud Function",
      "main": "index.js",
      "engines": {
        "node": "14"
      }
    }
    
  4. 関数をデプロイ:

    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 にアップロードされたときに自動的にリサイズする関数を作成しましょう。

  1. 必要なライブラリをインストール:

    npm install @google-cloud/storage sharp
    
  2. 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}`);
};
  1. デプロイ:
    gcloud functions deploy resizeImage \
      --runtime nodejs14 \
      --trigger-resource YOUR_BUCKET_NAME \
      --trigger-event google.storage.object.finalize
    

この関数は、指定したバケットに画像がアップロードされるたびに自動的に実行され、リサイズした画像を別のバケットに保存します。

ベストプラクティスと Tips

  1. 冪等性の確保: 関数が複数回実行されても安全なように設計する
  2. タイムアウトの考慮: デフォルトのタイムアウト(60 秒)を超える処理は避ける
  3. 環境変数の使用: 設定値は環境変数として管理する
  4. エラーハンドリング: 適切な例外処理とログ出力を行う
  5. コールドスタート対策: 関数の初期化コードを最適化する

トラブルシューティング

  1. デプロイに失敗する場合:

    • 権限設定を確認
    • API が有効化されているか確認
    • エラーメッセージを詳細に分析
  2. 関数が正しく実行されない場合:

    • Cloud Console でログを確認
    • ローカルでのテストを実施
  3. パフォーマンスの問題:

    • Cloud Trace を使用してボトルネックを特定
    • メモリ割り当てを調整

他の GCP サービスとの統合

Cloud Functions は多くの GCP サービスと簡単に連携できます:

  • Cloud Pub/Sub: メッセージングとイベント駆動処理
  • Cloud Storage: ファイルの処理と変換
  • Firestore: データベース操作の自動化
  • BigQuery: データ分析と処理の自動化

まとめと次のステップ

Cloud Functions を使用することで、サーバーレスアプリケーションを簡単に構築でき、開発者はインフラ管理よりもビジネスロジックに集中できます。この記事で学んだ基本を元に、以下のような高度な使用方法に挑戦してみてください:

  1. 複数の関数を組み合わせたマイクロサービスアーキテクチャの構築
  2. CI/CD パイプラインへの Cloud Functions の統合
  3. セキュリティ強化: IAM ロールの適切な設定、VPC Service Controls の利用

より詳細な情報とベストプラクティスについては、以下のリソースを参照してください:

Back to Blog

Related Posts