Cloud Run:POST受信アプリをデプロイ

Cloud Run:POST受信アプリをデプロイ

現在、Cloud Run を利用して Amazon の商品ページをスクレイピングしようとあれこれやっているところです。経緯の過去記事は次のとおりです。

01gcloud CLI でソースコードをデプロイする

目的は WordPress の記事の中に Amazon の商品を画像付きで挿入することですので、Cloud Run でスクレイピングするためには PHP から商品の asin を送り、Cloud Run で受けとる必要があります。

まずは Cloud Run で POST データを受け取る API という入り口から始めてみます。Gemini の力を借りてやってみます。借りると言いますかそのまま使えます(笑)。

ローカルに python コードを作成する

ローカルに作業ディレクトリをつくり、その配下に main.py, requirements.txt, Dockerfile の3つのファイルをつくります。アプリケーション名は fastapi-post-app としておきます。

まず、main.py です。

# main.py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# POSTデータのデータ構造を定義
class Item(BaseModel):
    asin: str

@app.post("/items/")
async def receive_item(item: Item):
    # ここでデータを受信して処理を行う
    return {
        "message": "Data received successfully",
        "data": item.asin
    }

# 動作確認用にルートパスも作成
@app.get("/")
def read_root():
    return {"FastAPI is running on Cloud Run"}

続いて、requirements.txt です。

fastapi
pydantic
uvicorn

最後に、Dockerfile です。

FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# Cloud Runは8080で待機する必要がある
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

Cloud Run にデプロイする

ローカルから gcloud CLI で操作していきます。前記事「Google Cloud Run ローカルから操作してみる」では Google Cloud のガイドにしたがってやりましたが、今回はまっさらな状態からあらためて何が必要かを確認していきます。

まず、gcloud CLI をインストールし gcloud init が実行されているところからです。この状態は Google Cloud にアカウントが認証され、プロジェクトが選択され、デフォルトリージョンが設定された状態です。

その既存のプロジェクトを使わずに新しくプロジェクトを作成するところからやってみます。

gcloud projects create [PROJECT_ID] --name="[プロジェクト名]"

PROJECT_ID は同じものがある場合はすでにありますとエラーになります。組織があり、その配下につくる場合は –organization=ORGANIZATION_ID を付加します。また、作成しただけではそのプロジェクトを選択したことにはならないようですので、

gcloud config set project [PROJECT_ID]

を実行します。

ということでローカルに作成した fastapi-post-app をデプロイしてみます。

gcloud run deploy fastapi-post-app \
  --source . \
  --region asia-northeast1 \
  --allow-unauthenticated

必要となる API を有効にしないといけません。この場合はエンターで進めますが、コマンドで実行する場合は、

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

です。そして、再度デプロイを試みますと、

エラーになります。プロジェクトに課金アカウントが紐づいていないからです。

gcloud beta billing projects link [PROJECT_ID] \
    --billing-account=[BILLING_ACCOUNT_ID]

として紐づけます。課金アカウントは、

gcloud billing accounts list

で調べられます。

Artifact Registry Docker リポジトリ

プロジェクトを課金アカウントに紐づけてデプロイを実行しますと再び API を有効にするかの問いが出ますのでエンターで進みます。続いて、

ソースからデプロイするには、ビルドされたコンテナを保存する Artifact Registry Docker リポジトリが必要です。

と (Y/n) で尋ねてきますのでエンターで進みます。直接 gcloud CLI でやる場合は、

をお読みください。私もまだよくわかりませんのでここではエンターです。

そう簡単にはデプロイできません(笑)。サービスアカウントに IAM ロールが足りないというやつだと思います。前記事でやったこれです。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
    --role=roles/run.builder

SERVICE_ACCOUNT_EMAIL_ADDRESS は前記事をご覧ください。

これでやっとデプロイ完了です。

アクセス URL が表示されますので curl でアクセスしてみます。

問題ありませんね。成功です。

このままですと公開アクセスになっていますので該当サービスをクリックしてセキュリティを認証が必要に変更しておきます。次回は認証してアクセスする方法です。

02Cloud Run ソースコード デプロイまとめ

Cloud Run に新たにサービスをソースコードでデプロイする場合に必要な作業は、すでにあるプロジェクトが選択されているとしますと、

  • プロジェクトに課金アカウントが紐づいていること
  • Artifact Registry Docker リポジトリが必要
  • サービスアカウントに IAM ロールが必要

ということになります。

少しずつですがわかってきました。次回は認証アクセスです。