CloudBuildを利用してGCEへのデプロイを自動化してみた

2023/12/01に公開

初めに

DiscordのBotをPythonで書いていてできるだけ安く使えサーバーで動かしたかった。いろいろ吟味した結果GCEにデプロイすることになった。GCEにSSH接続していちいちデプロイして起動するのも面倒だと感じ始めたので自動化してみました。

Botの構成

  • 通常のbot.pyファイル(この中にすべての処理が書いてある)
  • requirements.txt
discord.py==1.7.3
  • Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD [ "python", "bot.py" ]
  • cloudbuild.yaml
steps:
# ここでGCEのインスタンスを建ち上げる
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute','instances','create-with-container','discord-bot','--zone=us-central1-a','--machine-type=f1-micro','--container-image=gcr.io/$PROJECT_ID/discord-bot','--network-interface=network-tier=PREMIUM,subnet=default','--metadata=google-logging-enabled=true','--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append','--tags=discord-bot','--boot-disk-size=1GB','--boot-disk-type=pd-standard','--boot-disk-device-name=discord-bot']
  
- name: 'gcr.io/cloud-builders/docker'
  args: ['build','-t','gcr.io/$PROJECT_ID/discord-bot','.']

options:
  logging: CLOUD_LOGGING_ONLY

images:
- 'gcr.io/$PROJECT_ID/discord-bot'

自動化してみる

  • トリガーを作成をクリック
  • トリガーの起動設定
    どのタイミングでビルドするか指定できる
  • レポジトリの設定
  • GithubとCloudBuildを連携させる
  • サービスアカウントの設定
    サービスアカウントの権限周りで実行時にエラーがたくさん出たので最高権限を持ったサービスアカウントを利用しました;;

最初のトリガーの画面に戻り実行を押すとGCEインスタンスとそこへデプロイの動作が開始します。

二回目以降からはcloudbuild.yamlからGCEインスタンス立ち上げの部分が必要なくなるので以下の部分を削除しておく。(もっと良い方法があるはず、、)

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute','instances','create-with-container','discord-bot','--zone=us-central1-a','--machine-type=f1-micro','--container-image=gcr.io/$PROJECT_ID/discord-bot','--network-interface=network-tier=PREMIUM,subnet=default','--metadata=google-logging-enabled=true','--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append','--tags=discord-bot','--boot-disk-size=1GB','--boot-disk-type=pd-standard','--boot-disk-device-name=discord-bot']

大変だったこと

デプロイが完了していたのに中身が更新されていないことがあった

トリガーのタスクがすべて完了しているにも関わらず中身が更新されていないことがありました。GCEインスタンスの再起動で解決できました。
リセットボタンを押す

手動リセット(停止ボタンを押して開始ボタンを押す)

トリガー起動制限にかかった件

権限周りでたくさんトリガーを押したため一日の許容量がオーバーしてしまうこともありました。

以下のようなエラーが出る。

insertId: "6c1ea5da-93ae-4abb-8cee-8af64a0d94f3-25"

labels: {2}

logName: "projects/uefn-begi/logs/cloudbuild"

receiveTimestamp: "2023-11-23T13:26:08.556654694Z"

resource: {2}

severity: "INFO"

textPayload: "ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1"

timestamp: "2023-11-23T13:26:08.405764073Z"

}

参考にした記事

https://blog.g-gen.co.jp/entry/ci-cd-pipeline-with-cloud-build

MidraLab(ミドラボ)

Discussion