Skip to content

Conversation

yasulab
Copy link
Member

@yasulab yasulab commented Sep 5, 2025

概要

個別サーバー作成用のRakeタスクを追加し、CI/CDを待たずに特定のサーバーをテスト作成できるようにしました。
また、セキュリティ設計とコード品質の大幅な改善を実施しました。

主な変更点

1. ✅ 個別サーバー作成タスク (server:create)

  • 特定のサーバーを個別に作成可能
  • 既存のdeploy.rbのロジックを再利用(DRY原則)
  • テスト環境での動作確認に最適

2. ✅ サーバーリストの改善 (server:list)

  • NEW: リアルタイムのサーバーステータスを表示(✅ up / ⏸️ down / 🧹 cleaning)
  • API認証情報がない場合は説明メッセージを表示
  • API接続エラー時もリストの表示を継続

3. 🔒 セキュリティ設計の文書化

  • 多層防御(Defense in Depth)戦略を詳細に文書化
  • パケットフィルターとiptablesの二層構成を説明
  • パケットフィルター確認ツール(check_packet_filter.rb)を追加

4. 🎯 大規模リファクタリング(DRY原則)

  • SakuraServerUserAgentクラスにデフォルトパラメータを実装
    • zone: '31002' (石狩第二)
    • packet_filter_id: '112900922505'
  • 7つのユーティリティスクリプトから52行の重複コードを削除
  • ハードコーディングされた値を1箇所に集約

5. ✨ コード品質の向上

  • マジックナンバー60をSEPARATOR_WIDTH定数に置き換え
  • 自動デプロイのコミットメッセージを簡潔化
  • YAGNI原則に基づき不要なrecreateタスクを削除

使用方法

個別サーバーの作成

# サーバーを個別に作成(servers.csvに登録済みのものが対象)
bundle exec rake "server:create[coderdojo-japan]"

サーバーリストの確認(ステータス付き)

# サーバー一覧をステータス付きで表示
bundle exec rake server:list

パケットフィルター設定の確認

# セキュリティ設定を確認
ruby scripts/utils/check_packet_filter.rb

変更ファイル

追加

  • docs/security-defense-in-depth.md - セキュリティ設計文書
  • scripts/utils/check_packet_filter.rb - パケットフィルター確認ツール

修正(リファクタリング)

  • Rakefile - server:create, server:list タスクの追加・改善
  • scripts/sakura_server_user_agent.rb - デフォルトパラメータの実装
  • scripts/initialize_server.rb - ハードコーディング削除
  • scripts/utils/*.rb - 全7ファイルでデフォルト値を活用

テスト結果

  • ✅ coderdojo-japanサーバーの削除・再作成でテスト済み
  • ✅ 同一IPアドレス(133.242.227.219)が維持されることを確認
  • ✅ サーバーステータス表示が正常に動作
  • ✅ パケットフィルター設定の正常性を確認(SSH/HTTP/HTTPS開放)
  • ✅ デフォルトパラメータが全スクリプトで正常動作

影響範囲

  • 既存のCI/CDフローには影響なし
  • 後方互換性を維持
  • セキュリティ強化とコード品質向上

関連Issue

新機能:
- rake server:create[サーバー名] で個別にサーバーを作成可能
- rake server:recreate[サーバー名] で再作成をガイド
- 既存のdeploy.rbのロジックを最大限再利用(DRY原則)

使用例:
  rake "server:create[coderdojo-japan]"

目的:
- CI/CDを通さずに即座にサーバーをテスト
- SSH修正などの機能テストが容易に
- 開発効率の向上
- セパレーター行の幅を定数化
- 保守性と可読性の向上
- 既存の50も含めて統一
- サーバー名の追加情報を削除
- PR番号のみを含む簡潔なメッセージに
- PR番号があればGitHubで詳細確認可能

変更前: Deploy from actions (PR #259) - Added: Name,coderdojo-akita
変更後: Deploy from actions (PR #259)
- server:createタスクで十分なため、recreateタスクは不要
- 削除は手動で server:execute_deletion を使用
- 作成は server:create を使用
- よりシンプルで明確なワークフローに
- さくらのクラウドAPIを使用してリアルタイムステータスを取得
- 各サーバー名の横に状態を表示(✅ up / ⏸️ down / 🧹 cleaning)
- API認証情報がない場合や接続エラー時には説明メッセージを表示
- API認証情報がなくても一覧表示は継続
- initialize メソッドに本番環境のデフォルト値を設定
  - zone: '31002' (石狩第二)
  - packet_filter_id: '112900922505'
- Rakefileのserver:listタスクからハードコーディングを削除
- DRY原則に従い、デフォルト値の重複を解消
- すべてのutilsスクリプトからハードコーディングされた値を削除
- SakuraServerUserAgentのデフォルト値を活用
- 7ファイルで重複していたパラメータ設定を削除
  - scripts/initialize_server.rb
  - scripts/utils/check_server_status.rb
  - scripts/utils/check_startup_scripts.rb
  - scripts/utils/find_resources.rb
  - scripts/utils/start_server.rb
  - scripts/utils/test_with_packet_filter.rb
  - scripts/utils/test_with_startup_script.rb
- DRY原則の徹底により保守性が向上
- 二層のファイアウォール構成の説明
  - Layer 1: さくらのクラウド パケットフィルター
  - Layer 2: iptables(サーバー内部)
- なぜ両方が必要なのかを詳細に説明
  - 時系列での保護
  - 障害時の冗長性
  - 管理の観点
  - 攻撃シナリオへの対策
- パケットフィルター確認ツールも追加
- トラブルシューティングガイド
- ベストプラクティス
問題:
- cloud-init対応を削除した際、スタートアップスクリプトも実行されなくなっていた
- disk/config APIのNotesフィールドは単なるメモで、スクリプト実行のトリガーではなかった
- 結果として、iptablesやSSHセキュリティ強化が適用されていなかった

解決:
- サーバー起動時(/power API)にNotesパラメータでスタートアップスクリプトIDを指定
- notesパラメータをinitializeメソッドに追加(デフォルト値付き)
- これにより、startup-scripts/112900928939 が正しく実行される

改善:
- notesもデフォルトパラメータ化(packet_filter_idと同様)
- セキュリティ設定(ファイアウォール+スタートアップスクリプト)がデフォルトで有効
- 必要に応じて個別に無効化可能(テスト環境等)

関連: #253 SSH接続問題の根本原因の一つ
@yasulab
Copy link
Member Author

yasulab commented Sep 5, 2025

🐛 重要なバグ修正を追加

cloud-init対応を削除した際に発生したスタートアップスクリプトが実行されない問題を修正しました。

問題の詳細

  • cloud-init削除時( b64d768 )にスタートアップスクリプトの実行も削除されていた
  • disk/config APIのNotesフィールドは単なるメモで、スクリプト実行のトリガーではなかった
  • 結果として:
    • ❌ iptables設定が適用されない
    • ❌ SSH強化設定が適用されない
    • ❌ Ansibleがインストールされない

修正内容

  1. サーバー起動時(/power API)にNotesパラメータでスタートアップスクリプトIDを指定
  2. notesパラメータをinitializeメソッドに追加(デフォルト値付き)

デフォルト値の設計

パラメータ デフォルト値 用途
zone "31002" 石狩第二ゾーン
packet_filter_id '112900922505' ファイアウォール
notes [{ID: 112900928939}] スタートアップスクリプト(新規追加)

これにより、セキュリティ設定がデフォルトで確実に適用されるようになりました。

関連: #253 SSH接続問題の根本原因の一つ

変更内容:
- scripts/utils/test_*.rb を test/integration/ に移動
- 統合テスト(実際のAPI呼び出し)を明確に分離
- require_relative パスを修正
- test/README.md を追加してテスト構造を文書化

ディレクトリ構造:
- test/              # ユニットテスト
  - csv_test.rb
  - ip_validation_test.rb
- test/integration/  # 統合テスト(実際のAPI使用)
  - test_regex_patterns.rb
  - test_server_with_notes.rb
  - test_with_packet_filter.rb
  - test_with_startup_script.rb

これにより、テストの種類が明確になり、保守性が向上
@yasulab
Copy link
Member Author

yasulab commented Sep 5, 2025

📁 テストファイルの整理

scripts/utils/test_*.rbtest/integration/ ディレクトリに移動し、テスト構造を整理しました。

変更内容

  • 統合テスト(実際のAPI呼び出し)を test/integration/ に分離
  • ユニットテストと統合テストの明確な分離
  • test/README.md を追加してテスト構造を文書化

新しいディレクトリ構造

test/
├── README.md                  # テストガイド
├── csv_test.rb               # ユニットテスト
├── ip_validation_test.rb     # ユニットテスト
└── integration/              # 統合テスト(API使用)
    ├── test_regex_patterns.rb
    ├── test_server_with_notes.rb
    ├── test_with_packet_filter.rb
    └── test_with_startup_script.rb

これによりテストの種類が明確になり、保守性が向上しました。

@yasulab yasulab changed the title feat: 個別サーバー作成用のRakeタスクとコミットメッセージの改善 feat: 個別サーバー作成用のRakeタスクとサーバー状況確認タスクのメッセージ改善 Sep 5, 2025
@yasulab yasulab merged commit afec9fa into main Sep 5, 2025
4 checks passed
@yasulab yasulab deleted the feat-individual-server-creation branch September 5, 2025 06:21
github-actions bot pushed a commit that referenced this pull request Sep 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant