Gemini CodeLab でトラブルシューティングを行う

1. はじめに

このラボでは、Google Cloud の AI を活用したコラボレーターである Gemini を使用して、エラーログを分析し、問題の根本原因を特定して、Cloud Functions のデプロイに関する問題をトラブルシューティングして解決します。

演習内容

  • Cloud Shell ターミナルと gcloud CLI を使用して、関連する Google API の有効化や、提供されたコードからの Cloud Functions の作成など、環境を設定します。
  • Cloud Logging のログ要約を使用してログの概要を生成し、キャプチャされた情報を把握します。
  • Gemini とチャットして、問題のトラブルシューティングと解決に Gemini の支援機能を利用します。

学習内容

  • Gemini を Google Cloud Observability で使用する方法と、問題のトラブルシューティングに使用する方法。
  • Gemini を使用して Cloud Functions ログを検索して内容を理解する方法。

必要なもの

  • Chrome ウェブブラウザ
  • 課金を有効にした Google Cloud プロジェクト
  • API を有効にしてリソースを操作できるプロジェクトへのアクセス権限を持つ Google アカウント

このラボは、初心者を含むあらゆるレベルの DevOps エンジニア、プラットフォーム エンジニア、ソフトウェア デベロッパーを対象としています。このラボでは、トラブルシューティングにおける Gemini の機能を実際に体験していただきます。

2. セットアップ

このセクションでは、このラボを始めるために必要なすべての手順について説明します。

環境の構成

1. https://console.cloud.google.com を開いて Cloud コンソールにログインします。

2. このラボで使用する Google Cloud プロジェクトを選択します。

22170459a4f3ba59.png

3. コンソールで Cloud Functions ページを開きます。これを行うには、ナビゲーション メニュー(コンソール ウィンドウの左上にあるアイコン ☰)から [Cloud Functions] を選択します。

9d27c844c16ad3e4.png

または、コンソールの検索エリアで「cloud functions」を検索します。

35f23e52875b26cd.png

関数リストの上にある [関数を作成] ボタンをクリックします。34b5e7e36f4e48e9.png

このプロジェクトで Cloud Functions を使用したことがない場合は、Google API を有効にするよう求められます。

5b7978521d6f56f7.png

[有効にする] をクリックして続行します。

4. 新しい Cloud Functions の基本プロパティを定義します。

  • 名前を「codelab-cf」に設定します
  • [未認証の呼び出しを許可する] オプションを選択します。

6a2aaf9bedd161d9.png

この手順を完了するには、ウィンドウの左下にある [NEXT] ボタンをクリックします。

f4e76470dbdf6854.png

[次へ] をクリックすると、追加の Google API を有効にするよう求められることがあります。ステップ 4 と同様に、[有効にする] をクリックします。

1ad7bf15c07eda49.png

Cloud Functions のランタイムとコードを設定する

この CodeLab では、プログラミング言語として Python を使用します。Python に不慣れでも心配はいりません。この Codelab を完了するうえで、Python の知識は必要ありません。

5. 関数のランタイムとして Python 3.11 を選択する

9a3cd8bf272b4d02.png

ランタイムを変更すると、インライン エディタに表示されるソースコードも変更されます。

6. 以下のコードをインライン エディタにコピーして、自動生成されたクイックスタートの例を変更します。

from google.cloud import storage
import json
import re

client = storage.Client()

def get_object_list(request):
    if request.args and 'path' in request.args:
        path = request.args['path']
    else:
        return '{}'
    parsed = re.search('gs:\/\/([a-zA-Z0-9_-]{3,63})\/([-a-zA-Z0-9_\+.\/]*)', path)
    bucket, prefix = parsed.group(1), parsed.group(2)
    blobs = client.list_blobs(bucket, prefix=prefix, delimiter='/')
    objects = []
    if (blobs):
        for blob in blobs:
            objects.append(blob.name)
    return json.dumps(objects)

このコードは、GET リクエストから path 属性を読み取り、パスを解析してバケット名を取得し、Google Cloud Storage API を呼び出してこのパスに保存されているオブジェクトのリストを取得します。この関数(get_object_list)は、Flask オブジェクトであるリクエストを入力引数として受け取り、オブジェクトの名前を JSON 配列として返します。

7. インライン エディタに残っているファイルの一覧から requirements.txt ファイルを選択します。次のコードをインライン エディタにコピーして、現在の依存関係のリストを新しいリストに置き換えます。

google-cloud-storage

8. Cloud Functions をデプロイするには、左下の [デプロイ] をクリックします。

17c4828702a32cd9.png

デプロイ プロセスが完了するまで数分かかることがあります。セットアップ手順に沿って操作した場合、デプロイが失敗したと報告されるはずです。

3. 問題の特定と解決

このセクションでは、ログの説明機能とその他の Gemini アシスタンスを使用して、問題と解決方法を特定します。

1. デプロイが失敗します。このことを知らせるエラー メッセージが表示され、追加情報とデプロイログを表示するオプションが表示されます。[ログを表示] をクリックして、デプロイのログを表示します。

bc62db6ef3b35420.png

デプロイログは、同じブラウザの別のタブで開きます。この CodeLab を完了するには、タブを切り替える必要があります。

[ログを表示] をクリックしてもログ行が表示されない場合や、数行しか表示されない場合があります。このような場合は、ログ エクスプローラのクエリ ペイン時間範囲セレクタを使用し、[過去 30 分間] を選択します。

e24856920201ebf8.png

2. 開いたタブでログを確認します。ログの概要は、例外のコールスタックの複数行のように表示されます。これは、Cloud Functions が stdout または stderr に出力されたテキストをキャプチャし、各行を個別のログエントリとして書き込むためです。他のログ行には、終了エラーコードに関する情報と、Cloud Functions API と Cloud Run API によって報告された追加情報がまとめられています。

b49e41594173b57c.png

いずれかの行をクリックすると、特定のログに関する詳細情報が表示されます。展開されたログには、ログに関するすべての情報をコピーしたり、すべてのフィールドを展開してログエントリのすべてのデータを表示したり、Gemini を使用してログエントリを説明したりできる追加の UI 要素があります。

4. 例外のコールスタックはあまり有益ではありません。ログを調べて、例外のスタック トレース ログの末尾を見つけます。「Container called exit(1)」という行です。次のログの概要は次のとおりです。

functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain...

調査の対象として適切であると思われます。この行をクリックしてログエントリを開きます。[このログエントリの説明を確認する] ボタンをクリックして、選択したログに関する追加情報を表示します。

b815de46d1b4597c.png

このプロジェクトで Gemini を以前に使用したことがない場合は、必要な API を有効にするよう求められます。API を有効にするよう求められたら、[有効にする] をクリックして続行します。

7ca90e087a2e99d1.png

なお、Gemini にプロンプトを入力したときにエラーが発生することがあります。このような場合は、プロンプト オペレーションをもう一度繰り返して、レスポンスを取得します。たとえば、[このログエントリの説明を確認する] ボタンをもう一度クリックします。

5. Gemini が提供する説明を確認します。提示された説明が不十分または不明確な場合は、次のいずれかのプロンプトを使用するか、独自の質問を作成して、Gemini に詳細な情報の提供を促します。

このログについて詳しく教えていただけますか?
エラーについて詳しく教えていただけますか?

6. 次に、Gemini に問題解決の提案を求めます。たとえば、Gemini に次のようにリクエストします。

この問題を解決するにはどうすればよいですか?
このエラーを解決するための解決策を提案してください
このエラーを修正する方法を提案してください

Gemini の回答は、現在のコンテキストと、プロンプトの文言や形式によって異なる場合があります。Gemini は、Cloud Functions のソースコードに hello_http という名前の関数があることを確認するよう推奨します。

7. 現在、Cloud Functions のログを表示するタブが表示されています。エラーが表示された Cloud Functions のデプロイ ページが表示されている前のタブを選択し、[編集] をクリックします。

c3d9b207214a2240.png

8. 認証が [未認証の呼び出しを許可する] に設定されていることを確認し、必要に応じて選択を更新します。

6a2aaf9bedd161d9.png

9. 下部の [NEXT] をクリックして、インライン エディタを表示します。Gemini の推奨事項に沿って、関数名を get_order_list から hello_http に変更します。

編集が完了したら、[DEPLOY] をクリックします。

デプロイ プロセスが完了するまで数分かかることがあります。デプロイが正常に完了し、エラー メッセージが表示されないことを確認します。

デプロイ プロセスが完了するまで、コンソールに最後のエラー メッセージが表示され続けることがあります。

10. curl を使用して次の HTTPS リクエストを送信し、Cloud Functions が動作していることを確認します。Cloud Shell を使用するか、curlgcloud CLI がインストールされている任意のターミナルから実行できます。Cloud Shell ターミナルから次のコマンドを実行します。

curl -m 70 -X GET \
https://us-central1-${GOOGLE_CLOUD_PROJECT}.cloudfunctions.net/\
codelab-cf?path=gs://cloud-samples-data/generative-ai/image/ \
-H "Authorization: bearer $(gcloud auth print-identity-token)"

このコマンドをターミナルから実行するには、gcloud CLI を使用して認証し、プロジェクト ID の値を環境変数 GOOGLE_CLOUD_PROJECT に設定する必要があります。

ボーナス

Python ランタイムが選択されたときに、関数名 hello_http が HTTP トリガー Cloud Functions のデフォルトのエントリ ポイントとして定義されました。別の解決策として、ソースコード内の関数名を get_order_list のままにして、インライン エディタの上にある Cloud Functions のエントリ ポイント フィールドを [ランタイム] フィールドの右側に更新する方法があります。

9a3cd8bf272b4d02.png

エントリ ポイントを hello_http から get_order_list に変更すると、デプロイの問題が解決します。

4. クリーンアップ

クリーンアップするには、プロジェクトをシャットダウンするか、Cloud Functions インスタンスを削除します。Cloud Functions は、コンソールまたは次のような CLI コマンドを使用して削除できます。

gcloud functions delete codelab-cf --region=us-central1

5. 完了

Gemini を使用してアプリケーションの問題をトラブルシューティングし、解決することができました。また、ログの理解や Google Cloud に関する質問への回答を得る方法も理解できました。

リファレンス ドキュメント