1. はじめに
このラボでは、Google Cloud の AI コラボレーターである Gemini を使用して、エラーログを分析し、問題の根本原因を特定し、修正方法を見つけることで、Cloud Functions のデプロイに関する問題をトラブルシューティングします。
演習内容
- Cloud Shell ターミナルと gcloud CLI を使用して、関連する Google API の有効化や提供されたコードからの Cloud Functions の関数の作成など、環境を設定します。
- キャプチャした情報を理解するために、Cloud Logging のログの要約を使用してログの概要を生成します。
- トラブルシューティングと問題解決のために Gemini のサポートを Gemini とチャットします。
学習内容
- Google Cloud Observability で Gemini を使用する方法、問題のトラブルシューティングを行う方法。
- Gemini を使用して Cloud Functions のログを検索して理解する方法。
必要なもの
- Chrome ウェブブラウザ
- 課金を有効にした Google Cloud プロジェクト
- API を有効にしてリソースを操作できるプロジェクトへのアクセス権がある Google アカウント
このラボは、初心者を含む、あらゆるレベルの DevOps、プラットフォーム エンジニア、ソフトウェア デベロッパーを対象としています。トラブルシューティングで Gemini の機能を実際に体験することに重点を置いています。
2. セットアップ
このセクションでは、このラボを始めるために必要なすべての手順について説明します。
環境の構成
1. https://console.cloud.google.com を開いて Cloud コンソールにログインします。
2. このラボで使用する Google Cloud プロジェクトを選択します。
3. コンソールで [Cloud Functions] ページを開きます。これを行うには、ナビゲーション メニュー(コンソール ウィンドウの左上のアイコン Я)から [Cloud Functions] を選択します。
または、「Cloud Functions」と次の場所に移動します。
関数のリストの上部にある [関数を作成] ボタンをクリックします。
このプロジェクトで Cloud Functions を使用したことがない場合は、作業を行うために Google API を有効にするように求められます。
[有効にする] をクリックして続行します。
4. 新しい Cloud Functions の関数の基本的なプロパティを定義します。
- 名前を「
codelab-cf
」に設定 - [未認証の呼び出しを許可する] オプションを選択します。
ステップを完了するには、ウィンドウの左下にある [NEXT] ボタンをクリックします。
[次へ] をクリックした後、追加の Google API を有効にするよう求められることがあります。ステップ 4 と同様に、[有効にする] をクリックします。
Cloud Functions の関数のランタイムとコードを設定する
この Codelab では、プログラミング言語として Python を使用します。Python に不慣れでも問題ありません。この Codelab を完了するには、Python の知識は必要ありません。
5. 関数のランタイムとして Python 3.11 を選択します
ランタイムを変更すると、インライン エディタに表示されるソースコードも変更されます。
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 の関数をデプロイするには、左下にある [デプロイ] をクリックします。
デプロイ プロセスが完了するまで数分かかる場合があります。設定手順に忠実に従えば、デプロイが失敗と報告されるはずです。
3. 問題の発見と解決
このセクションでは、ログの説明機能やその他の Gemini の支援機能を使用して、問題を特定し、解決する方法を特定します。
1. デプロイは失敗します。このことを通知するエラー メッセージと、追加情報とデプロイログを表示するオプションが表示されます。[ログを表示] をクリックしてデプロイのログを表示します。
デプロイログは、同じブラウザの別のタブで開きます。この Codelab を完了するには、タブ間を移動する必要があります。
注: [ログを表示] をクリックしてもログ行が表示されないか、数行しか表示されない場合があります。このような場合は、ログ エクスプローラのクエリペインで時間範囲セレクタを使用して、[Last 30 minutes] を選択します。
2. 開いたタブでログを確認します。ログの概要が例外のコールスタックの複数行のように見えることに注意してください。これは、Cloud Functions の関数が stdout
または stderr
に出力されたテキストをキャプチャし、各行を個別のログエントリとして書き込むためです。その他のログ行には、終了エラーコードに関する情報と、Cloud Functions と Cloud Run API によって報告される追加情報がまとめられています。
いずれかの行をクリックすると、特定のログの詳細が表示されます。展開されたログには追加の UI 要素があり、クリックすると、ログに関するすべての情報をコピーしたり、すべてのフィールドを開いてログエントリのすべてのデータを表示したりできます。また、Gemini を使用してログエントリを説明することもできます。
4. 例外コールスタックはあまり参考になりません。ログを調べて、例外のスタック トレースログの末尾を見つけます。これは「Container called exit(1)
」という行です。次のログの概要は次のとおりです。
functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain...
調査の有力な候補になりそうです。この行をクリックしてログエントリを展開します。[このログエントリの説明] をクリックします。選択したログに関する追加情報を表示します。
このプロジェクトで Gemini が使用されていない場合は、必要な API を有効にするように求められます。API を有効にするように求められたら、[有効にする] をクリックして次に進みます。
なお、Gemini へのプロンプトを入力する際にエラーが発生することがあります。このようなイベントでは、プロンプト操作をもう 1 回繰り返してレスポンスを取得します。たとえば、[このログエントリの説明] をクリックします。] ボタンを押します。
5. Gemini から提供された説明を確認します。与えられた説明が不十分または不明瞭な場合は、次のいずれかのプロンプトを使用するか、独自の質問を作成して、Gemini により多くの情報を提供するよう指示します。
このログについて詳しく教えてください。
エラーについて詳しく教えてください。
6. 次に、問題を解決するための提案を Gemini に求めます。たとえば、Gemini に
この問題の解決方法を提案
このエラーの解決方法を提案
このエラーの解決方法を教えて
Gemini の回答は、現在のコンテキストや、プロンプトの言い回しや形式によって異なる場合があります。Gemini では、Cloud Functions の関数のソースコードに hello_http
という名前の関数があることが推奨されます。
7. 現在、Cloud Functions のログを表示するタブが表示されています。エラーが表示された Cloud Functions の関数のデプロイページが表示されている前のタブを選択し、[編集] をクリックします。
8. 認証が引き続き [未認証の呼び出しを許可する] に設定されていることを確認し、必要に応じて選択内容を更新します。
9. 下部の [次へ] をクリックすると、インライン エディタが表示されます。Gemini の推奨事項に従い、関数名を get_order_list
から hello_http
に変更します。
編集が完了したら、[デプロイ] をクリックします。
デプロイ プロセスが完了するまで数分かかる場合があります。デプロイが正常に完了し、エラー メッセージが表示されないことを確認します。
デプロイ プロセスが完了するまで、コンソールに最後のエラー メッセージが引き続き表示されることがあります。
10. curl
を使用して次の HTTPS リクエストを送信し、Cloud Functions の関数が動作していることを確認します。Cloud Shell を使用することも、curl
と gcloud
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
に設定する必要があります。
ボーナス
関数 hello_http
の名前は、Python ランタイムが選択されたときに、HTTP でトリガーされる Cloud Functions のデフォルトのエントリ ポイントとして定義されています。別の解決策として、ソースコードで関数の名前として get_order_list
を維持し、インライン エディタの上にある Cloud Functions のエントリ ポイント フィールドを [ランタイム] フィールドの右側で更新することもできます。
エントリ ポイントを hello_http
から get_order_list
に変更すると、デプロイの問題が解決します。
4. クリーンアップ
クリーンアップするには、プロジェクトをシャットダウンするか、Cloud Functions の関数インスタンスを削除します。Cloud Functions の関数を削除するには、コンソールを使用するか、次のような CLI コマンドを使用します。
gcloud functions delete codelab-cf --region=us-central1
5. 完了
お疲れさまでした。これで、Gemini を使用して、アプリケーションの問題のトラブルシューティングと解決を行うことができました。これで、ログの理解や Google Cloud に関する質問への回答に Gemini がどのように役立つかについて理解できました。