これは何?
Google CloudにAPIを立てる手順をまとめたもの。
大まかな手順は以下の通り。
- ローカルで任意のアプリケーション、例えばFlask appを開発する
- Flask appをbuildしてDocker Imageに固める
- ImageをArtifact Registryに上げる
- ImageをCloud Runから呼び出す
- (本記事では記載省くが)API Gatewayを立てて、API呼び出し時にKeyを用いるようにする
- 任意の環境から、API Keyを用いてAPI呼び出しできる状態になる
ローカル環境で任意のアプリケーションを開発する
本記事では、手軽に導入できるFlaskを題材に扱う。
概ね下記のような内容を盛り込めば良い。
(このまま動作するかは不明なので、参考程度に)
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# ローカル開発用の設定であり、Google Cloudで動かす目的では必須ではないはず
EXPOSE 8001
CMD ["python", "app.py"]
import os
from flask import Flask
app = Flask(__name__)
# 一応CORS設定しておく
CORS(app)
@app.route("/")
def hello_world():
return "Hello, World!"
if __name__ == '__main__':
# Cloud Runで動かすために、portのデフォルト値は環境変数を参照する
port = int(os.environ.get('PORT', 8001))
app.run(host='0.0.0.0', port=port, debug=True)
ローカルでFlask appが起動することを確認できればOK。
Artifact Registryで、Repositoryを作成する
これ以降、gcloud cliが必要なため、公式Docsなどを参考にインストールする。
下記が確認できていれば良い。
# cliがインストールされていることを確認する
$ gcloud version
# loginコマンド実行して表示されるurlにアクセス → 認証成功すればok
$ gcloud auth login
Your browser has been opened to visit: ...
web UI (Google Cloudのweb上のコンソール画面)、もしくはcli上でRepositoryを作成する。
(ここで作成したRepositoryに後続のDocker Imageがアップロードされる)
今回はcli上で作成していく。
まずは、必要な変数を定義しておく。
# 今回利用するGoogle CloudのPROJECT_IDを指定する
# gcloud cliが良さげにインストール済みであれば、下記コマンドで手軽に設定できる
$ PROJECT_ID=$(gcloud config get-value project)
# 念の為が期待通りの値であることを確認しておくと良い
$ echo $PROJECT_ID
...
# 任意のregionを指定する
$ REGION=asia-northeast1
# 作成するRepository名を指定する
$ REPO_NAME=sample2025
Repositoryを作成する。
$ gcloud artifacts repositories create $REPO_NAME \
--repository-format=docker \
--location=$REGION \
--description="this is sample repos"
コマンドの実行結果や、web UI上で作成結果を把握できる。
ローカル環境で、Docker Imageをbuildする
まずは必要な変数を定義しておく。
# 作成するImage名を指定する
$ IMAGE_NAME=sample-flask-app
# 作成するTag名指を定する
$ IMAGE_TAG=0.1.0
先ほど作成したFlask appをImageに固める。
Apple Silicon上でbuildしたImageは arm64
となるがCloud Runは x86_64
であるため、その差分を解消するためにplatform指定しておくのが吉。
$ docker build --platform linux/amd64 -t $IMAGE_NAME:$IMAGE_TAG .
Docker Registryにpushする
Tag付けしてDocker Registryにpushする。
$ docker tag $IMAGE_NAME:$IMAGE_TAG $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/$IMAGE_NAME:$IMAGE_TAG
$ docker push $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/$IMAGE_NAME:$IMAGE_TAG
web UIのDocker Registryページ内で、今回作成したRepositoryとImage、Tagを確認できれば完璧。
Cloud RunからDocker Imageを呼び出してAPI化
cli経由でもCloud Run操作できるが、個人的にはweb UI上でこの辺の作業を進めたい。
(以下、UIの文言はたびたび変わるため、適宜読み替え必要)
- Cloud Runページに移動する
-
コンテナをデプロイ
を選択する -
既存のコンテナイメージから1つのリビジョンをデプロイする
を選択する -
コンテナイメージのURL
欄で、DockerRegistryに上げたImageを選択する -
構成
欄で、サービス名やRegionを適宜選択する -
認証
欄で、サクッと検証するためにIAM を使用して受信リクエストを認証する
のチェックを外す- つまり、認証なしでAPIを叩けてしまう状態のため要注意
- 本記事末尾で軽く触れるが、べき論ではAPI Key認証を導入するのが良い(もしくはIAMを適切に利用)
-
コンテナ、ボリューム、ネットワーキング、セキュリティ
欄の実行環境
欄で、第 2 世代: ネットワーク ファイル システムのサポート、Linux との完全な互換性、CPU とネットワーク パフォーマンスの高速化。
を選択する- Image build時に
--platform linux/amd64
を入れている場合、この設定が必要
- Image build時に
- その他、好みの設定を適用の上、作成すればOK
デプロイが無事完了すれば、詳細画面内に表示されるURL経由でAPIの呼び出しが可能となる
後続作業
一般的に、認証なしでAPI呼び出せるのはよろしくないため、下記Docsなどを参考にAPI Key認証の設定を導入する。