Bot

開発記録#159(2025/3/25)「論文ベースのbot開発フローpart.21 セキュリティ強化 (APIキーのローテーションとデータバックアップの導入)」

2025年3月25日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

本記事では「暗号通貨のパンプ&ダンプスキームの検出」に関する論文をベースにbot開発の過程をまとめていきます。

🔒 セキュリティ強化 (APIキーのローテーションとデータバックアップの導入)

次のステップとして、以下の2つのセキュリティ強化策に取り組みます。

APIキーのローテーション (自動更新システムの実装)
データバックアップの自動化 (重要データの安全な保存)


1. APIキーのローテーション

🔎 なぜAPIキーのローテーションが重要か?

  • APIキーが漏洩した際のリスクを最小化
  • 定期的にAPIキーを自動更新し、セキュリティの確保

APIキーのローテーション設計

  1. 新しいAPIキーの発行 (Bybit API)
  2. Kubernetes Secretsの更新
  3. Botの再デプロイ

🔁 APIキーのローテーションってなに?どうやるの?

Botを安全に動かし続けるために、**APIキーを定期的に入れ替える(ローテーションする)**のはとても大事です。たとえば、万が一キーが誰かに漏れてしまっても、すぐに入れ替えれば被害を防げます。

今回は、Kubernetes を使って Bot を動かしている場合の流れをやさしく説明します。


🧩 ローテーションの流れ(3ステップ)

  1. 新しいAPIキーを発行する
    → Bybitの管理画面から、新しいAPIキーを作ります。古いキーはまだ削除しないでOK!
  2. Kubernetesのシークレットを更新
    → 新しいキーをKubernetesに登録しなおします。これは「Botの中にこっそり渡す合言葉をすり替える」イメージ。 コマンドでやるとこんな感じ
kubectl create secret generic api-credentials --from-literal=API_KEY=新しいキー
  1. Botを再起動してキーを反映させる
    → 登録しただけでは反映されないので、Botをいったん再起動して新しいキーを読み込ませます。 再起動コマンド:
kubectl rollout restart deployment crypto-bot

💡 ちょっとしたコツ

  • 月1回の自動ローテーションにしておくと安心(Cronで動かすと楽)
  • キーを入れ替えるときは新旧キーが両方使える時間を少しだけ作っておくと、切り替えの瞬間にBotが止まるリスクを減らせます
  • うまくいかなくても大丈夫。前のキーに戻すこともできるので焦らず対処!

✅ まとめ

APIキーのローテーションはちょっと面倒そうに見えて、慣れれば簡単。
Botを守るためのお守りみたいなものです。

セキュリティを強くする第一歩として、ぜひ取り入れてみてくださいね。


ローテーションスクリプト (api_key_rotation.py)

import requests
import subprocess
import json
from datetime import datetime

# Bybit API情報
BYBIT_API_KEY = "YOUR_OLD_API_KEY"
BYBIT_API_SECRET = "YOUR_OLD_API_SECRET"
API_URL = "https://api.bybit.com/v2/private/api_key"

# Slack通知設定
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR_SLACK_WEBHOOK_URL"

# 新しいAPIキーの取得
def generate_new_api_key():
    headers = {"Content-Type": "application/json"}
    payload = {
        "api_key": BYBIT_API_KEY,
        "secret": BYBIT_API_SECRET,
        "endpoint": "generate_new_key"
    }

    response = requests.post(API_URL, headers=headers, json=payload)
    if response.status_code == 200:
        new_key_data = response.json()
        return new_key_data["api_key"], new_key_data["api_secret"]
    else:
        print("❌ APIキーの発行に失敗しました")
        return None, None

# Kubernetes Secretsの更新
def update_k8s_secrets(api_key, api_secret):
    subprocess.run([
        "kubectl", "create", "secret", "generic", "api-keys",
        f"--from-literal=BYBIT_API_KEY={api_key}",
        f"--from-literal=BYBIT_API_SECRET={api_secret}",
        "--dry-run=client", "-o", "yaml",
        "|", "kubectl", "apply", "-f", "-"
    ], shell=True)
    print("✅ APIキーの更新が完了しました")

# Slack通知
def send_slack_notification(message):
    payload = {"text": message}
    requests.post(SLACK_WEBHOOK_URL, json=payload)

# メイン処理
def main():
    print("🚀 APIキーのローテーションを開始します...")
    new_api_key, new_api_secret = generate_new_api_key()
    
    if new_api_key and new_api_secret:
        update_k8s_secrets(new_api_key, new_api_secret)
        send_slack_notification(f"✅ 新しいAPIキーが正常に更新されました (更新日時: {datetime.now()})")
        print("✅ APIキーのローテーションが完了しました")
    else:
        send_slack_notification(f"❌ APIキーの更新に失敗しました (日時: {datetime.now()})")

if __name__ == "__main__":
    main()

🔁 APIキーのローテーションを自動でやってくれるスクリプト

手動でAPIキーを入れ替えるのって、ちょっと面倒ですよね。
そんなときに便利なのがこの api_key_rotation.py スクリプト。

これを使えば、新しいAPIキーの発行 → Kubernetesの更新 → Slack通知までを一気に自動化できます!


💡 何ができるの?

このスクリプトは以下の流れで動きます:

  1. Bybit APIで新しいAPIキーを発行
  2. KubernetesのSecret(秘密情報)を更新
  3. Slackに「更新完了」の通知を送る

🧩 スクリプトのポイント解説

  • generate_new_api_key()
     BybitのAPIを使って新しいAPIキーとシークレットを発行します。
     失敗したらエラーメッセージを出して終了。
  • update_k8s_secrets()
     取得したキーを使って、KubernetesのSecret情報を更新します。
     kubectl create secret ... | kubectl apply -f - の流れをPythonから自動実行してくれます。
  • send_slack_notification()
     SlackのWebhookを使って「キーの更新が成功したよ!」と通知してくれる安心機能。
  • main()
     上の処理をまとめて呼び出すメイン部分。
     失敗時にもSlackにエラー通知を送ってくれるので、安心感があります。

スクリプトの 実行方法はこれだけ!

python api_key_rotation.py

これだけで、新しいAPIキーが発行されて、KubernetesもSlackも自動で更新されます。

✅ まとめ

このスクリプトを使えば、Botのセキュリティを保ちながら運用の手間も減らせるのが最大の魅力です。

  • 毎月1回のローテーションを CronJob化 すれば完全自動化も可能。
  • うっかり古いキーのまま動かし続けるミスも防げます。

「安全な運用 × 自動化」 を目指す方は、ぜひ取り入れてみてください。


2. データバックアップの自動化

🔎 バックアップ対象データ

市場データ (収集した過去データ)
P&Dイベントの検出結果
取引履歴とログデータ
トレードモデルと関連パラメータ

🔎 バックアップ対象データって何を残せばいいの?

Botを安定して運用するうえで、「もしものとき」に備えてデータを定期的にバックアップしておくことはとても大切です。
ここでは、どんなデータをバックアップしておくべきかをわかりやすく整理してみます。


✅ 市場データ(収集した過去データ)

Botが判断の材料として使う、過去の価格や板情報、ティックデータなど
これがあると、あとからバックテストや検証にも使えて便利です。
特に過去の急変動の場面などは貴重な教材になります。


✅ P&Dイベントの検出結果

Botが見つけた「パンプ&ダンプ」などの異常な動きの記録
これを保存しておけば、将来のモデル学習や改善時に「どういう動きを“異常”と見なしたか」を再確認できます。


✅ 取引履歴とログデータ

実際にいつ・どこで・どんな取引が行われたかの記録。
加えて、Botが出したログ(エラーや成功メッセージなど)も大事です。
トラブルがあったときの振り返り材料
になります。


✅ トレードモデルと関連パラメータ

機械学習モデルや戦略ロジック、パラメータの設定値など。
特にチューニングした結果や学習済みモデルファイルは、必ずバックアップしておきたいですね。
これがないと、同じパフォーマンスを再現できなくなります。


✅ まとめ

この4つを定期的にバックアップしておくことで、Botが急に止まっても、すぐに復旧したり、問題の原因を調べたりできます。

  • 過去の市場データ
  • Botの検出ログ
  • 取引の記録
  • 戦略モデルの保存

Bot開発と運用の“保険”として、必ず押さえておきましょう!


バックアップスクリプト (backup_script.py)

import boto3
import os
from datetime import datetime

# AWS S3の設定
AWS_ACCESS_KEY = "YOUR_AWS_ACCESS_KEY"
AWS_SECRET_KEY = "YOUR_AWS_SECRET_KEY"
BUCKET_NAME = "crypto-bot-backup"

# バックアップ対象フォルダ
BACKUP_PATHS = ["./data", "./logs", "./models"]

# バックアップ処理
def backup_to_s3():
    s3 = boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECRET_KEY)

    for path in BACKUP_PATHS:
        for root, _, files in os.walk(path):
            for file in files:
                full_path = os.path.join(root, file)
                backup_key = f"{datetime.now().strftime('%Y-%m-%d')}/{full_path}"
                s3.upload_file(full_path, BUCKET_NAME, backup_key)
                print(f"✅ {full_path} をバックアップしました")

if __name__ == "__main__":
    backup_to_s3()

✅ バックアップスクリプト(backup_script.py)の役割と使い方

このスクリプトは、Botが使っている大切なデータを自動でバックアップするためのコードです。
具体的には、AWS S3(クラウドの保存先)に、指定したフォルダ内のデータを毎回まとめてアップロードしてくれます。


💡 どんなデータをバックアップするの?

スクリプトの中では、以下の3つのフォルダが対象になっています:

  • ./data → 市場データや収集ログなど
  • ./logs → Botの動作ログ
  • ./models → 学習済みのAIモデルやパラメータ設定

これらの中身を、日付付きのフォルダ名で整理してS3に保存してくれます。たとえば「2025-04-21/data/logs/models」といった感じ。

スクリプトの実行

⚙️ どんな仕組みで動いてるの?

  1. boto3 というPythonライブラリを使って、AWS S3に接続
  2. 各フォルダを再帰的に読み込んで、ファイルごとにアップロード
  3. printで進捗を表示(何をバックアップしたか一目でわかる)

コードの実行はとても簡単で、ターミナルからこの1行を打つだけです:

python backup_script.py

🌟 このスクリプトのいいところ

  • ✅ 毎回ファイルを手作業でアップロードする必要がなくなる
  • ✅ 日付単位でバックアップされるので履歴が管理しやすい
  • ✅ 万が一のトラブル時にすぐデータを復元できる

✅ バックアップの習慣化を!

このスクリプトは、「Botがうまく動いているときの記録」も「エラーが起きたときの証拠」も、すべてクラウドに残してくれる保険のような存在です。

本番運用では、cron(定期実行)などと組み合わせて、毎日自動でバックアップしておくのがおすすめです!


3. 自動化のためのスケジュール設定 (cron)

APIキーのローテーションやデータのバックアップは、手動でも実行できますが、忘れてしまうリスクがありますよね。
そこで登場するのが **cron(クロン)**という、時間を指定してスクリプトを自動実行するための便利な仕組みです。

🔄 何を自動化するの?

今回、自動化するのはこの2つ:

  1. APIキーのローテーション
     → 毎月1日の午前2時に実行
  2. データバックアップ
     → 毎日午前3時に実行

cron設定ファイル

# 毎月1日の午前2時にAPIキーを更新
0 2 1 * * /usr/bin/python3 /app/api_key_rotation.py

# 毎日午前3時にデータバックアップを実行
0 3 * * * /usr/bin/python3 /app/backup_script.py

これを見やすく言い換えると、

  • 0 2 1 * *」=毎月1日 午前2時ちょうど
  • 0 3 * * *」=毎日 午前3時ちょうど

という意味になります。指定された時刻に、対象のPythonスクリプトを自動で実行してくれるようになります。

cronジョブの設定

1.ターミナルで以下のコマンドを実行:

crontab -e

2.表示されたファイルの一番下に、先ほどの2行をコピペ

3.保存して終了すれば設定完了!

🌟 自動化で“忘れない安心”を手に入れよう

この設定をしておけば、

  • 毎月のAPIキー更新を手動でやる必要がなくなり
  • 毎日のバックアップも抜け漏れなく行われる

という、運用の大きな安心感につながります。

トラブルが起きてから「やっておけばよかった…」とならないように、cronでの自動化は早めに導入しておくのがおすすめです!


4. 次のステップ

Yodaka

次の記事では、パフォーマンス最適化 (非同期処理とモデルの高速化)についてまとめます。

関連
開発記録#160(2025/3/25)「論文ベースのbot開発フローpart.22 パフォーマンス最適化 (非同期処理とモデルの高速化)」

続きを見る

👇ラジオで話したこと

🎙️ 開発記録#159「セキュリティ強化:APIキーのローテーションとデータバックアップ」

こんにちは、よだかです。
今回の放送では、Botの開発記録シリーズ第21弾として、セキュリティ強化をテーマにお話していきます。

トピックは大きく2つ。

  • APIキーのローテーション
  • データのバックアップ自動化

どちらも、Botを長期的・安定的に動かすうえで「もしものとき」に備える、大切な仕組みです。
それでは、順番に解説していきます。


🔐 1. APIキーのローテーション

まずは APIキーのローテーションから。

Bybitなどの取引所を使ってBotを動かすとき、APIキーとAPIシークレットをBotに渡す必要がありますよね。
これはいわば、「Botに渡す合言葉」です。

でも、この合言葉が誰かに盗まれてしまったら…?
──その人は、あなたのBotになりすまして勝手に取引ができてしまうんです。

だから、定期的にこの合言葉を入れ替える=ローテーションすることが重要になります。


🔁 ローテーションの基本ステップ

流れとしては3ステップ:

  1. 新しいAPIキーを発行する
    BybitのAPIを使って、新しいAPIキーをプログラムから自動的に発行します。
  2. KubernetesのSecretsを更新する
    Botに合言葉を伝える場所が「KubernetesのSecret」なんですが、これを新しいキーで上書きします。
  3. Botを再起動する
    Secretsを更新しただけじゃ反映されないので、Botを再起動して、新しいキーを読み込ませます。

🛠️ 自動化スクリプト:api_key_rotation.py

この流れをまるっと自動化するのが api_key_rotation.py というPythonスクリプトです。
以下のようなことを自動でやってくれます:

  • Bybit APIに接続して、新しいAPIキーを発行
  • そのキーをKubernetesに登録し直す
  • Slackに「キーの更新が完了したよ!」と通知を送る

実行はたったこれだけ:

python api_key_rotation.py

Slack通知が来たら、無事完了です。


💡 ワンポイント

  • 毎月1回、自動でこのスクリプトを実行するよう cron に登録しておけば、完全自動化も可能。
  • 切り替え時には旧キーと新キーの両方を少しの間使えるようにしておくと、Botの動作が途切れず安心です。

💾 2. データバックアップの自動化

次は バックアップの話

Botを運用していると、いろんなデータが溜まっていきますよね。

  • 市場データ(ティックデータや板情報)
  • P&Dイベントの検出結果
  • 実際の取引履歴やログ
  • 学習済みモデルやパラメータ設定

これらが突然消えてしまったら……?

たとえば、サーバーが壊れた。うっかり上書きした。あるいはAPIで取得できなくなった──
そんなときのために、定期的なバックアップは欠かせません。


🧠 どんなデータを残しておく?

以下の4つが鉄板です。

  1. 市場データ
    → 過去の価格変動や板の動き。後で検証や学習に使える。
  2. P&D検出ログ
    → Botがどんなイベントを「異常」と判断したかの記録。精度改善に活きます。
  3. 取引履歴とログ
    → 成功・失敗を振り返るには欠かせない記録。
  4. トレードモデル&パラメータ
    → 学習済みモデルや、調整したパラメータなど。

☁️ 自動バックアップスクリプト:backup_script.py

ここで活躍するのが backup_script.py
このスクリプトは、先ほどの4つのデータが入っているフォルダを自動でスキャンし、AWS S3にアップロードしてくれます。

バックアップ対象のフォルダはこんな感じ:

  • ./data → 市場データ
  • ./logs → 実行ログ
  • ./models → トレードモデルやパラメータ

ファイルは「2025-04-21/data/ログ/モデル…」というように、日付ごとに整理して保存されます。


📦 使い方はとっても簡単

python backup_script.py

これだけでOKです。あとは勝手に保存してくれます。


⏰ 3. 自動実行:cronの設定

ここまでのスクリプトを自動で動かすには、cron(クロン)が便利です。

設定ファイルにはこう書きます:

# 毎月1日 午前2時にAPIキーを更新
0 2 1 * * /usr/bin/python3 /app/api_key_rotation.py

# 毎日 午前3時にデータバックアップ
0 3 * * * /usr/bin/python3 /app/backup_script.py

設定は crontab -e で開いてコピペすればOK。


🔚 おわりに

ということで、今回は APIキーのローテーションデータバックアップの自動化 という、セキュリティと安定運用の“土台”を整える内容をお届けしました。

Botの性能を磨くのももちろん大事なんですが、
守りを固めることが、長期的に戦い続けるための鍵になります。

次回は、Botのパフォーマンス最適化、つまり非同期処理やモデル高速化といった「スピードと精度を上げる工夫」についてお話する予定です。

🎙️ おまけトーク:Cronってなに?自己学習ログとしての小話

さて、ここからはちょっとしたおまけトークを。

今回の放送でもちらっと出てきた「Cron(クロン)」という言葉。
私も最初は「なんか定期実行に使うやつでしょ?」くらいの理解だったんですが、
Botを自動で回すようになってから、ようやくちょっとずつ仕組みがわかってきました。


🧠 Cronって何?ざっくり言うと…

まず、**Cron(クロン)**は UNIX系のOSに入っている“スケジューラ”のことです。
簡単に言うと「指定した時間に、指定した処理を勝手にやってくれるプログラム」。

たとえば…

  • 毎朝3時にバックアップスクリプトを実行するとか
  • 毎週月曜にAPIキーをチェックしてローテーションするとか

そういう“定期的にやりたいこと”を、時間を指定して自動化できる仕組みですね。


🛠️ 仕組み:実は“cronデーモン”が常に見張ってる

ちょっとだけ仕組みも触れておくと、
Cronは「cronデーモン」っていう常駐プログラムが裏でずっと動いていて、
crontabっていう設定ファイルを読みながら、「あ、今この時間だ!」ってなったら、書かれたコマンドを実行してくれる…という流れ。

つまり、あらかじめ時間とスクリプトのパスを“予約”しておいて、
あとは放っておけば自動でやってくれる。そういう便利な存在です。


📆 記法:5つの数字とコマンド

書き方にちょっとクセがあって、
たとえばこういう記述があるんですね:

0 3 * * * /usr/bin/python3 /app/backup_script.py

これ、左から順に…

分 時 日 月 曜 コマンド

という並びになってて、
この例だと「毎日3時0分に /app/backup_script.py を実行せよ」という意味です。


💡 私が最初に勘違いしてたこと

最初、私は「cronってコンピュータの電源が入ってなくても実行してくれるんでしょ?」って勘違いしてました。
でも実際には、マシンの電源がオンで、cronデーモンが動いているときにだけ実行されるんですよね。

つまり、ラップトップを閉じて寝てたら…何も起きない(笑)
だからBotを回すなら、やっぱり常時起動のサーバーやクラウド環境とセットで使うのが前提。


🔁 Bot運用における使いどころ

今回私が使ってるのは、以下の2つの処理:

  • 毎月1日の午前2時:APIキーをローテーション
  • 毎日午前3時:データバックアップを自動実行

これらをcronで設定しておけば、忘れず・確実に・夜中でもBotがメンテナンスしてくれる。

まさに“影の管制塔”という感じです。


📌 補足:crontab -e で設定する

設定ファイルは crontab -e というコマンドで編集できます。

そして、「あ、これちゃんと動いてるかな?」って不安な時は、tail -f /var/log/cron とかでログを追いかけたりもできます(※環境によるけど)。


📝 まとめ:CronはBot運用の小さな“影の味方”

ということでまとめると…

  • Cronは時間を指定してコマンドを自動実行する仕組み
  • コンピュータが起動していて、cronが動いている時だけ実行される
  • 定期バックアップやキー更新などに超便利
  • ちょっと記法にクセがあるけど、慣れると神ツール

…という感じでした!

私自身、今でも毎回 0 2 1 * * の意味を確認しちゃうんですが(笑)
Bot開発者として、こういう「ちょっと地味だけど大事なインフラ系スキル」って確実に自分の武器になるので、今後も試しながら深掘りしていこうと思ってます。


次回は、Botの**パフォーマンス最適化(非同期処理とモデル高速化)**についてお届けしますので、こちらもぜひお楽しみに!

では、また次回お会いしましょう!
よだかでした 🕊️

-Bot