この Codelab について
1. 概要
初めてウェブ アプリケーションをデプロイするのは大変なことのように思えるかもしれませんが、最初のデプロイ後も、プロセスが負担が大きすぎる場合は、アプリケーションの新しいバージョンをデプロイしない可能性があります。継続的デプロイを使用すると、アプリケーションの変更を簡単に自動的にデプロイできます。
このラボでは、ウェブ アプリケーションを作成し、アプリケーションのソースコードが変更されたときにアプリケーションを自動的にデプロイするように Cloud Run を構成します。その後、アプリケーションを変更して再デプロイします。
学習内容
- Cloud Shell エディタでウェブ アプリケーションを作成する
- アプリケーション コードを GitHub に保存する
- アプリケーションを Cloud Run に自動的にデプロイする
- Vertex AI を使用して生成 AI をアプリケーションに追加する
2. 前提条件
- Google アカウントをお持ちでない場合は、Google アカウントを作成する必要があります。
- 仕事用または学校用のアカウントではなく、個人アカウントを使用している。職場用アカウントや学校用アカウントには、このラボに必要な API を有効にできない制限が適用されている場合があります。
- GitHub アカウントがまだない場合は、GitHub アカウントを作成する必要があります。
- 既存の GitHub アカウントがある場合は、そのアカウントを使用します。GitHub では、新しいアカウントがスパムとしてブロックされる可能性が高くなります。
- アカウントがスパムと見なされる可能性を減らすため、GitHub アカウントで 2 要素認証を設定します。
3. プロジェクトの設定
- Google Cloud コンソールにログインします。
- Cloud コンソールで課金を有効にする。
- このラボを完了しても、Cloud リソースの費用は 1 米ドル未満です。
- このラボの最後にある手順に沿ってリソースを削除すると、それ以上の請求が発生しなくなります。
- 新規ユーザーは、300 米ドル分の無料トライアルをご利用いただけます。
- 生成 AI for Devs イベントに参加する予定ですか?1 米ドル分のクレジットが提供される場合があります。
- 新しいプロジェクトを作成するか、既存のプロジェクトを再利用するかを選択します。
- Cloud 課金システムの [マイ プロジェクト] で、課金が有効になっていることを確認します。
- 新しいプロジェクトの
Billing account
列にBilling is disabled
と表示されている場合:- [
Actions
] 列のその他アイコンをクリックします。 - [お支払い情報を変更] をクリックします。
- 使用する請求先アカウントを選択します。
- [
- Gen AI for Devs イベントに参加している場合、アカウントの名前は Google Cloud Platform Trial Billing Account になる可能性があります。
- 新しいプロジェクトの
4. Cloud Shell エディタを開く
- Cloud Shell エディタに移動します。
- ターミナルが画面の下部に表示されない場合は、開きます。
- ハンバーガー メニュー
をクリックします。
- [Terminal] をクリックします。
- [New Terminal] をクリックします。
- ハンバーガー メニュー
- ターミナルで、次のコマンドを使用してプロジェクトを設定します。
- 形式:
gcloud config set project [PROJECT_ID]
- 例:
gcloud config set project lab-project-id-example
- プロジェクト ID がわからない場合:
- すべてのプロジェクト ID を一覧表示するには、次のコマンドを使用します。
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- すべてのプロジェクト ID を一覧表示するには、次のコマンドを使用します。
- 形式:
- 承認を求められたら、[承認] をクリックして続行します。
- 次のようなメッセージが表示されます。
Updated property [core/project].
WARNING
が表示され、Do you want to continue (Y/N)?
を求められた場合は、プロジェクト ID が正しく入力されていない可能性があります。N
キー、Enter
キーを押して、gcloud config set project
コマンドをもう一度実行してみてください。
5. API を有効にする
ターミナルで、API を有効にします。
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com
このコマンドが完了するまで数分かかる場合がありますが、最終的には次のような成功メッセージが表示されます。
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. Git を構成
- グローバル git ユーザーのメールアドレスを設定します。
git config --global user.email "you@example.com"
- グローバル Git ユーザー名を設定します。
git config --global user.name "Your Name"
- グローバル git のデフォルト ブランチを
main
に設定します。git config --global init.defaultBranch main
7. コードを記述する
Node.js でアプリケーションを作成するには:
- ホーム ディレクトリに移動します。
cd ~
- 新しい
codelab-genai
Angular アプリケーションを作成します。npx @angular/cli new codelab-genai \
--minimal \
--inline-template \
--inline-style \
--ssr \
--defaults @angular/cli
のインストールを求めるメッセージが表示されたら、Enter
を押して続行します。Need to install the following packages: @angular/cli@18.2.4 Ok to proceed? (y)
codelab-genai
ディレクトリに移動します。cd codelab-genai
- Cloud Shell エディタで
app.component.ts
ファイルを開きます。 画面上部に空のファイルが表示されます。このcloudshell edit src/app/app.component.ts
app.component.ts
ファイルを編集できます。 - 次のコードをコピーして、開いた
app.component.ts
ファイルに貼り付けます。 数秒後、Cloud Shell エディタによってコードが自動的に保存されます。このコードは、http リクエストに「Hello world!」という応答メッセージで応答します。import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet],
template: `
<h1>Hello world!</h1>
<router-outlet />
`,
styles: [],
})
export class AppComponent { }
アプリケーションの初期コードが完成し、バージョン管理に保存できるようになりました。
8. リポジトリを作成する
- 画面の下部にある Cloud Shell ターミナルに戻ります。
- 正しいディレクトリにいることを確認します。
cd ~/codelab-genai
- Git リポジトリを初期化する
git init -b main
- GitHub CLI にログインする
gh auth login
Enter
キーを押してデフォルト オプションを受け入れ、GitHub CLI ツールの手順に沿って操作します。手順は次のとおりです。- ログインするアカウントを選択してください。
GitHub.com
- このホストでの Git オペレーションに使用するプロトコルは何ですか。
HTTPS
- GitHub 認証情報を使用して Git を認証しますか?
Y
(この項目が表示されない場合はスキップします)。 - GitHub CLI の認証方法を選択してください。
Login with a web browser
- ワンタイム コードをコピーする
- https://github.com/login/device を開きます。
- 1 回限りのコード
- [GitHub を承認] をクリックします。
- ログインを完了してください
- ログインするアカウントを選択してください。
- ログインしていることを確認します。
ログインに成功すると、GitHub のユーザー名が出力されます。gh api user -q ".login"
GITHUB_USERNAME
変数を作成するGITHUB_USERNAME=$(gh api user -q ".login")
- 環境変数が作成されたことを確認します。
変数が正常に作成されていれば、GitHub ユーザー名が出力されます。echo ${GITHUB_USERNAME}
codelab-genai
という名前の空の GitHub リポジトリを作成します。 次のエラーが表示される場合:gh repo create codelab-genai --private
GraphQL: Name already exists on this account (createRepository)
codelab-genai
という名前のリポジトリがすでに存在します。このチュートリアルを続行するには、次の 2 つの方法があります。- 既存の GitHub リポジトリを削除する
- 別の名前のリポジトリを作成し、次のコマンドで名前を変更してください。
codelab-genai
リポジトリをリモートorigin
として追加します。git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
9. コードを共有する
- 正しいディレクトリにいることを確認します。
cd ~/codelab-genai
- 現在のディレクトリ内のすべてのファイルをこの commit に追加します。
git add .
- 最初の commit を作成します。
git commit -m "add http server"
- commit を
origin
リポジトリのmain
ブランチに push します。git push -u origin main
このコマンドを実行して、生成された URL にアクセスすると、GitHub でアプリケーション コードを確認できます。
echo -e "\n\nTo see your code, visit this URL:\n \
https://github.com/${GITHUB_USERNAME}/codelab-genai/blob/main/src/app/app.component.ts \n\n"
10. 自動デプロイを設定する
- Cloud Shell エディタのタブを開いたままにします。このタブについては後で説明します。
- 新しいタブで Cloud Run ページにアクセスします。
- コンソールで正しい Google Cloud プロジェクトを選択
- [CONNECT REPO] をクリックします。
- [Cloud Build の設定] をクリックします。
- [リポジトリ プロバイダ] で [GitHub] を選択します。
- ブラウザで GitHub アカウントにログインしていない場合は、認証情報を使用してログインします。
- [認証]、[続行] の順にクリックします。
- ログインすると、Cloud Run ページに「GitHub アプリは、どのリポジトリにもインストールされていません。」というメッセージが表示されます。
- [INSTALL GOOGLE CLOUD BUILD] ボタンをクリックします。
- [インストールの設定] ページで [Only select repositories] を選択し、CLI で作成した codelab-genai リポジトリを選択します。
- [インストール] をクリックします。
- 注: GitHub リポジトリが多い場合は、読み込みに数分かかることがあります。
- [リポジトリ] として
your-user-name/codelab-genai
を選択します。- リポジトリがない場合は、[接続されたリポジトリを管理します] リンクをクリックします。
- [ブランチ] は
^main$
のままにします。 - [Go、Node.js、Python、Java、.NET Core、Ruby、PHP(Google Cloud の Buildpack を使用)] をクリックします。
- 他のフィールド(
Build context directory
、Entrypoint
、Function target
)はそのままにします。
- 他のフィールド(
- [保存] をクリックします。
- [リポジトリ プロバイダ] で [GitHub] を選択します。
- [認証] までスクロールします。
- [未認証の呼び出しを許可する] をクリックします。
- [作成] をクリックします。
ビルドが完了したら(数分かかることがあります)、次のコマンドを実行し、生成された URL にアクセスして、実行中のアプリケーションを表示します。
echo -e "\n\nOnce the build finishes, visit your live application:\n \
"$( \
gcloud run services list | \
grep codelab-genai | \
awk '/URL/{print $2}' | \
head -1 \
)" \n\n"
11. コードを変更する
Cloud Shell エディタに戻る
Cloud Shell エディタがまだ開いている場合は、これらの手順をスキップできます。
- Cloud Shell エディタに移動します。
- ターミナルが画面の下部に表示されない場合は、開きます。
- ハンバーガー メニュー
をクリックします。
- [Terminal] をクリックします。
- [New Terminal] をクリックします。
- ハンバーガー メニュー
- ターミナルで、次のコマンドを使用してプロジェクトを設定します。
- 形式:
gcloud config set project [PROJECT_ID]
- 例:
gcloud config set project lab-project-id-example
- プロジェクト ID がわからない場合:
- すべてのプロジェクト ID を一覧表示するには、次のコマンドを使用します。
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- すべてのプロジェクト ID を一覧表示するには、次のコマンドを使用します。
- 形式:
- 承認を求められたら、[承認] をクリックして続行します。
- 次のようなメッセージが表示されます。
Updated property [core/project].
WARNING
が表示され、Do you want to continue (Y/N)?
を求められた場合は、プロジェクト ID が正しく入力されていない可能性があります。N
キー、Enter
キーを押して、gcloud config set project
コマンドをもう一度実行してみてください。
Vertex AI をアプリケーションに追加する
- 画面の下部にある Cloud Shell ターミナルに戻ります。
- 正しいディレクトリにいることを確認します。
cd ~/codelab-genai
- Node.js Vertex AI SDK をインストールします。
npm install @google-cloud/vertexai
- Node.js Google Auth SDK をインストールします。
npm install google-auth-library
- Cloud Shell エディタで
server.ts
を再度開きます。cloudshell edit server.ts
server.ts
ファイル内のコードを次のコードに置き換えます。// server.ts
import { APP_BASE_HREF } from '@angular/common';
import { CommonEngine } from '@angular/ssr';
import express from 'express';
import { fileURLToPath } from 'node:url';
import { dirname, join, resolve } from 'node:path';
import bootstrap from './src/main.server';
import { VertexAI } from '@google-cloud/vertexai';
import { GoogleAuth } from 'google-auth-library';
// The Express app is exported so that it can be used by serverless Functions.
export function app(): express.Express {
const server = express();
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
const browserDistFolder = resolve(serverDistFolder, '../browser');
const indexHtml = join(serverDistFolder, 'index.server.html');
const commonEngine = new CommonEngine();
const auth = new GoogleAuth();
server.set('view engine', 'html');
server.set('views', browserDistFolder);
// Example Express Rest API endpoints
server.get('/api/facts', async (req, res) => {
const project = await auth.getProjectId();
const vertex = new VertexAI({ project: project });
const generativeModel = vertex.getGenerativeModel({
model: 'gemini-1.5-flash',
generationConfig: { responseMimeType: 'application/json' }
});
const animal = req.query['animal'] || 'dog';
const prompt = `Give me 10 fun facts about ${animal}.
Return as json as an array in the format ['fact 1', 'fact 2']
Remove backticks and other markdown formatting.`;
const resp = await generativeModel.generateContent(prompt);
let factArray = '';
if (resp.response.candidates) {
factArray = JSON.parse(resp.response.candidates[0].content.parts[0].text || '');
}
res.send(factArray);
});
// Serve static files from /browser
server.get('**', express.static(browserDistFolder, {
maxAge: '1y',
index: 'index.html',
}));
// All regular routes use the Angular engine
server.get('**', (req, res, next) => {
const { protocol, originalUrl, baseUrl, headers } = req;
commonEngine
.render({
bootstrap,
documentFilePath: indexHtml,
url: `${protocol}://${headers.host}${originalUrl}`,
publicPath: browserDistFolder,
providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
})
.then((html) => res.send(html))
.catch((err) => next(err));
});
return server;
}
function run(): void {
const port = process.env['PORT'] || 4000;
// Start up the Node server
const server = app();
server.listen(port, () => {
console.log(`Node Express server listening on http://localhost:${port}`);
});
}
run();- Cloud Shell エディタで
app.component.ts
を開きます。cloudshell edit src/app/app.component.ts
app.components.ts
ファイル内のコードを次のコードに置き換えます。// app.component.ts
import { Component, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { RouterOutlet } from '@angular/router';
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet, FormsModule],
template: `
<section>
<input
type="text"
placeholder="dog"
[(ngModel)]="animal"
class="text-black border-2 p-2 m-2 rounded"
/>
<button
(click)="getNewFunFacts()"
>
Get New Fun Facts
</button>
<ol>
@for(fact of facts(); track fact) {
<li>{{fact}}</li>
} @empty {
<li>No facts are available</li>
}
</ol>
</section>
`,
styles: '',
})
export class AppComponent {
animal = '';
facts = signal<string[]>([]);
getNewFunFacts() {
fetch(`/api/facts?animal=${this.animal}`).then(response => response.json()).then(facts => {
this.facts.set(facts);
});
}
}
12. 再デプロイ
- Cloud Shell で、まだ正しいディレクトリにいることを確認します。
cd ~/codelab-genai
- 次のコマンドを実行して、新しいバージョンのアプリケーションをローカルの git リポジトリに commit します。
git add .
git commit -m "add latest changes" - 変更を GitHub に push します。
git push
- ビルドが完了したら、次のコマンドを実行して、デプロイされたアプリケーションにアクセスします。
echo -e "\n\nOnce the build finishes, visit your live application:\n \
"$( \
gcloud run services list | \
grep codelab-genai | \
awk '/URL/{print $2}' | \
head -1 \
)" \n\n"
ビルドが完了して変更が反映されるまでに数分かかることがあります。
すべてのリビジョンの履歴は、https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions で確認できます。
13. (省略可)Vertex AI の使用状況を監査する
他の Google Cloud サービスと同様に、Vertex AI オペレーションを監査できます。監査ログは「誰が、いつ、どこで何をしたか」の確認に役立ちます。Vertex AI の管理監査ログはデフォルトで有効になっています。コンテンツを生成するためのリクエストを監査するには、データアクセス監査ログを有効にする必要があります。
- Google Cloud コンソールで、[監査ログ] ページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [IAM と管理] である結果を選択します。 - Cloud Run アプリケーションを作成する既存の Google Cloud プロジェクトであることを確認します。
- [データアクセス監査ログの構成] テーブルで、[サービス] 列から
Vertex AI API
を選択します。 - [ログタイプ] タブで、データアクセス監査ログの種類
Admin read
とData read
を選択します。 - [保存] をクリックします。
有効にすると、アプリケーションの呼び出しごとに監査ログを確認できます。呼び出しの詳細を含む監査ログを表示する手順は次のとおりです。
- デプロイされたアプリケーションに戻り、ページを更新してログをトリガーします。
- Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
- クエリ ウィンドウで、次のように入力します。
LOG_ID("cloudaudit.googleapis.com%2Fdata_access")
protoPayload.serviceName="aiplatform.googleapis.com" - [クエリを実行] をクリックします。
監査ログには Vertex AI API の使用状況がキャプチャされますが、プロンプトやレスポンスの詳細など、ワークロード関連のデータは確認できません。
14. (省略可)AI ワークロードのオブザーバビリティを向上させる
監査ログには、ワークロード関連の情報はキャプチャされません。ワークロードのオブザーバビリティを高めるには、この情報を明示的にロギングする必要があります。任意のロギング フレームワークを使用してこれを行うことができます。次の手順では、ネイティブの Node.js ロギング メカニズムを使用してこれを行う方法を示します。
- Cloud Shell エディタで
server.ts
を再度開きます。cloudshell edit ~/codelab-genai/server.ts
await generativeModel.generateContent(prompt)
の呼び出し(行 19)の後に、次の行を追加します。 このコードは、生成されたコンテンツに関する情報を 構造化ロギング形式でconsole.log(JSON.stringify({
severity: 'DEBUG',
message: 'Content is generated',
prompt: prompt,
response: resp.response,
}));stdout
に書き込みます。Cloud Run の Logging エージェントは、stdout
に出力された出力をキャプチャし、この形式を Cloud Logging に書き込みます。- Cloud Shell を再び開き、次のコマンドを入力して、正しいディレクトリにいることを確認します。
cd ~/codelab-genai
- 変更を commit します。
git commit -am "observe generated content"
- 変更を GitHub に push して、変更されたバージョンの再デプロイをトリガーします。
git push
新しいバージョンがデプロイされると、Vertex AI への呼び出しに関するデバッグ情報を確認できます。
アプリケーション ログを表示する手順は次のとおりです。
- Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
- クエリ ウィンドウで、次のように入力します。
LOG_ID("run.googleapis.com%2Fstdout")
severity=DEBUG - [クエリを実行] をクリックします。
クエリの結果には、安全対策のモニタリングに使用できる「安全性評価」を含むプロンプトと Vertex AI レスポンスを含むログが表示されます。
15. (省略可)クリーンアップ
サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Artifact Registry に保存すると課金される場合があります。Cloud プロジェクトを削除して、料金が発生しないようにすることができます。Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
必要に応じて、プロジェクトを削除します。
gcloud projects delete $GOOGLE_CLOUD_PROJECT
cloudshell ディスクから不要なリソースを削除することもできます。次のことが可能です。
- Codelab プロジェクト ディレクトリを削除します。
rm -rf ~/codelab-genai
- 警告: この操作は元に戻せません。Cloud Shell 上のすべてのファイルを削除して空き容量を確保する場合は、ホーム ディレクトリ全体を削除します。残しておきたいものはすべて別の場所に保存してください。
sudo rm -rf $HOME
16. 完了
このラボでは、ウェブ アプリケーションを作成し、アプリケーションのソースコードが変更されたときにアプリケーションを自動的にデプロイするように Cloud Run を構成しました。その後、アプリケーションを変更して再デプロイしました。
このラボが気に入ったら、別のコーディング言語またはフレームワークでもう一度試してみてください。
本日ご利用いただいたプロダクトの改善に役立つユーザー エクスペリエンス(UX)調査にご協力いただける場合は、こちらからご登録ください。
学習を継続するためのオプションは次のとおりです。
- ドキュメント: Firebase GenKit を柔軟なモデル抽象化として使用すると、任意のモデル API を簡単に統合し、コミュニティが管理するモデルを使用できます。
- Codelab: Gemini を搭載したチャットアプリを Cloud Run にデプロイする方法
- Cloud Run で Gemini 関数呼び出しを使用する方法
- Cloud Run Jobs Video Intelligence API を使用して動画をシーンごとに処理する方法
- オンデマンド ワークショップ: Google Kubernetes Engine オンボーディング