📚

【AWS】 EC2でのスクレイピングをcronに移行する方法 ─ 基本から応用までのチートシート🍺

2025/01/12に公開

はじめに

  • 記事の目的
    今回実務でcronを使用した定期実行を運用したので技術の共有と共に自分のためのチートシートとして残しておきます。
  • Background
    元々、10分ごとに動作するスクレイピングスクリプトをtime.sleepを使用して運用していたのですがこれだとバグの温床になってしまうので、より効率的で信頼性の高い運用方法としてcronに移行しました

cronの基本

cronとは?

  • 概要
    UNIX系OSで定期的なタスクスケジューリングを行うためのデーモン。バックグラウンドで動き続け、指定した時間にコマンドを実行

  • 主な使用シーン

    • 定期的なバックアップ
    • ログのローテーション
    • スクレイピングやデータ収集

crontabの基本構造

  • crontabファイルの基本フォーマット
* * * * * 実行するコマンド
│ │ │ │ │
│ │ │ │ └─ 曜日 (0 - 7) (日曜日は0または7)
│ │ │ └──── 月 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 時 (0 - 23)
└────────── 分 (0 - 59)
  • 例: 10分ごとに実行する場合
    */10 * * * * /usr/bin/python3 /path/to/your_script.py
    

*/10は「10分おき」を意味します。


cronの環境設定と注意点

AWS EC2でのcron設定

  • SSHでEC2に接続
    EC2インスタンスにSSHでアクセスし設定を進める
  • crontabの編集
    crontab -e
    
    で編集を開始し、適切なcronジョブを追加する。

環境変数とパスの設定

  • PATHの明示
    cron実行時にデフォルトの環境が異なるため、PATHを明確に指定する、もしくは必要な環境変数をジョブ内に記載する
    */10 * * * * PATH=/usr/local/bin:/usr/bin:/bin /usr/bin/python3 /path/to/your_script.py
    

ログの確認とデバッグ

  • cronの標準出力とエラー出力
    標準出力やエラーメッセージをログにリダイレクトする方法:
    */10 * * * * /usr/bin/python3 /path/to/your_script.py >> /var/log/my_scrape.log 2>&1
    
    
  • cronジョブの確認
    crontab -l
    
    で現在の設定を確認可能

実務でのcron移行の具体例

1.既存のtime.sleepを使用したスクリプトの課題

  • 問題点
    • スクリプトが常にメモリ上に存在する
    • エラー発生時のリカバリーが難しい
    • サーバーの再起動後、スクリプトが自動化しない可能性がある
  • 改善点
     cronに移行することによってスクリプトが定期実行され、エラー時に次回以降も動作を継続しやすくなり、サーバー再起動の自動実行も保証される。

2.cronジョブへの移行手順

1.スクリプトの準備
- Pythonスクリプトが単発で動作するように設計されていることを確認
- 外部ライブラリや、環境変数が必須なら、sehebang行や仮想環境のアクティベーションをスクリプト内で対応。

2.テスト実行
コマンドラインから直接スクリプトを実行し、想定どうりに動作することを確認。

3.crontabへの登録
crontab -eで編集。例:

    */10 * * * * /usr/bin/python3 /path/to/your_script.py >> /var/log/my_scrape.log 2>&1

4.動作確認
ログを確認して、定期的にスクリプトが実行されていることを確認。

3.time.sleepとの比較

  • メリット・デメリットの比較表
項目 time.sleep利用時 cron利用時
メモリ使用量 常駐するため高め 必要なときのみ実行
再起動後の対応 手動での再起動が必要 自動的に再スタート可能
エラー回復 スクリプト内部で工夫が必要 cronが次回から再実行
設定の柔軟性 スクリプト内で固定 cron設定で柔軟に変更可能

チートシートまとめ

  • cronの基本コマンド

    • crontab -e : 編集
    • crontab -l : 一覧表示
    • service cron status : cronサービスの状態確認
  • time形式のメモ

    • */10 * * * * : 10分ごと
    • 0 0 * * 0 : 毎週日曜日の0時に実行
  • デバッグのポイント

    • 環境変数やPATHの設定を確認
    • ログを活用してエラーを追跡
    • cronデーモンが稼働しているか確認(sudo service cron status)

まとめ

今回実務の中で自分が作成したスクリプトが安定して動作をするかどうかを考えられたいい機会になりました。この記事を通してcronで困っている方がいたらお役に立てることを祈っております!!!

Discussion