Google Cloud Platformに戻る

Cloud Functions

Cloud Functionsとは

Cloud Functionsは、Google Cloud Platform (GCP) が提供するサーバーレスの実行環境で、クラウドサービスを構築および接続するためのシンプルな関数を実行できます。インフラストラクチャの管理なしに、イベント駆動型の小規模なコードを実行するためのソリューションです。Cloud Functionsは、特定のイベント(HTTPリクエスト、Cloud Storageのファイル変更、Pub/Subメッセージなど)に応答して自動的に実行され、使用した分だけ課金される従量課金制のサービスです。

Cloud Functionsの主な特徴

Cloud Functionsのアーキテクチャ

Cloud Functionsは以下の主要コンポーネントで構成されています:

コンポーネント 説明
関数 特定のイベントに応答して実行される単一目的のコード
トリガー 関数の実行を開始するイベント(HTTPリクエスト、Pub/Subメッセージなど)
ランタイム 関数が実行される環境(Node.js、Python、Goなど)
インスタンス 関数を実行するコンテナインスタンス。トラフィックに応じて自動的に作成・削除される

Cloud Functions と Cloud Run の違い

Google Cloudには似たサービスとして Cloud Run がありますが、以下のような違いがあります:

Cloud Functionsのトリガータイプ

Cloud Functionsは様々なイベントソースからトリガーできます:

トリガータイプ 説明
HTTP HTTPリクエストに応答して関数を実行。RESTful APIやWebhookの実装に適している
Cloud Storage バケット内のオブジェクトの作成、削除、更新などのイベントに応答
Pub/Sub Pub/Subトピックに発行されたメッセージに応答
Firestore Firestoreデータベースのドキュメントの作成、更新、削除に応答
Firebase Authentication ユーザーの作成や削除などの認証イベントに応答
Firebase Realtime Database データベースの変更に応答
Cloud Scheduler スケジュールに基づいて定期的に関数を実行

Cloud Functionsの作成とデプロイ

Cloud Functionsは、Google Cloud Console、gcloud CLIツール、またはTerraformなどのIaCツールを使用して作成・デプロイできます。

Google Cloud Consoleを使用した関数の作成

  1. Google Cloud Consoleにログイン
  2. Cloud Functionsページに移動
  3. 「関数を作成」をクリック
  4. 関数名、リージョン、トリガータイプなどを設定
  5. ランタイムと関数のエントリポイントを指定
  6. コードエディタでコードを記述または既存のコードをアップロード
  7. 「デプロイ」をクリックして関数をデプロイ

gcloud CLIを使用した関数のデプロイ

HTTPトリガー関数のデプロイ例

gcloud functions deploy hello-world \
    --runtime nodejs14 \
    --trigger-http \
    --allow-unauthenticated \
    --entry-point=helloWorld

Pub/Subトリガー関数のデプロイ例

gcloud functions deploy process-message \
    --runtime python39 \
    --trigger-topic=my-topic \
    --entry-point=process_message

Cloud Storageトリガー関数のデプロイ例

gcloud functions deploy process-file \
    --runtime go116 \
    --trigger-resource=my-bucket \
    --trigger-event=google.storage.object.finalize \
    --entry-point=ProcessFile

Cloud Functionsでの関数開発

Cloud Functionsで実行する関数を開発する際の主なポイントは以下の通りです:

Node.jsでのHTTPトリガー関数の例

/**
 * HTTPリクエストに応答するシンプルな関数
 * @param {Object} req Cloud Functionsに送信されたHTTPリクエスト
 * @param {Object} res レスポンスを返すためのHTTPレスポンスオブジェクト
 */
exports.helloWorld = (req, res) => {
  const name = req.query.name || req.body.name || 'World';
  res.status(200).send(`Hello, ${name}!`);
};

Pythonでのpub/subトリガー関数の例

import base64
import json

def process_message(event, context):
    """Pub/Subメッセージを処理する関数
    
    Args:
        event (dict): イベントペイロード
        context (google.cloud.functions.Context): メタデータ
    """
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    print(f"Received message: {pubsub_message}")
    
    try:
        data = json.loads(pubsub_message)
        # メッセージの処理ロジック
        process_data(data)
    except Exception as e:
        print(f"Error processing message: {e}")
        
def process_data(data):
    # データ処理ロジックの実装
    print(f"Processing data: {data}")

GoでのCloud Storageトリガー関数の例

package function

import (
	"context"
	"fmt"
	"log"

	"cloud.google.com/go/storage"
)

// GCSEvent はCloud Storageイベントのデータ構造
type GCSEvent struct {
	Bucket string `json:"bucket"`
	Name   string `json:"name"`
}

// ProcessFile はCloud Storageのオブジェクト作成イベントに応答する関数
func ProcessFile(ctx context.Context, e GCSEvent) error {
	log.Printf("Processing file: gs://%s/%s", e.Bucket, e.Name)

	// Cloud Storageクライアントの初期化
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %v", err)
	}
	defer client.Close()

	// ファイル処理ロジックの実装
	// ...

	log.Printf("File processed successfully")
	return nil
}

依存関係の管理

関数に外部ライブラリや依存関係が必要な場合は、言語に応じた依存関係管理ファイルを使用します:

Node.jsの依存関係の例(package.json)

{
  "name": "my-function",
  "version": "1.0.0",
  "description": "Cloud Functions example",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/storage": "^5.8.5",
    "axios": "^0.21.1"
  }
}

Pythonの依存関係の例(requirements.txt)

google-cloud-storage==1.42.0
requests==2.26.0
pandas==1.3.3

Cloud Functionsの高度な機能

環境変数の設定

関数の設定に環境変数を使用して、APIキーやデータベース接続文字列などの設定を外部化できます:

gcloud functions deploy my-function \
    --runtime nodejs14 \
    --trigger-http \
    --set-env-vars="DB_HOST=my-db-host,API_KEY=my-api-key"

シークレットの管理

Secret Managerと統合して、機密情報を安全に管理できます:

gcloud functions deploy my-function \
    --runtime nodejs14 \
    --trigger-http \
    --set-secrets="API_KEY=projects/my-project/secrets/my-api-key/versions/latest"

VPCコネクタの設定

VPC内のリソースに安全にアクセスするためのVPCコネクタを設定できます:

gcloud functions deploy my-function \
    --runtime nodejs14 \
    --trigger-http \
    --vpc-connector=my-vpc-connector

メモリとタイムアウトの設定

関数のメモリ割り当てとタイムアウト時間をカスタマイズできます:

gcloud functions deploy my-function \
    --runtime nodejs14 \
    --trigger-http \
    --memory=2048MB \
    --timeout=540s

Cloud Functionsのセキュリティベストプラクティス

Node.jsでの入力検証の例

const { body, validationResult } = require('express-validator');

exports.validateUser = [
  body('email').isEmail().normalizeEmail(),
  body('password').isLength({ min: 8 }),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    next();
  }
];

Cloud Functionsのモニタリングとロギング

Cloud FunctionsはGoogle Cloud Monitoringおよびロギングと統合されており、関数の健全性とパフォーマンスを監視できます:

主なモニタリング機能

ログの出力

関数内でログを出力するには、言語に応じた標準的なロギング方法を使用します:

Node.jsでのログ出力

exports.logExample = (req, res) => {
  console.log('This is a log message'); // 標準ログ
  console.info('This is an info message'); // 情報ログ
  console.warn('This is a warning message'); // 警告ログ
  console.error('This is an error message'); // エラーログ
  
  res.status(200).send('Logs written');
};

Pythonでのログ出力

import logging

def log_example(request):
    logging.info('This is an info message')
    logging.warning('This is a warning message')
    logging.error('This is an error message')
    
    return 'Logs written'

ログの表示

関数のログを表示するには、Google Cloud Consoleのロギングページを使用するか、gcloud CLIを使用します:

gcloud functions logs read my-function --limit=50

Cloud Functionsのコスト最適化

Cloud Functionsのコストを最適化するためのベストプラクティス:

コールドスタート最適化のヒント

Cloud Functionsのトラブルシューティング

Cloud Functionsで発生する一般的な問題とその解決方法:

問題 考えられる原因 解決策
関数がデプロイできない 依存関係の問題、構文エラー、権限不足 ログを確認
依存関係を確認
IAM権限を確認
タイムアウトエラー 関数の実行時間が長すぎる 処理を最適化
タイムアウト設定を延長(最大540秒)
長時間実行タスクはCloud Tasksに移行
メモリ不足エラー 関数のメモリ使用量が割り当てを超えている メモリ使用量を最適化
メモリ割り当てを増やす(最大8GB)
コールドスタートの遅延 関数の初期化に時間がかかる 初期化コードを最適化
依存関係を最小化
適切なメモリサイズを設定

診断コマンド集

Cloud Functionsのユースケース

Cloud Functionsは以下のようなユースケースに適しています:

Cloud Functionsとの統合サービス

Cloud Functionsは他のGoogle Cloudサービスと統合して、より強力なソリューションを構築できます:

サービス 統合の利点
Cloud Storage ファイルのアップロード、削除、更新時に関数を実行
Pub/Sub メッセージ受信時に関数を実行してイベント駆動型アーキテクチャを実装
Firestore データベースの変更に応じて関数を実行
Cloud Scheduler スケジュールに基づいて関数を定期的に実行
Cloud Tasks 長時間実行タスクを非同期に処理
API Gateway 複数の関数を単一のAPIとして公開
BigQuery データ分析結果に基づいてアクションを実行

Pub/Subとの統合例

gcloud functions deploy process-message \
    --runtime nodejs14 \
    --trigger-topic=my-topic \
    --entry-point=processMessage

まとめ

Cloud Functions は、Google Cloud Platform上でサーバーレスの関数を実行するためのフルマネージドサービスです。イベント駆動型の小規模なコードを簡単にデプロイし、特定のイベントに応答して自動的に実行できます。インフラストラクチャの管理なしに、アプリケーションロジックに集中できる環境を提供します。

Cloud Functionsの主な利点は以下の通りです:

Cloud Functionsを効果的に活用するには、関数のスコープを明確に定義し、適切なトリガーを選択し、パフォーマンスとセキュリティのベストプラクティスを適用することが重要です。また、モニタリングとロギングを活用して、関数の動作を継続的に監視し、必要に応じて最適化することが推奨されます。