🐇

Google Cloud Run 入門: Hello, world!

2024/09/29に公開

この記事では、Google の強力なサーバーレスプラットフォーム Cloud Run を使って、Node.js アプリケーションをデプロイする方法を詳しくご紹介します。

公式サンプル:GoogleCloudPlatform/nodejs-docs-samples/run/helloworld をベースに進めていきます。

Cloud Run とは

Cloud Run は、Google Cloud が提供するフルマネージドなコンテナ実行環境です。スケーラビリティやインフラ管理を意識せずに、コンテナ化されたアプリケーションを簡単にデプロイできます。

プロジェクトの概要

このハンズオンでは、シンプルな "Hello World" アプリケーションをデプロイします。主な特徴は以下のとおりです:

  • フレームワーク:Express.js
  • 機能:環境変数から名前を取得し、挨拶メッセージを表示
  • 目的:Cloud Run へのデプロイを通じて、基本的なワークフローを理解

コードの詳細解説

index.js

import express from 'express';
const app = express();

app.get('/', (req, res) => {
  const name = process.env.NAME || 'World';
  res.send(`Hello ${name}!`);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
  console.log(`helloworld: listening on port ${port}`);
});

export default app;

💡 解説

  1. モジュールのインポートとアプリケーションの作成

    • express モジュールをインポートし、アプリケーションインスタンスを作成します。
  2. ルートパスへの GET リクエストの処理

    • '/' パスに対する GET リクエストを受け取り、環境変数 NAME から名前を取得します。
    • NAME が未設定の場合、デフォルトで 'World' を使用します。
    • レスポンスとして、Hello ${name}! を返します。
  3. サーバーの起動

    • 環境変数 PORT からポート番号を取得します(デフォルトは 8080)。
    • 指定したポートでサーバーをリッスンし、起動時にコンソールにメッセージを表示します。

Dockerfile の詳細解説

FROM node:20-slim

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --omit=dev

COPY . ./

CMD [ "node", "index.js" ]

💡 解説

  1. ベースイメージの指定

    • node:20-slim イメージを使用し、軽量な環境を構築します。
  2. 作業ディレクトリの設定

    • /usr/src/app を作業ディレクトリに設定します。
  3. 依存関係のインストール

    • package.jsonpackage-lock.json をコピーし、本番環境用の依存関係をインストールします。
  4. アプリケーションコードのコピー

    • 残りのアプリケーションファイルを作業ディレクトリにコピーします。
  5. コンテナ起動コマンドの設定

    • node index.js を実行し、アプリケーションを起動します。

サンプルプロジェクトのダウンロードとローカルでの実行

まずは、公式リポジトリからサンプルコードをクローンし、ローカル環境でアプリケーションを試してみましょう。

1. リポジトリのクローン

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd nodejs-docs-samples/run/helloworld

2. 依存関係のインストール

npm install
  • package.json に定義されている依存関係がインストールされます。

3. アプリケーションの起動

npm run start
  • サーバーが起動し、デフォルトでポート 8080 をリッスンします。
  • ターミナルには以下のようなメッセージが表示されます:
helloworld: listening on port 8080

4. アプリケーションの動作確認

  • ブラウザで http://localhost:8080 にアクセスします。
  • 以下のようにメッセージが表示されれば成功です:

5. 環境変数を使ったカスタマイズ

  • 環境変数 NAME を設定して、挨拶メッセージを変更してみましょう。

方法 1: コマンドラインで環境変数を設定

NAME=YourName npm run start
  • もう一度 http://localhost:8080 にアクセスすると、以下のように変更されます。

方法 2: .env ファイルを使用

  • プロジェクトのルートディレクトリに .env ファイルを作成し、以下の内容を追加します:

    NAME=YourName
    
  • npm run start を再度実行すると、環境変数が適用されます。

6. アプリケーションの終了

  • サーバーを停止するには、ターミナルで Ctrl + C を押します。

デプロイ手順

以下の手順で Cloud Run にアプリケーションをデプロイします。

1. Google Cloud プロジェクトの設定

gcloud config set project YOUR_PROJECT_ID
  • YOUR_PROJECT_ID を自身のプロジェクト ID に置き換えてください。

2. 必要な API の有効化

gcloud services enable run.googleapis.com
gcloud services enable cloudbuild.googleapis.com

3. コンテナイメージのビルドとプッシュ

gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/helloworld
  • このコマンドは、Cloud Build を使用してコンテナイメージをビルドし、Container Registry にプッシュします。

4. Cloud Run へのデプロイ

gcloud run deploy helloworld \
  --image gcr.io/YOUR_PROJECT_ID/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated
  • デプロイ時に以下の設定を行います:
    • サービス名:helloworld
    • --image:先ほどビルドしたコンテナイメージ
    • --platform:マネージド
    • --region:us-central1(必要に応じて変更可能)
    • --allow-unauthenticated:未認証アクセスを許可

5. デプロイの確認

  • デプロイが完了すると、サービスの URL が表示されます。
  • ブラウザでその URL にアクセスし、Hello World! と表示されれば成功です。

デプロイ用シェルスクリプトの追加

デプロイ作業を簡略化するために、Cloud Run へのデプロイを自動化するシェルスクリプト deploy.sh を作成します。このスクリプトを使用することで、毎回長いコマンドを入力する手間を省くことができます。

1. deploy.sh スクリプトの作成

プロジェクトのルートディレクトリに deploy.sh ファイルを作成し、以下の内容を追加します:

#!/bin/bash

# デプロイ用の変数を設定
export SERVICE_NAME=helloworld
export REGION=us-central1
export PROJECT_ID=$(gcloud config get-value project)
export CONTAINER_IMAGE=gcr.io/${PROJECT_ID}/${SERVICE_NAME}

# コンテナイメージのビルドとプッシュ
gcloud builds submit --tag $CONTAINER_IMAGE

# Cloud Run サービスへのデプロイ
gcloud run deploy $SERVICE_NAME \
  --image $CONTAINER_IMAGE \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated

💡 解説

  • 環境変数の設定
    • SERVICE_NAME:デプロイするサービスの名前を指定します。
    • REGION:デプロイ先のリージョンを指定します。
    • PROJECT_ID:現在の GCP プロジェクト ID を取得します。
    • CONTAINER_IMAGE:コンテナイメージのパスを指定します。
  • コンテナイメージのビルドとプッシュ
    • gcloud builds submit コマンドを使用して、コンテナイメージをビルドし、Google Container Registry にプッシュします。
  • Cloud Run サービスへのデプロイ
    • gcloud run deploy コマンドで、Cloud Run にサービスをデプロイします。

2. スクリプトの実行権限を設定

シェルスクリプトを実行可能にするため、実行権限を付与します。

chmod +x deploy.sh

3. デプロイ用スクリプトの実行

ターミナルからスクリプトを実行して、Cloud Run にデプロイします。

./deploy.sh

4. デプロイの確認

  • スクリプトの実行が完了すると、Cloud Run サービスの URL が表示されます。
  • ブラウザでその URL にアクセスし、アプリケーションが正しく動作していることを確認します。

5. 注意点

  • gcloud コマンドの設定
    • 事前に gcloud CLI をインストールし、認証とプロジェクトの設定を行っておいてください。
  • デフォルトリージョンの変更
    • REGION を変更することで、デプロイ先のリージョンを指定できます。
  • 環境変数のカスタマイズ
    • NAME 環境変数を設定したい場合は、スクリプト内の gcloud run deploy コマンドに --set-env-vars NAME=YourName を追加できます。

カスタマイズ

環境変数の設定

NAME 環境変数を設定することで、挨拶メッセージを変更できます。

gcloud run deploy helloworld \
  --image gcr.io/YOUR_PROJECT_ID/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated \
  --set-env-vars NAME=YourName
  • これにより、Hello YourName! と表示されます。

トラブルシューティング

よくあるエラーと対処法

  1. API が有効化されていない

    • エラーメッセージAPI [run.googleapis.com] not enabled on project

    • 対処法:以下のコマンドで API を有効化します。

      gcloud services enable run.googleapis.com
      
  2. 認証エラー

    • エラーメッセージPERMISSION_DENIED
    • 対処法:適切な権限があるか確認し、gcloud auth login で再ログインします。
  3. イメージのビルド失敗

    • エラーメッセージBuild failed; check logs
    • 対処法:Cloud Build のログを確認し、Dockerfile や依存関係に問題がないかチェックします。

まとめ

お疲れさまでした!このハンズオンでは、以下のポイントを学びました。

  • Cloud Run の基本的な使い方
  • Node.js アプリケーションのローカルでの実行
  • アプリケーションのコンテナ化とデプロイ
  • 環境変数やリソース設定によるカスタマイズ
  • トラブルシューティングの方法

Cloud Run を使うことで、インフラストラクチャの管理を気にせず、コードに集中できます。ぜひ、より複雑なアプリケーションやマイクロサービスアーキテクチャにも挑戦してみてください。

次回は、Cloud Run と他の GCP サービスとの連携について深掘りします。お楽しみに!

参考資料

Discussion