スナップショットから作成した EBS ボリュームをマウントする

この記事では EBS ボリュームのスナップショットを、新しい EC2 インスタンスでマウントする方法について記述する。すでに EBS ボリュームのスナップショットは作成されていると仮定する。まだであれば、ひとつ前の記事を参照してほしい。

AWS コンソールでぽちぽちと新しい EC2 インスタンスを作成し、途中の “Add Storage” のプロセスで /dev/sdf 辺りに前述の記事で作成したスナップショットIDを使ってボリュームを追加するとしよう。

最終的に作成されたインスタンスに ssh でログインし、lsblk を実行すると次のように表示される。ブロックデバイスは認識されているものの、マウントされていないことがわかる。

## /dev/xvdf はアタッチされているが、マウントされていない (MOUNTPOINT が空)
## (lsblk の NAME は "/dev/" が省略される)
$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  512G  0 disk

## ちなみに xvdf は /dev/sdf のエイリアス
$ ls -l /dev/sdf
lrwxrwxrwx 1 root root 4 Jun 14 08:16 /dev/sdf -> xvdf

## /dev/xvdf にファイルシステムは存在することを確認する (ない場合は mkfs を使う)
$ sudo file -s /dev/xvdf
/dev/xvdf: Linux rev 1.0 ext4 filesystem data, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (needs journal recovery) (extents) (large files) (huge files)

マウントするためには、次の順で作業をすればよい。

  1. マウントポイントを作成する (今回の例では /data/mydata をマウントポイントとする)
  2. /etc/fstab を変更する
  3. mount -a/etc/fstab の内容を反映する

具体的には、こうだ。

## マウントポイントを作成する
$ sudo mkdir -p /data/mydata

## (再起動でリセットされない) 永続的なマウントを実現するため /etc/fstab を変更
$ sudo cp /etc/fstab /etc/fstab.orig
$ sudo vi /etc/fstab  # (次の行を追加: `/dev/xvdf /data/mydata ext4 defaults,nofail 0 2`)

## /etc/fstab の内容を反映する
$ sudo mount -a

/etc/fstab に書けるオプションは正直なところ、かなりややこしい。AWS オフィシャルのドキュメントに次のようにある。

(/etc/fstab の) この行の最後の 3 つのフィールドは、ファイルシステムのマウントオプション、ファイルシステムのダンプ頻度、起動時に実行されるファイルシステムチェックの順番です。これらの値がわからない場合は、例の値 (defaults,nofail 0 2) を使用してください。

素直に「例の値 (defaults,nofail 0 2)」を採用しても多くの場合は問題ないだろう。

参考記事

AWS CLI で EBS のスナップショットを作成する

この記事は AWS CLI で EBS のスナップショットを作成するためのメモだ。

正直なところ、何も難しいことはない。ボリューム ID が “vol-xxxxxxxx” の EBS ボリュームのバックアップを取るなら aws ec2 create-snapshot --volume-id vol-xxxxxxxx --description "My Backup" とすればいいだけだ。

ただし、create-snapshot はオプションが少なく、スナップショットの作成と同時にタグ付ができない。例えば、スナップショットの Name タグを “MySnapshot” とし、Cost を タグを “MyService” としたければ、create-tags コマンドを別に叩く必要がある。

create-snapshot は作成するスナップショットの情報を JSON で STDOUT に出力する。この JSON にはスナップショット ID の情報も含まれているので、次のようにすることで目的の処理を達成できる。

$ SnapshotId=$(aws ec2 create-snapshot --volume-id vol-xxxxxxx --description "MySnapshot") | jq -r .SnapshotId)
$ aws ec2 create-tags --resources $SnapshotId --tags Key=Cost,Value=MyService Key=Name,Value=MySnapshot

なお、AWS では EBS ボリュームのスナップショットを連続で作成した場合、後から作られるスナップショットは前回のスナップショットからの増分スナップショットになる。

Route 53 で Zone Apex を ELB に振り向けるときの設定

僕は mahata.org というドメインを所持している。

mahata.org のウェブサーバは ELB の背後にあり、mahata.org を名前解決した結果はこの ELB を指してほしい。これを実現するため AWS 固有の知識が必要だったので、後々のためにメモを残しておく。

直面した課題

Zone Apex とは「サブドメインを含まないドメイン名」を示す言葉である。例えば “www.mahata.org” は Zone Apex ではなく、 “mahata.org” は Zone Apex だ。

Amazon Route 53 では Zone Apex に対して CNAME の設定が許可されていない。mahata.org を ELB の CNAME にしたかったんだけど…。ELB の IP アドレスは動的に変わるので、mahata.org の A レコードを設定するのは筋が悪い。

さあ、どうしよう。

CNAME レコード以外の選択肢

少しぐぐった結果、Amazon Route 53 では ALIAS レコードという DNS レコードを設定できることがわかった。リンク先のオフィシャルドキュメントでは、CNAME レコードとの比較の中で「エイリアスリソースレコードセットは Zone Apex に作成できます」と明記されている。

これを使えばよさそうだ。

ALIAS レコードの設定

ALIAS レコードは限られた AWS リソースにしか設定できない。例えば ELB や CloudFront ディストリビューションなどが「限られた AWS リソース」である。

対象となる AWS リソースによってレコードの設定方法は少しずつ異なる。ALIAS レコードで ELB を指す場合は DNS 値の先頭に dualstack. を付ける。例えば dualstack.elb-example-0000000000.ap-northeast-1.elb.amazonaws.com. のような感じ。

具体的には Amazon Route 53 のコントロールパネルで次のようにする。

  1. Create Record Set をクリックする
  2. “Type: A” で “Alias” は “Yes” にチェックを入れる
  3. “Alias Target” に dualstack.elb-example-0000000000.ap-northeast-1.elb.amazonaws.com. のような値をセットする

これで Zone Apex が ELB を指せるようになる。