サイトアイコン 協栄情報ブログ

ローカルビルドからのCloud Runデプロイハンズオン

はじめに

仕事の都合で GoogleCloudを触り始めた、GoogleCloud歴 5か月の駆け出しエンジニアです。

今回のPJで払い出されたアカウントでは、通常 Cloud Runをデプロイする際に利用するCloud Buildを利用する権限が与えられていませんでした。

そのため CloudShellでイメージをビルドして、Artifact Registryにプッシュ。プッシュされたイメージを利用して Cloud Run にデプロイできるかの検証をしてみました。

Cloud Run とは?

Googleのインフラストラクチャ上で、コンテナを直接実行できるマネージド コンピューティング プラットフォームです。
コンテナイメージをビルドできるものであれば、任意のプログラミング言語で記述されたコードを Cloud Run にデプロイすることができます。

参考:Google Cloud Cloud Run ドキュメント

Artifact Registry とは?

Artifact Registryは、「パッケージ」や「Dockerコンテナイメージ」を 1か所で保管し管理できるフルマネージドなサービスを提供します。

参考:Google Cloud Artifact Registry ドキュメント

ハンズオン

構成図

1.事前準備

1.1.Cloud Shellでの準備

必要な環境設定を行います。

# Google Cloud CLIがインストールされていることを確認
gcloud --version

# 必要なAPIを有効化
gcloud services enable artifactregistry.googleapis.com \
  run.googleapis.com

# 現在のプロジェクトIDを取得
PROJECT_ID=$(gcloud config get-value project)
echo "現在のプロジェクトID: $PROJECT_ID"

# リージョン設定
REGION="asia-northeast1"
echo "使用するリージョン: $REGION"

1.2.Artifact Registryリポジトリの作成

コンテナイメージを保存するためのリポジトリを作成します。

# リポジトリ名を設定
REPO_NAME="${リポジトリ名}"

# リポジトリを作成
gcloud artifacts repositories create $REPO_NAME \
    --repository-format=docker \
    --location=$REGION \
    --description="Cloud Run用のDockerイメージ"

1.3.Artifact Registryでの確認

リポジトリが作成されていることを確認する。

2.アプリケーション作成

シンプルなFlaskアプリケーションを作成します。以下のファイル構成でディレクトリを作成します。

2.1.フォルダ構成

my-app/
├── app.py
├── requirements.txt
└── Dockerfile

2.2.app.py

2.2.1.「app.py」のなかみ

Hello Worldだけを返すシンプルなアプリ

import os
from flask import Flask

app = Flask(__name__)

# '/'の際、"Hello World"を返す
@app.route('/')
def hello():
    return "Hello World"

# 開発環境での実行の場合
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

2.3.requirements.txt

2.3.1.ライブラリ内容
項番 記載名 主な内容
1 flask 軽量なWebフレームワーク
2 werkzeug FlaskのコアとなるWSGI(Web Server Gateway Interface)のユーティリティライブラリ
3 gunicorn "Green Unicorn"の略で、本番環境向けのPython WSGIサーバー
2.3.2.「requirements.txt」のなかみ
flask==2.0.1
werkzeug==2.0.2
gunicorn==20.1.0

3.Dockerfile

3.2.1.Dockerfile内容

項番 記載名 設定値 詳細
1 FROM python:3.9-slim ベースイメージ:Python 3.9のslimバージョン
2 WORKDIR /app コンテナ内作業ディレクトリ
3 COPY requirements.txt ./ コンテナのディレクトリにrequirements.txtコピー
4 Run pip install –no-cache-dir -r requirements.txt コンテナ内でPipを利用
5 COPY . ./ コンテナのディレクトリに全ファイルをコピー
6 ENV PORT=8080 環境変数設定
7 CMD exec gunicorn –bind 0.0.0.0:${PORT} –workers 1 –threads 8 app:app コンテナが起動したときに実行されるデフォルトコマンド
3.2.1.1.CMD詳細
項番 記載名 詳細
1 exec gunicorn Gunicornを起動
2 –bind 0.0.0.0:${PORT} ‘ENV’で指定したポートをリッスン
3 –workers 1 –threads 8 1つのワーカプロセスと8つのスレッドを使用
4 app:app 「app.pyファイル内のapp変数を使用せよ」という指示

3.2.2.「Dockerfile」のなかみ

# ベースイメージ
FROM python:3.9-slim

# コンテナでの作業フォルダ
WORKDIR /app

# コンテナへ「requirements.txt」コピー
COPY requirements.txt ./

# pipコマンド実行
RUN pip install --no-cache-dir -r requirements.txt

# コンテナへファイルコピー
COPY . ./

# 環境変数(ポート)設定
ENV PORT=8080

# コンテナ起動後実行コマンド
CMD echo "Starting server on port ${PORT}" && exec gunicorn --bind 0.0.0.0:${PORT} --workers 1 --threads 8 app:app

4.Dockerイメージのビルドとプッシュ

作成したアプリケーションをコンテナ化し、Artifact Registryにプッシュします。

# アプリディレクトリに移動
cd my-app

# Google Cloud認証の設定
gcloud auth configure-docker ${REGION}-docker.pkg.dev

# イメージ名を設定
IMAGE_NAME="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/my-app:v1"

# イメージをビルド
docker build -t ${IMAGE_NAME} .

# イメージをArtifact Registryにプッシュ
docker push ${IMAGE_NAME}

5.Cloud Runへのデプロイ

ビルドしたイメージを使用してCloud Runにデプロイします。

※ PoCのため「認証なしで誰でもアクセス可能」な設定です。こちらの設定でデプロイする場合、セキュリティの観点より構築確認後速やかに削除ください。

# サービス名を設定()
SERVICE_NAME="${Cloud Run名称}"

# デプロイ実行
gcloud run deploy ${SERVICE_NAME} \
    --project=${PROJECT_ID} \
    --region=${REGION} \
    --image=${IMAGE_NAME} \
    --platform=managed \
    --allow-unauthenticated

6.画面での確認

6.1.コマンドラインでの構築完了後の画面

以下、赤枠部分にURLが表示され、そちらからWEB画面を確認できる。

6.2.WEB画面での見え方

7.片づけ

7.1.リソース削除コマンド

gcloud run services delete ${SERVICE_NAME} \
--region=${REGION} \
--project=${PROJECT_ID}

おわりに

得られた知見

モバイルバージョンを終了