ルートボリュームをEBSスナップショットから復元したボリュームに設定する

記事タイトルとURLをコピーする

AWS CLIが好きなテクニカルサポート課の市野です。

ふと、AMIからの起動ではなく、既存のEBSスナップショットをルートボリュームにしてEC2インスタンスを設定することができたよな?と気になったので、構築・設定手順の確認と整理をしてみました。

手順概要

大まかな手順は以下のようになります。

  1. スナップショットからボリュームを作成
  2. 復元用インスタンスの作成
  3. 復元用インスタンスの停止
  4. 復元用EC2インスタンス 作成時のルートボリュームのデタッチ
    (ルートデバイス名の確認が必要です。)
  5. 復元用EBSボリュームを復元用EC2インスタンスへのアタッチ
    (<4>で確認したルートデバイス名と同一になるようにアタッチする必要があります。)
  6. 起動してインスタンス内部を確認

注意事項

スナップショットから作成するボリュームと、復元用インスタンスは同一のアベイラビリティーゾーンに存在する必要があります。

事前設定・前提

# 変数設定:EBSスナップショット タグ値
EBS_SNAPSHOT_TAG=snapshot-for-restore

# 変数設定:アベイラビリティーゾーン
AVAILABILITY_ZONE={任意のAZに置き換える。ただしEBSとEC2で同一でなければならない}

# 変数設定:復元用EBSボリューム タグ値
RESTORE_VOLUME_TAG_VALUE=volume-for-restore

# 変数設定:復元用インスタンス用セキュリティグループID
SECURITY_GROUP_ID={実際の値に置き換える}

# 変数設定:復元用インスタンス 配置サブネットID
SUBNET_ID={実際の値に置き換える}

# 変数設定:復元用インスタンス インスタンスタイプ
INSTANCE_TYPE={希望するインスタンスタイプ名に置き換える}

# 変数設定:復元用インスタンス タグ値
INSTANCE_TAG_VALUE=instance-for-restore

# 変数設定:復元用インスタンス 起動AMIイメージID
# Windows_Server-2019-Japanese-Full-Base-2022.02.10 を利用
IMAGE_ID=ami-00c6ac4d74a75d670

# 変数設定:復元用インスタンス キーペア名
KEY_NAME={実際の値に置き換える}

なお、以降の手順においての前提として、EBSスナップショット、復元用EBSボリューム、復元用インスタンスの各タグはAWS環境内で一意であるものとしています。

手順詳細(AWS CLIによる手順)

1. スナップショットからボリュームを作成

復元対象のスナップショットIDの取得

EBS_SNAPSHOT_ID=$(aws ec2 describe-snapshots \
 --filters Name=tag:Name,Values=${EBS_SNAPSHOT_TAG} \
 --query "Snapshots[].SnapshotId" \
 --output text) \
 && echo ${EBS_SNAPSHOT_ID}

復元用 EBSボリュームの作成と待機

aws ec2 create-volume \
  --availability-zone ${AVAILABILITY_ZONE} \
  --snapshot-id ${EBS_SNAPSHOT_ID} \
  --tag-specifications "ResourceType=volume,Tags=[{Key=Name,Value=${RESTORE_VOLUME_TAG_VALUE}}]" && \
  aws ec2 wait volume-available \
    --filters Name=tag:Name,Values=${RESTORE_VOLUME_TAG_VALUE}

復元用 EBSボリューム IDの取得

VOLUME_ID_FOR_RESTORE=$(aws ec2 describe-volumes \
  --filters Name=tag:Name,Values=${RESTORE_VOLUME_TAG_VALUE} \
  --query "Volumes[].VolumeId" \
  --output text) \
  && echo ${VOLUME_ID_FOR_RESTORE}

2. 復元用インスタンスの作成と待機

ここでは最低限のパラメータの設定のみ実施しています。
適宜ユースケースに合わせて設定が必要です。

aws ec2 run-instances \
  --instance-type ${INSTANCE_TYPE} \
  --security-group-ids ${SECURITY_GROUP_ID} \
  --subnet-id ${SUBNET_ID} \
  --image-id ${IMAGE_ID} \
  --key-name ${KEY_NAME} \
  --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${INSTANCE_TAG_VALUE}}]" && \
  aws ec2 wait instance-running \
    --filters Name=tag:Name,Values=${INSTANCE_TAG_VALUE}

3. 復元用インスタンスの停止

復元用EC2インスタンスIDの取得

INSTANCE_ID=$(aws ec2 describe-instances \
  --filters Name=tag:Name,Values=${INSTANCE_TAG_VALUE} \
  --query "Reservations[].Instances[].InstanceId" \
  --output text) \
  && echo ${INSTANCE_ID}

復元用EC2インスタンスの停止と待機

aws ec2 stop-instances \
  --instance-ids ${INSTANCE_ID} && \
aws ec2 wait instance-stopped \
  --instance-ids ${INSTANCE_ID}

4. 復元用EC2インスタンス 作成時のルートボリュームのデタッチ

復元用EC2インスタンス ルートデバイス名(/dev/sda1 等)の取得

ROOT_DEVICE_NAME=$(aws ec2 describe-instances \
  --filters Name=tag:Name,Values=${INSTANCE_TAG_VALUE} \
  --query "Reservations[].Instances[].RootDeviceName" \
  --output text) \
  && echo ${ROOT_DEVICE_NAME}

復元用EC2インスタンス 作成時のルートボリュームIDの取得

VOLUME_ID_FOR_DETACH=$(aws ec2 describe-instances \
  --filters Name=tag:Name,Values=${INSTANCE_TAG_VALUE} \
  --query "Reservations[].Instances[].BlockDeviceMappings[?DeviceName==\`${ROOT_DEVICE_NAME}\`].Ebs.VolumeId" \
  --output text) \
  && echo ${VOLUME_ID_FOR_DETACH}

復元用EC2インスタンス 作成時のルートボリュームのデタッチ

aws ec2 detach-volume \
  --instance-id ${INSTANCE_ID} \
  --volume-id ${VOLUME_ID_FOR_DETACH}

なお、本手順では割愛していますが、復元用EC2インスタンス作成時のルートボリュームは、不要であれば削除等が必要です。

5. 復元用EBSボリュームを復元用EC2インスタンスへのアタッチ

aws ec2 attach-volume \
  --device ${ROOT_DEVICE_NAME} \
  --instance-id ${INSTANCE_ID} \
  --volume-id ${VOLUME_ID_FOR_RESTORE}

6. 復旧用EC2インスタンスの起動

aws ec2 start-instances \
  --instance-ids ${INSTANCE_ID} && \
aws ec2 wait instance-running \
  --instance-ids ${INSTANCE_ID}

手順詳細(AWSマネジメントコンソールによる手順)

AWSマネジメントコンソールの画面が変わる可能性がありますが、GUIで行う場合の手順は以下の通りです。

1. スナップショットからボリュームを作成

2. 復元用インスタンスの作成

EC2インスタンスの設定項目は、ユースケースに合わせて適宜設定していただく必要がありますが、作成するボリュームとEC2インスタンスのアベイラビリティーゾーンを合わせる必要があります。

3. 復元用インスタンスの停止

ボリュームを入れ替えるために、一度復元用インスタンスを停止します。

4. 復元用EC2インスタンス 作成時のルートボリュームのデタッチ

インスタンスを構築時に自動的にアタッチされているルートボリュームをデタッチします。  

また、デタッチ前に、該当のインスタンスの「ストレージ」タブ内で、ルートデバイス名の確認をしておきます。

なお、本手順では割愛していますが、このボリュームも明示的に削除する必要があります。

5. 復元用EBSボリュームを復元用EC2インスタンスへのアタッチ

復元用EC2インスタンスを選択し、デバイス名を<4>で確認したデバイス名として、アタッチします。

6. 起動してインスタンス内部を確認

あとは、インスタンスに接続して目的の確認を実施することが可能です。

ユースケースについて

  • /home ディレクトリが読み込めなくなって、インスタンスに接続できなくなった。
  • IPアドレスの変更が起こらないよう、インスタンスは使いまわしたい。

などの時に使えるかもしれませんね。ではまた。