ルートボリュームを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アドレスの変更が起こらないよう、インスタンスは使いまわしたい。

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

市野 和明 (記事一覧)

マネージドサービス部・テクニカルサポート課

お客様から寄せられたご質問や技術検証を通じて得られた気づきを投稿していきます。

情シスだった前職までの経験で、UI がコロコロ変わる AWS においては GUI で手順を残していると画面構成が変わってしまって後々まごつくことが多かった経験から、極力変わりにくい AWS CLI での記事が多めです。

X(Twitter):@kazzpapa3(AWS Community Builder)