Cloud Run を使用した Genkit

Genkit のフローは、Cloud Run を使用してウェブサービスとしてデプロイできます。このページでは、例として、デフォルトのサンプルフローをデプロイするプロセスについて説明します。

  1. Google Cloud CLI をインストールします(まだインストールしていない場合)。

  2. Cloud コンソールを使用して新しい Google Cloud プロジェクトを作成するか、既存のプロジェクトを選択します。プロジェクトは請求先アカウントにリンクされている必要があります。

    プロジェクトを作成または選択したら、そのプロジェクトを使用するように Google Cloud CLI を構成します。

    gcloud auth login
    gcloud init
  3. Genkit サンプル プロジェクトのディレクトリを作成します。

    mkdir -p ~/tmp/genkit-cloud-project
    cd ~/tmp/genkit-cloud-project

    IDE を使用する場合は、このディレクトリに開きます。

  4. プロジェクト ディレクトリで Go モジュールを初期化します。

    go mod init example/cloudrun
    go mod get github.com/firebase/genkit/go
  5. Genkit を使用してサンプルアプリを作成します。

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "github.com/firebase/genkit/go/ai"
        "github.com/firebase/genkit/go/genkit"
        "github.com/firebase/genkit/go/plugins/googlegenai"
        "github.com/firebase/genkit/go/plugins/server"
    )
    
    func main() {
        ctx := context.Background()
    
        // Initialize Genkit with the Google AI plugin and Gemini 2.0 Flash.
        // Alternatively, use &googlegenai.VertexAI{} and "vertexai/gemini-2.0-flash"
        // to use Vertex AI as the provider instead.
        g, err := genkit.Init(ctx,
            genkit.WithPlugins(&googlegenai.GoogleAI{}),
            genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
        )
        if err != nil {
            log.Fatalf("failed to initialize Genkit: %w", err)
        }
    
        flow := genkit.DefineFlow(g, "jokesFlow", func(ctx context.Context, topic string) (string, error) {
            resp, err := genkit.Generate(ctx, g,
                ai.WithPrompt(`Tell a short joke about %s. Be creative!`, topic),
            )
            if err != nil {
                return "", fmt.Errorf("failed to generate joke: %w", err)
            }
    
            return resp.Text(), nil
        })
    
        mux := http.NewServeMux()
        mux.HandleFunc("POST /jokesFlow", genkit.Handler(flow))
        log.Fatal(server.Start(ctx, "127.0.0.1:"+os.Getenv("PORT"), mux))
    }
    
  6. デプロイされた関数で API 認証情報を使用できるようにします。上記のサンプルで選択した内容に基づいて、必要な認証情報を選択します。

    Gemini(Google AI)

    1. Google AI がお住まいの地域で利用可能であることを確認します。

    2. Google AI Studio を使用して Gemini API の API キーを生成します。

    3. その API キーを Cloud Run 環境で使用できるようにします。

      1. Cloud コンソールで、Secret Manager API を有効にします。
      2. [Secret Manager] ページで、API キーを含む新しいシークレットを作成します。
      3. シークレットを作成したら、同じページで、デフォルトのコンピューティング サービス アカウントに、Secret Manager Secret アクセサーのロールを付与して、シークレットにアクセスできるようにします。(デフォルトのコンピューティング サービス アカウントの名前は、[IAM] ページで検索できます)。

      後でサービスをデプロイするときに、このシークレットの名前を参照する必要があります。

    Gemini(Vertex AI)

    1. Cloud コンソールで、プロジェクトの Vertex AI API を有効を有効にするを選択します。

    2. [IAM] ページで、デフォルトのコンピューティング サービス アカウントVertex AI ユーザーロールが付与されていることを確認します。

    このチュートリアルで設定する必要があるシークレットはモデル プロバイダ用のものだけですが、一般的には、フローで使用する各サービスに対して同様の設定を行う必要があります。

  7. 省略可: デベロッパー UI でフローを試します。

    1. 選択したモデル プロバイダ用にローカル環境をセットアップします。

      Gemini(Google AI)

      export GEMINI_API_KEY=<your API key>

      Gemini(Vertex AI)

      export GOOGLE_CLOUD_PROJECT=<your project ID>
      export GOOGLE_CLOUD_LOCATION=us-central1
      gcloud auth application-default login
    2. UI を起動します。

      genkit start -- go run .
    3. デベロッパー UI(http://localhost:4000/)でフローを実行します。

      1. [jokesFlow] をクリックします。

      2. [Input JSON] タブで、モデルのサブジェクトを指定します。

        "bananas"
        
      3. [実行] をクリックします。

  8. ここまですべてが想定どおりに動作している場合は、フローをビルドしてデプロイできます。

    Gemini(Google AI)

    gcloud run deploy --port 3400 \
      --update-secrets=GEMINI_API_KEY=<your-secret-name>:latest

    Gemini(Vertex AI)

    gcloud run deploy --port 3400 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=<your-gcloud-project> \
      --set-env-vars GOOGLE_CLOUD_LOCATION=us-central1

    GOOGLE_CLOUD_LOCATION は、使用する Vertex API リージョンを構成します)

    未認証の呼び出しを許可するかどうかを尋ねられたら、N を選択します。[N] を選択すると、IAM 認証情報を必要とするようサービスが設定されます。これらの認証情報の提供に関しては、Cloud Run ドキュメントの認証をご覧ください。

デプロイが完了すると、ツールによってサービス URL が出力されます。curl を使用してこれをテストできます。

curl -X POST https://<service-url>/menuSuggestionFlow \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" -d '"bananas"'