🐈
自動デプロイを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