⛳
CloudBuildを利用してGCEへのデプロイを自動化してみた
初めに
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"
}
参考にした記事
midra-lab.notion.site/MidraLab-dd08b86fba4e4041a14e09a1d36f36ae 個人が興味を持ったこと × チームで面白いものや興味を持ったものを試していくコミュニティ
Discussion