メインコンテンツへスキップ

ボツ記事 k8s内に構築したPostgreSQLをCronJobでバックアップする

·179 文字·1 分
ボツ記事 Kubernetes Docker
目次

おうちk8sでMisskeyとNowPlayingを動かし始めたよ · usbharu - blogでCloudNative PostgreSQLをやめ、k8s内で普通のPostgreSQLを動かし始めました。同時にバックアップ手段も失ったので、今回は自動バックアップを構築する記事です。

やりたいこと
#

k8sのCronJobでPostgreSQLをバックアップのpg_dumpを作成してオブジェクトストレージにアップロードしたい。

出来上がったもの
#

usbharu/pg_backup_job - pg_backup_job - Gitea for usbharu

今回ほとんどChatGPTに作ってもらいました。これぐらいなら余裕ですね! コメント等もほぼChatGPTが出力したままです。

# ベースイメージにPostgreSQL 15の公式クライアントを使用
FROM postgres:16

# 必要なツールをインストール
RUN apt-get update && apt-get install -y \
    curl \
    awscli \
    && rm -rf /var/lib/apt/lists/*

# 作業ディレクトリ
WORKDIR /backup

# スクリプトをコピー
COPY backup.sh /backup/backup.sh

# 実行権限を付与
RUN chmod +x /backup/backup.sh

# エントリーポイントを設定
ENTRYPOINT ["/backup/backup.sh"]

#!/bin/bash
set -e

# 必須環境変数リスト
REQUIRED_VARS=(
  PG_HOST
  PG_PORT
  PG_USER
  PG_PASSWORD
  PG_DATABASE
  S3_BUCKET
  AWS_ACCESS_KEY_ID
  AWS_SECRET_ACCESS_KEY
)

# 未設定の環境変数をチェック
for VAR in "${REQUIRED_VARS[@]}"; do
  if [ -z "${!VAR}" ]; then
    echo "エラー: 必須環境変数 '${VAR}' が設定されていません。" >&2
    MISSING_ENV=true
  fi
done

if [ "$MISSING_ENV" = true ]; then
  exit 1
fi

# 環境変数の設定
export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}"
export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}"
export AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}"

# ダンプファイル名
DUMP_FILE="dump_$(date +%Y%m%d%H%M%S).sql"

# pg_dumpを実行
export PGPASSWORD="${PG_PASSWORD}"
pg_dump -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" -d "${PG_DATABASE}" -F c -b -v -f "${DUMP_FILE}"

# S3にアップロード
if [[ -n "${S3_ENDPOINT}" ]]; then
  # カスタムエンドポイント指定時
  aws --endpoint-url "${S3_ENDPOINT}" s3 cp "${DUMP_FILE}" "s3://${S3_BUCKET}/${DUMP_FILE}"
else
  # デフォルトエンドポイント
  aws s3 cp "${DUMP_FILE}" "s3://${S3_BUCKET}/${DUMP_FILE}"
fi

# ローカルのダンプファイルを削除
rm -f "${DUMP_FILE}"

echo "バックアップとアップロードが完了しました。"

こっちの方もちょっと変わっていて、CronJobとそれに必要なSecretが追加されています。

usbharu/usbharu-lab at e067db4ea302c3d3ee63c375d5058e1c2c6bedf1


  • ボツ理由:ChatGPTで生成したんなら記事各意味なくね?
  • 状態:書きかけ