始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
Set up the Python application and necessary resources
/ 40
Containerize and publish the application to Artifact Registry
/ 10
Deploy the app to Cloud Run
/ 10
Find the issue and fix the application
/ 30
Add Error Reporting to the application
/ 10
Artifact Registry は、パッケージと Docker コンテナ イメージを一か所でまとめて保管、管理するための場所です。
Cloud Build は、Google Cloud でビルドを実行するサービスです。
Cloud Run は、Google のスケーラブルなインフラストラクチャ上でコンテナを実行できるマネージド コンピューティング プラットフォームです。
Google Cloud Observability は、アプリケーション向けのモニタリング、ロギング、トレースの統合マネージド サービスを提供します。
Cloud クライアント ライブラリは、アプリケーションから Google Cloud API を呼び出すための推奨される方法です。Cloud クライアント ライブラリでは、アプリケーションで使用しているプログラミング言語の自然な規則やスタイルを使用します。サーバーとの低レイヤの通信(認証や再試行ロジックなど)が処理されます。
Google API では、認証および承認に OAuth 2.0 プロトコルを使用しています。
Secret Manager を使用すると、API キー、パスワード、証明書、その他の機密データをバイナリ blob またはテキスト文字列として保存できます。
このラボでは、Cloud Shell で Python アプリケーションを実行してから、そのアプリケーションを Cloud Run にデプロイします。また、Cloud Run へのアプリケーション移行時に発生する問題に対処し、Google Cloud オペレーション スイートのアプリケーション開発機能を確認します。
このラボでは、次のタスクの実行方法を学びます。
この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側のパネルには、このラボで使用する必要がある一時的な認証情報が表示されます。
ユーザー名をコピーし、[Google Console を開く] をクリックします。 ラボでリソースが起動し、別のタブで [アカウントの選択] ページが表示されます。
[アカウントの選択] ページで [別のアカウントを使用] をクリックします。[ログイン] ページが開きます。
[接続の詳細] パネルでコピーしたユーザー名を貼り付けます。パスワードもコピーして貼り付けます。
しばらくすると、このタブで Cloud コンソールが開きます。
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。
gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
出力:
出力例:
出力:
出力例:
このタスクでは、Python アプリケーションをダウンロードして、現在のバージョンのアプリで使用されるリソースを作成します。
Firestore データベースを作成するには、Cloud Shell で次のコマンドを実行します。
Firestore データベースは、書籍とユーザー プロファイル データを保存するために使用されます。
Cloud Shell を承認するように求められたら、[承認] をクリックします。
Cloud Storage バケットを作成するには、次のコマンドを実行します。
Cloud Storage バケットは、書籍の表紙画像を保存するために使用されます。このバケットには均一なバケットレベルのアクセスがあり、公開アクセスの防止を使用していません。
バケット内のすべてのオブジェクトを公開して読み取り可能にするには、次のコマンドを実行します。
認証に OAuth 2.0 を使用する場合、アプリでは Google アカウントから 1 つ以上のアクセス スコープがリクエストされます。Google が同意画面を表示して、アプリケーションとデータを共有することに対するユーザーの同意を得ます。
Google Cloud コンソールで、ナビゲーション メニュー()を選択し、[API とサービス] > [OAuth 同意画面] を選択します。
[開始] をクリックします。
[アプリ名] に「Bookshelf」と入力します。
[ユーザー サポートメール] で、受講者のメールアドレスを選択します。
[次へ] をクリックします。
[対象] で [内部] を選択し、[次へ] をクリックします。
プロジェクトへのアクセス権を持つユーザーが、アプリにログインできるようになります。
ラボの手順の左側にあるパネルで、[ユーザー名] の値をコピーします。
[メールアドレス] では、コピーしたユーザー名を貼り付けて、[次へ] をクリックします。
ユーザーデータに関するポリシーに同意するチェックボックスをオンにして、[続行] をクリックします。
[作成] をクリックします。
ナビゲーション メニューで、[ブランディング] をクリックします。
[+ ドメインの追加] をクリックします。
[承認済みドメイン] セクションで、[承認済みドメイン 1] に「cloudshell.dev」と入力します。
[保存] をクリックします。
ナビゲーション メニューで [データアクセス] をクリックします。
[スコープを追加または削除] をクリックします。
リストの先頭で、openid の横にあるチェックボックスをオンにします。
[フィルタ] に「userinfo.profile」と入力して Enter キーを押してから、[.../auth/userinfo.profile] スコープの横にあるチェックボックスをオンにします。
[フィルタ] の「userinfo.profile」フィルタをクリアし、「contacts」と入力して Enter キーを押します。次に、[.../auth/contacts] スコープのチェックボックスをオンにします。
[更新] をクリックします。
非機密のスコープが 2 つ(openid と userinfo.profile)と、機密性の高いスコープが 1 つ(contacts)表示されます。
[保存] をクリックします。
ナビゲーション メニューで [クライアント]、[+ クライアントを作成] の順にクリックします。
[アプリケーションの種類] で [ウェブ アプリケーション] を選択します。
[名前] に「Bookshelf」と入力します。
[承認済みのリダイレクト URI] で [+ URI を追加] をクリックします。
ここに指定した URI は、ユーザーの同意を取得した後に Google がブラウザをアプリケーションにリダイレクトする際に使用されます。
リダイレクト URI を取得するには、Cloud Shell で次のコマンドを実行します。
echo コマンドで作成した URI をコピーし、[URIs 1] に貼り付けます。
[作成] をクリックします。
[JSON をダウンロード] をクリックし、クライアント シークレット JSON をローカルマシンに保存します。
クライアント シークレット ファイルは、Google でアプリを検証するために使用されます。
[OK] をクリックします。
Cloud Shell で、右上のツールバーの [さらに表示]()をクリックし、[アップロード] をクリックします。
[ファイル選択] をクリックし、クライアント シークレット JSON ファイルを選択して、[開く] をクリックします。
[アップロード] をクリックします。
これで、クライアント シークレット JSON ファイルをホーム ディレクトリで使用できるようになりました。このファイルの内容は、OAuth プロセスで使用されます。
クライアント シークレット JSON ファイルの保存先として、安全な Secret Manager を使用することをおすすめします。
Secret Manager API を有効にするには、Cloud Shell で次のコマンドを実行します。
クライアント シークレット ファイルの名前を変更するには、次のコマンドを実行します。
シークレットを作成するには、次のコマンドを実行します。
これで、アプリケーションからアクセスできる bookshelf-client-secrets という名前のシークレットが作成されました。
Flask 秘密鍵のシークレットを作成するには、次のコマンドを実行します。
このコマンドにより、20 文字のランダムな英数字のパスワードが作成され、flask-secret-key という名前のシークレットに保存されます。
Cloud Storage バケットからホーム ディレクトリに Python コードをコピーするには、次のコマンドを実行します。
bookshelf ディレクトリの内容を確認するには、次のコマンドを実行します。
7 個の Python ファイル、1 個の要件ファイル、6 個のテンプレート ファイルを含むリストが表示されます。
要件ファイル内の依存関係を表示するには、次のコマンドを実行します。
要件ファイルでは、次の依存関係を指定します。
要件ファイル内の依存関係をインストールするには、次のコマンドを実行します。
pip は Python 用のパッケージ インストーラです。この pip3 コマンドは、Python バージョン 3 で使用するために requirements.txt ファイルで指定されたパッケージをインストールします。
HTTP サーバーを起動するには、次のコマンドを実行します。
次の環境変数がアプリケーションに渡されます。
EXTERNAL_HOST_URL: コールバック URL で使用する必要があるスキームとホスト名を指定します。これで、アプリケーションがポート 8080 でホストされるようになりました。
ウェブブラウザでアプリケーションを実行するには、[ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] を選択します。
ブラウザで新しいタブが開き、アプリケーションが実行されます。このページには、既存のすべての書籍のリストが表示されます。まだ書籍はありません。
この「オズの魔法使い」の書籍の表紙画像を右クリックし、oz.png という名前でパソコンに保存します。
[+ Add book] をクリックします。
書籍を追加するにはログインする必要があるため、Google でログインするためのアカウントを選択するよう求められます。
受講者のメールアドレスをクリックし、[続行] をクリックします。
[許可] をクリックします。
フォームに次の情報を入力します。
| フィールド | 値 |
|---|---|
| タイトル | オズの魔法使い |
| 著者 | Frank L. Baum |
| 出版日 | 1900 |
| Description(説明) | There's no place like home! |
[Cover Image] で [Choose File] をクリックします。
ダウンロードしたファイル(oz.png)を選択し、[開く] をクリックします。
[Save] をクリックします。
表示ページに戻ります。書籍の詳細が表示されています。書籍の詳細は Firestore データベースに保存され、表紙画像は Cloud Storage に保存されます。
メールアドレスをクリックします。
プロファイルが表示されます。言語選択コントロールには「English」と表示されています。
[Preferred Language] を [Spanish] に変更し、[Save] をクリックします。
書籍『Wonderful Wizard of Oz』をクリックします。
表示ページに、元からあった英語の説明と、スペイン語の翻訳の両方が表示されます。
Cloud Shell でアプリケーションを終了するには、Ctrl+C キーを押します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、Cloud Build を使用してアプリケーションをコンテナ化し、Artifact Registry に公開します。
Artifact Registry リポジトリを作成するには、Cloud Shell で次のコマンドを実行します。
このリポジトリにアプリケーション コンテナが保存されます。
リポジトリの詳細を表示するには、次のコマンドを実行します。
独自の Dockerfile を作成してアプリケーションを Docker イメージにパッケージ化することもできますが、Cloud Build を利用すれば buildpacks を使用してコンテナを自動的にビルドできます。
Cloud Build を使用してアプリケーションをビルドするには、次のコマンドを実行します。
このコマンドによって、~/bookshelf ディレクトリにあるコードの Docker イメージがビルドされ、Artifact Registry の app-repo リポジトリに保存されます。
ビルドのリストを表示するには、次のコマンドを実行します。
bookshelf ビルドがリスト表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、Cloud Run にアプリケーションをデプロイしてテストします。
Cloud Run にアプリケーションをデプロイするには、次のコマンドを実行します。
API を有効にするかどうかを確認するメッセージが表示されたら、「y」と入力します。
このコマンドによって、先ほどビルドしたイメージが Cloud Run にデプロイされます。ユーザー ログインが必要なのは書籍を作成、変更、削除するときのみであるため、未認証の呼び出しを許可するように指定します。GOOGLE_CLOUD_PROJECT 環境変数をアプリケーションに指定しているのは、Cloud Run にデフォルトで用意されていないためです。
Cloud Run によってアプリケーションがデプロイされます。
アプリケーションの URL を取得するには、次のコマンドを実行します。
前のコマンドによって作成されたリンクをクリックします。
新しいタブが開き、「サービスを利用できません」というメッセージ(または別のエラー)が表示されます。
アプリケーションが正しく動作していないため、原因を突き止める必要があります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、ログを使用して問題を修正します。
アプリケーションで問題が発生した場合、Cloud Logging のログが問題の解決に役立つことがよくあります。
Google Cloud コンソールのナビゲーション メニュー()で、[Cloud Run] を選択します。
[bookshelf] をクリックし、[ログ] タブをクリックします。
これらのログは Cloud Run 上の Bookshelf アプリケーションに固有のものです。ログを調べると、secretmanager.versions.access に対して permission denied エラーが記録されているはずです。
アプリが Cloud Shell で実行されているときは、ログイン ユーザーの認証情報が使用されます。受講者ユーザー アカウントは、Secret Manager の項目にアクセスし、Cloud Storage にファイルを書き込み、Translation API を呼び出すことができます。
一方で Cloud Run アプリケーションは、サービス アカウントを指定しない限り Compute Engine のデフォルトのサービス アカウントを使用します。このデフォルトのサービス アカウントには、上記の権限がありません。
ベストプラクティスとして、アプリケーション固有のサービス アカウントを作成して関連付け、そのサービス アカウントに適切な権限を付与します。
アプリケーションのサービス アカウントを作成するには、Cloud Shell で次のコマンドを実行します。
まだ権限は追加していません。追加する適切なロールを判断するには、IAM の基本ロールと事前定義ロールのリファレンスをご覧ください。Secret Manager のロールには、シークレットにアクセスするための最小限の権限を付与する Secret Manager のシークレット アクセサー ロールが含まれます。
必要なロールを追加するには、次のコマンドを実行します。
Secret Manager、Cloud Translation API、Firestore、Cloud Storage 用の権限を追加しました。
実行中のアプリケーションによって権限が取得されるまでに、数分ほどかかります。この遅延を回避するには、アプリを再デプロイします。
サービス アカウントとともにアプリケーションを再デプロイするには、次のコマンドを実行します。
アプリケーションを開くには、次のコマンドを実行した後にリンクをクリックします。
このときエラーが表示される場合があり、原因はサービス アカウントの権限がまだ反映されていないことです。
Cloud Run サービスの Bookshelf のログを見ると、権限がないか不十分である可能性があることを示すエラーが記録されています。権限が反映され、サービス アカウントが、必要な Google Cloud サービスを呼び出せるようになるまでの間は、アプリでエラーが発生します。
アプリが開くようになるまで、アプリケーションのタブを閉じて生成された URL をクリックする操作を繰り返します。
権限が反映されると、以前と同様の [Books] ページが表示されます。
アプリケーションで [Login] をクリックします。
ログインに失敗します。
エラー メッセージを確認すると、アクセスがブロックされたこと、アプリから無効なリクエストが送信されたこと、エラー内容がリダイレクト URI の不一致であることがわかります。このエラーの原因は、OAuth 構成が Cloud Run サービス URL 向けになっておらず、cloudshell.dev での実行用に設定されていることです。
Google Cloud コンソールでナビゲーション メニュー()から [API とサービス] > [OAuth 同意画面] を選択し、[ブランディング] を選択します。
[+ ドメインの追加] をクリックします。
Cloud Shell で、次のコマンドを実行します。
このコマンドによって、https:// のないアプリケーションの URL が構築されます。
ドメイン名をクリップボードにコピーし、[承認済みドメイン 2] に貼り付けます。
[保存] をクリックします。
ナビゲーション メニューで [クライアント] を選択します。
[OAuth 2.0 クライアント ID] で [Bookshelf] をクリックします。
[承認済みのリダイレクト URI] で [+ URI を追加] をクリックします。
リダイレクト URI を取得するには、Cloud Shell で次のコマンドを実行します。
echo コマンドで作成された URI をコピーし、[URI 2] に貼り付けます。
[保存] をクリックします。
シークレットはアプリケーションに対して 1 回だけ読み込まれるため、アプリケーションを再デプロイする必要があります。
修正を有効にするには、次のコマンドを使用してアプリを再デプロイします。
アプリケーションがデプロイされたら、次のコマンドを実行し、生成された URL をクリックします。
アプリケーションが稼働しています。
アプリケーションで [Login] をクリックし、同意してユーザーをログインさせます。
メールアドレスがリンクになりました。
メールアドレスをクリックします。
使用する言語は引き続きスペイン語です。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、アプリケーションの健全性の維持に役立つ Google Cloud Observability の機能の一部を見ていきます。
Error Reporting は、実行中のクラウド サービスで発生したエラーをまとめます。
サービス アカウントに必要なロールを追加するには、Cloud Shell で次のコマンドを実行します。
Cloud Shell のファイル エディタで ~/bookshelf/requirements.txt ファイルを開きます。
次の行を追加します。
requirements.txt ファイルは次のようになります。
ファイルを保存します。
更新された依存関係をインストールするには、次のコマンドを実行します。
ファイル エディタで、ファイル ~/bookshelf/main.py を開きます。
cloud_logging インポート ステートメントの下の行に、次のコードを追加します。
/profile エンドポイントの末尾に、次のコードを追加します。
/raiseerror エンドポイントを呼び出すとエラーがシミュレートされます。Error Reporting にエラーが送信され、エラーページにリダイレクトされます。
ファイルを保存します。
アプリケーションをビルドして再デプロイするには、次のコマンドを実行します。
アプリケーションがデプロイされたら、次のコマンドを実行し、生成された URL をクリックします。
URL の末尾に「/raiseerror」を追加して Enter キーを押します。
アプリケーションのエラー ページにリダイレクトされ、Intentionally Created Error エラーが表示されます。
URL 内の error を raiseerror に置き換えてから Enter キーを押します。
アプリケーションのエラー ページに再度リダイレクトされます。これらのエラーについては後ほど確認します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Run サービスの詳細ページには、サービスの管理に役立つダッシュボードが組み込まれています。
Google Cloud コンソールのナビゲーション メニュー()で、[Cloud Run] を選択します。
[bookshelf] をクリックします。
[指標] タブが表示されます。
[過去 1 日] をクリックしてから [過去 1 時間] を選択します。
[指標] タブには、過去 1 時間に行われたサービス呼び出しのリストと、自動的に収集された指標のグラフが表示されます。
[ログ] タブをクリックします。
このタブでは、Cloud Run サービスのすべてのログを確認できます。
Google Cloud コンソールのタイトルバーにある検索フィールドに「Logging」と入力して [検索] をクリックし、「Logging」という項目をクリックします。
表示されるページからすべてのログにアクセスできます。
[すべてのリソース] プルダウン メニューから [Cloud Run のリビジョン] を選択し、[適用] をクリックします。
Cloud Run のログすべてがここに表示されます。サービス名またはリビジョン名でフィルタできます。
[重大度] で [エラー] をクリックします。
アプリケーションで発生したエラーがここに表示されます。アプリケーションやサービスが複数ある場合、このビューでは、さまざまなエラーの発生場所を区別することが難しくなります。
Google Cloud コンソールのタイトルバーにある検索フィールドに「Error Reporting」と入力して [検索] をクリックし、「Error Reporting」という項目をクリックします。
このページではエラーがグループ化されています。多くのエラーは、Cloud Run の Python アプリケーションがクラッシュしたときに自動的に作成されたものです。手動で発生させたエラーも表示されます。
[1 時間] をクリックします。
[Intentionally Created Error] をクリックします。
類似するエラーがまとめて表示されます。エラーがグループ化されていると、問題をデバッグしやすくなります。
サンプルのいずれかで、[ログを表示] をクリックします。
Cloud Logging に戻り、このログエントリが表示されます。ログに記録された 1 つのエラーを固定し、同じ時間帯に発生したログを調べることができます。
アプリケーションをコンテナ化して Cloud Run にデプロイし、発生した問題をデバッグできました。また、サービス アカウントに必要なロールを付与し、ローカルと Cloud Run のデプロイの両方をサポートするように OAuth 構成を更新しました。さらに、アプリケーションに Error Reporting を追加し、Google Cloud Observability のアプリケーション開発機能を確認しました。
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください