別AZからEBSスナップショットをリストアする

クラウド

諸事情あって、AZ1にあるEBSスナップショットを、AZ2で起動中のEC2インスタンスにリストアする方法について調べました。
ググり方が悪いのか、以外と全体の流れ的なのは引っかからなかったので、備忘録しておきます。

やりたいこと

前提

  • マルチリージョン環境ではない(諸事情でシングルAZ運用を強いられているとする)
  • あるリージョン内に、「AZ1」と「AZ2」という2つのAZがあることとする
  • AZ1には本番環境のEC2インスタンスがデプロイされている
    • EC2インスタンスは基本的に常に動作中
    • 定期的にEBSをスナップショットしている
  • AZ2には検証環境のEC2インスタンスがデプロイされている
    • EC2インスタンスは必要な時だけスポット的に起動する
    • 本番環境のステージングとして使用している

想定要件

  • AZ1で動作中の本番環境でAZ障害が発生した場合は、EBSスナップショットをAZ2の検証環境でリストアし、AZ2の検証環境を本番環境に切り替えて運用を継続できること

それで?

想定要件が実現可能なのかを調査する。

結論

先に結論を言うと、たぶん可能です。

以下のような流れになります。

  • 前準備
    1. AZ1のEC2インスタンスのEBSについて、スナップショットを定期実行するように設定する
  • AZ切り替え実施方法
    1. AZ2で、AZ1のスナップショットをEBSボリュームとして作成する
    2. AZ2のEC2インスタンスのEBSを↑で作成したEBSボリュームにアタッチする

たぶんこれだけです。

説明

以下、処理の流れを備忘録として残します。

1. EBSスナップショットの定期実行の設定

リストアするためにはスナップショットがあることが前提になりますので、まずはスナップショットの実行についてです。

↓の記事を参考にさせてもらいました。

EBSスナップショットを定期実行する方法 - Qiita
はじめに本記事では、EBSスナップショットを定期実行する方法をご紹介します。この記事の内容を実装することで、EBSスナップショットを手動で行う必要がなくなるEBS内のデータのバックアップ(ス…
  1. EC2のメニューから「ライフサイクルポリシーを作成」を選択
  2. ポリシータイプを「EBSスナップショットポリシー」を選択
  3. 以下選択
    • ターゲットリソースタイプ:「ボリューム」
    • ターゲットリソースタグ:こちらにはいEBSボリュームにつけられてたタグを指定します。シンプルに、EBSに一意となる Name で名前付けし、名前指定しています
    • 説明:適当に何か入れる
    • IAMロール:「デフォルトロール」
    • ポリシーのステータス:「有効」 ←ここで有効にしておくと、すぐにスケジュールが有効になります(自動スナップショットが有効になるということ)
  4. 要件にあった条件を設定する
    • 頻度:「毎日」すると毎日スナップショットが作られます
    • 毎:たぶん何時間ごとにバックアップをするかという設定と思われます。「1時間」にすると1時間ごとに実行されていました。
    • 開始時刻:ややこしいですけど、ここで指定した時間からスナップショットが実行されます。たとえば、毎が「1時間」で開始時刻が「20:10」だと、UTC20時から1時間ごとに3回だけバックアップされる感じです。
      なお、UTCなので日本時間で「12:00」だと9時間引いて「03:00」にしないといけないです。ややこしいです
    • 保持タイプはとりあえず「カウント」で「3」にしとけば、3世代バックアップという感じになります
    • 高速スナップショット復元という機能は有料の機能・・・

以上でスナップショットのスケジュール設定は完了です。

2.別AZにあるスナップショットを使用して、EC2インスタンスにアタッチ&起動する

まず、仕様上の大前提があります。
理由は不明なのですが、別AZにあるスナップショットを使ったリストアはできません。

ERROR: The request could not be satisfied

どういうことかというと、AZ1で作成されたスナップショットをAZ2ではリストア対象として使用できないということです。
(何故なんだろう?スナップショット自体はS3に保管されているという認識なんだけど、S3はAZに依存しないようなサービスだった気が・・・ちょっとこの辺は理解が足りてないです。)

そのため、以下のような迂回戦略をとります。

  1. AZ1のスナップショットを、AZ2でEBSボリューム化する(←これはできる)
  2. 1.で作ったEBSボリュームを、AZ2のEC2インスタンスにアタッチする

ようは、一回EBSボリューム化すること対応するわけです。

2-1.別AZのEBSのスナップショットを、EBSボリューム化する

  1. あらかじめスナップショット対象(AZ1のEBSのスナップショット)のスナップショットIDを控えておきます
    • EC2のメニューから「スナップショット」を選択し、該当のスナップショットIDを控えておく
  2. EC2のメニューから「ボリューム」を選択し、「ボリュームの作成」を押す
  3. AZ2でボリュームを作成する
    • 「サイズ」はたぶんスナップショット元のものと同じ大きさにした方がいいと思います。たぶん
    • 「アベイラビリティゾーン」は、ここでは ap-northeast-1c を選択していますが、ここでいうAZ2に該当してると思ってください
    • 「スナップショットID」のところに、上記で控えて置いたスナップショットIDを入力します。入力してから1分くらい?クルクルエフェクトが表示されたのでちょっと重いかもです
    • 「KMSキー」とかはデフォルトのままでいいです
    • タグには、「Name」にわかりやすい名前を付けておくことをお勧めします(AZ1のスナップショットから作成したAZ2用のEBSボリュームがわかるように)

2-2.作成したEBSボリュームを、EC2インスタンスにアタッチする

  1. AZ2で動作させるためのEC2インスタンスが起動中であれば、いったん停止します
    • 「停止」が有効になっていないと、たぶん停止した瞬間にアタッチ中のEBSが消えちゃう気がするので注意が必要かもしれません
  2. AZ2で動作していたEC2インスタンスのデバイス名を控えておきます
    • ここでは /dev/xvda がデバイス名なので、これを控える
  3. AZ2で動作していたEC2インスタンスのEBSボリュームをでデタッチします
    • 上記でボリュームIDをクリックすると下記画面が表示されます
    • ボリュームを選択後、「アクション」からデタッチできます
  4. AZ2で動作していたEC2インスタンスに、AZ1のスナップショットから作成したボリュームをアタッチします
    • EC2メニューの「ボリューム」から、スナップショットから作成したAZ2のボリュームを選択し、「アクション」から「ボリュームのアタッチ」を選択する
  5. ボリュームのアタッチ対象にAZ2で起動していたEC2インスタンスを指定します
    • 「インスタンス」には、AZ2で起動していたEC2インスタンスを指定
    • 「デバイス名」には、控えて置いたデバイス名を入力する。今回だったら /dev/xvda
  6. AZ2のEC2インスタンスを開始します

以上で、AZ1で作成したスナップショットを使用して、AZ2で起動することができました。

コメント

タイトルとURLをコピーしました