🐈

自動デプロイをCloud run→Cloud run jobに変更する、ログをjsonで吐き出す

に公開

私がやりたいのはCloud schedulerからの定期実行なので、それってCloud runじゃなくてCloud run jobでよくない? となったのでそっちに変更する。

title=app.py
import json
import time

def main():
    log_data = {
        "timestamp": time.time(),
        "event": "job_executed",
        "status": "success",
        "detail": "ジョブが実行されました"
    }
    print(json.dumps(log_data, ensure_ascii=False))  # JSON 形式で標準出力

if __name__ == "__main__":
    main()

routeが不要になったのでflaskも外して、めっちゃシンプルに。
Dockerにてapp.pyが実行されるので、if __name__ == "__main__": によりjob実行時にmain関数が実行されるはず。

続いて自動デプロイコードの変更

title=.github/workflows/deploy.yml
name: Deploy to Cloud Run

on:
  push:
    branches:
      - main

env:
  REGION: ${{ secrets.REGION }}
  GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
  REPO_NAME: ${{ github.event.repository.name }}
  IMAGE: ${{ secrets.REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ github.event.repository.name }}/${{ github.sha }}
  SERVICE_ACCOUNT_NAME: ${{ secrets.SERVICE_ACCOUNT_NAME }}

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Authenticate with Google Cloud
        uses: google-github-actions/auth@v2
        with:
          credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }}

      - name: Configure Google Cloud SDK
        run: |
          gcloud auth configure-docker $REGION-docker.pkg.dev
          gcloud config set project $GCP_PROJECT_ID

      - name: Build and Push Docker Image
        run: |
          docker build --platform linux/amd64 -t $IMAGE .
          docker push $IMAGE

      - name: Deploy to Cloud Run Job
        run: |
          if gcloud run jobs describe $REPO_NAME --region=$REGION > /dev/null 2>&1; then
            echo "Job exists. Updating..."
            gcloud run jobs update $REPO_NAME \
              --image $IMAGE \
              --region $REGION
          else
            echo "Job does not exist. Creating..."
            gcloud run jobs create $REPO_NAME \
              --image $IMAGE \
              --region $REGION \
              --service-account $SERVICE_ACCOUNT_NAME
          fi

変わったこと
cloud run jobは初回と二回目以降で振る舞いが少し異なる。
初回はサービスアカウントの紐付けが必要なのでsecretに SERVICE_ACCOUNT_NAME を登録して、紐付けするように。

            gcloud run jobs create $REPO_NAME \
              --image $IMAGE \
              --region $REGION \
              --service-account $SERVICE_ACCOUNT_NAME

二回目以降はupdate。cloud runと違って公開は不要なのでplatformオプションは外すこと。

            gcloud run jobs update $REPO_NAME \
              --image $IMAGE \
              --region $REGION

自動デプロイが成功していたら、GCPのCloud Runページで作成を確認して、試しに実行。

ログエクスプローラーからログがjsonで出力されているのを確認。やったね。

Discussion