eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

ssh接続もシリアル接続もできなくなったGoogle Compute Engineで動くサーバーを復旧させる

何が起きたか

  • 社内システムの動いているサーバーをメンテしようとした
  • 突然GCEのいつものssh接続ができなくなった
  • 冷や汗をかきながらシリアル接続を有効化するが、ログインできず
  • 自分だけが締め出されたかと思って別ユーザーでも試すがログインできず

状況確認

  • 基本的なステータスチェック(権限、ネットワークとか)はOK
  • ssh接続しようとするとPermissin Deniedする
  • 起動スクリプトを介して公開鍵を登録したりユーザーパスワードをリセットしてもログインできない
  • 基本的なLinux力が足りていない

原因

  • slackのWebhookが使えなくなった(Let’s Encryptの証明書が更新された)関係でいろいろいじったので、心当たりがありすぎる
  • 証明書を再インストールしたあたり、バックアップとらずにそぉい!とやったのがまずかった気がする
  • サーバーのdaemon自体は普通に動き続けていたため、普通に使われている(今日まで気づかなかったし)
  • ここ最近のデータを失うのはツライ
  • データはどうにか救わねばならない

対応

  • このサーバーで動いていたのは社内用のRedmineで、なおかつbitnamiパッケージで導入したので詳しい構成はわからない
  • /opt 配下にいろいろインストールされており、なおかつ正常に動いていた2週間前のバックアップは存在する
  • なので、「正常に動いていた時代のバックアップ」と「最新のデータ」を合体させて起動させれば何とかなるんじゃないか?という対処を考える

やった手順

  1. 壊れたサーバーのSnapshotをとってディスクAを作成する
  2. 2週間前のバックアップからディスクBを作成する
  3. Compute Engineのインスタンス(復旧くん)を新規に作成して、ディスクA/ディスクBをマウント
  4. 復旧くんの中でディスクA/optをディスクB/optにrsync
  5. 復旧君からディスクBを外す
  6. 壊れたサーバーの起動ディスクをディスクBに切り替える
  7. 起動

反省

  • sshから締め出されてもシリアルがあるから大丈夫だべ、と思って油断すると両方から締め出される
  • sudoするまえにバックアップを取ろう
  • メンテしたらちゃんと再起動とsshのログインは確かめよう
  • 2023年最大の冷や汗を体験した