📖

ローカルのアプリをCloud Runにデプロイする方法

2023/05/30に公開

この記事について

この記事では、ローカルで開発しているアプリを※Cloud Runにデプロイする方法を解説します。
デプロイする前にアプリをdockerを用いてコンテナ化してからデプロイします。
Cloud Runとはコンテナ化しているアプリを直接実行できる。コンピューティングサービスです。

前提

この記事では以下を前提としています。

  • Docker Desktopがインストール済み
  • APIまたは簡易アプリがローカルに存在

もしDocker Desktopが未インストールの場合はこちらからインストールしてください。
Docker Desktop

目次

  • Dockerfileの作成
  • コンテナ構築・動作確認
  • コンテナ構築・Container RegistoryにPUSH
  • Cloud Runの構築
  • まとめ

ローカルプロジェクト構成

ローカル環境に以下の構成のプロジェクトフォルダがある想定とします。

.
├── Dockerfile
├── app
│   │
│   └── main.py
├── poetry.lock
└── pyproject.toml

モジュール管理にpoetryではなくpipを使っている場合は以下の構成を想定します。

.
├── Dockerfile
├── app
│   │
│   └── main.py
├── requirements.txt

また、main.pyのコードは以下です。

from fastapi import FastAPI


app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

GETリクエストに対して,Hello Worldとレスポンスを返すだけの単純なAPIです。

Dockerfileの作成

まず、最終的なDockerfileの設定値を示します。
モジュールをpoetryで管理している場合とpipで管理している場合を示します。

Poetryの場合

#dockerイメージを指定。
FROM python:3.8-slim
#パッケージのアップデート&curlをダウンロード
RUN apt-get update && apt-get -y install curl
#環境変数を設定。
ENV PATH /root/.local/bin/:$PATH
#poetry(pythonのパッケージ管理ツール)をダウンロード。
RUN curl -sSL https://install.python-poetry.org | python3 -
#コンテナ内での作業ディレクトリを指定。
WORKDIR root

#コンテナ内にディレクトリを作成。
RUN mkdir app
#ロ-カルファイルをコンテナ内のroot配下にコピー。
COPY pyproject.toml poetry.lock ./
COPY app/main.py app/

#poetryの仮想化を無効か。
RUN poetry config virtualenvs.create false
#pyproject.tomlで設定されているパッケージをインストール。
RUN poetry install --only main
#コンテナ起動時に実行するコマンドを指定。
ENTRYPOINT ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]

PIPの場合

#dockerイメージを指定。
FROM python:3.8-slim
RUN apt-get -y update && apt-get -y upgrade
#コンテナ内での作業ディレクトリを指定。
WORKDIR root


RUN mkdir app
#main.pyを/root/appに以下にコピー。
COPY app/main.py app/
#requirements.txtをコンテナ内のroot配下にコピー。
COPY requirements.txt requirements.txt
# コンテナ起動時にモジュールをインストール。
RUN pip install -r requirements.txt
#コンテナ起動時に実行するコマンドを指定。
ENTRYPOINT ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]

それぞれ設定値の意味を解説します。

FROM

Docker hubからダウンロードするベースイメージを指定しています。
ここでは軽量のpython3.8の実行環境を指定しています。

RUN

コンテナ構築時に実行するコマンドを指定します。

ENV

コンテナの環境変数を指定します。
ここでは、poetryのダウンロード先である/root/.local/bin/を環境変数PATHに指定しています。

WORKDIR

コンテナ内での作業ディレクトリを指定します。
コンテナに接続した時にカレントディレクトリとなるディレクトリを指定しています。

COPY

ローカルファイルをコンテナの指定したディレクトリにコピーします。
Dockerfileのあるパスから相対ディレクトリでファイルを指定します。

ENTRYPOINT

コンテナ起動時にデフォルトで実行するコマンド指定します。
具体的にはdocker run <イメージID> でコンテナを起動した際に実行されるコマンドです。
別のコマンドを実行したい場合はdocker run <イメージID> <コマンド> で上書き出来ます。
似たような設定値にCMDもありますが、これでコマンドを指定する場合はコマンドを上書きできません。

コンテナ構築・Container RegistoryにPUSH

作成したDockerfileからコンテナを構築してContainer RegistoryにPUSHします。
まず、Dockerfileからコンテナイメージを作成します。
Dockerfileが配置してあるディレクトリで以下のコマンドを実行します。

docker build . -t app

-tでコンテナイメージにタグ付けをします。

Container Registoryにpushする為にイメージにタグ付けをします。

docker tag app gcr.io/[GCPプロジェクト名]/[GCP内でのイメージ名]

Container Registoryにpushします。

docker push gcr.io/[GCPプロジェクト名]/[GCP内でのイメージ名]

正常に実行完了したらContainer Registoryの管理画面からPUSHしたコンテナイメージが表示されます。
ここでは[GCP内でのイメージ名]はappにしています。

Cloud Runの構築

続いてGCP上でCloud Runを構築していきます。
以下のURLに入りコンソールへ移動をクリックします。

Cloud Runの管理画面からサービスの作成をクリックします。

コンテナイメージのURL->選択->Conainer Registoryのコンテナイメージの作成画面まで遷移します。
タグ付けをしたdockerイメージをクリックして、latestと表示されているイメージを選択します。

後は

  • サービス名: 任意
  • リージョン: asia-norheast1(東京)
  • CPUの割り当てと料金: リクエストの処理中にのみ CPU を割り当てる
  • 認証: 未認証呼び出しを許可。

を選択します。
ここまで選択できたら作成をクリックします。
Cloud Runの構築が完了すると画面上部にURLが発行されます。

URLをクリックして、Hello Worldとレスポンスが得られれば完了です。
これでローカルアプリをdocker経由でCloud runにデプロイすることが出来ました。

まとめ

ローカルアプリをCloud Runにデプロイする流れは以下です。

  1. Dockerfileを作成。
  2. dockerイメージをビルド。
  3. dockerイメージをCloud Registorにpushできるようにタグ付け。
  4. Cloud Registoryにpush。
  5. Cloud RunからCloud Registoryのdockerイメージを参照して構築。

Discussion